:clap: 本系列持續更新中,歡迎關注:https://github.com/wi1dcard/laravel-deployment。
由於課程上下文關聯比較緊密,在開始前請先閱讀 本文。
你的支援是我寫作的動力;關注我的客官們,請在右上角點個贊,將會讓文章在首頁展示,幫助更多人。
感謝 :clap: !
在之前的小節中,我們使用 Git + HTTPS 協議將程式碼部署伺服器上;但每次都輸入密碼既不方便,也不利於後續開展部署自動化。更加普遍的做法是使用 SSH 協議,並將伺服器的公鑰配置到 GitHub(或其它託管平臺)倉庫的部署公鑰內。相比普通個人公鑰,部署公鑰通常不具備推送許可權(只讀),因此更加安全可靠。
提示:關於更多部署金鑰的介紹,可查閱 GitHub 文件。
Git 部署公鑰
首先登入到伺服器,執行以下命令:
$ ssh-keygen -t rsa -C "wi1dcard.cn@gmail.com"
沒錯,這正是上一小節中所提到的生成金鑰對命令,請將 wi1dcard.cn@gmail.com
替換為自己的郵箱地址。整體流程基本一致,此處不再贅述。
接著,使用以下命令輸出公鑰:
$ cat ~/.ssh/id_rsa.pub
輸出類似:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDpTg16xxOTKZ5XruajPtMhwLE+GFk+Kei1xFPJ65rRItXWgDxUEYE4WM81BnVhryjyJ2YtnvaYhqnxnBIqTuRxjg33dLLShizcx9UNhpZyiA6cHchqEyzWPvkpQzTOh7h4cP730XB2hKUkxkYwt0kjhHbsqRu+FAq81k/YTqDF2V+wuxQaIijO7sf4kPrazH7VJQuOvvMkcUKHzGGse/0V65nNzGi5R7BkIH5FANz9aYrL4tU0wtdHUDLnQ9Q9/nWYYFFl7NdC2oUrtNGKTb0gWe/rv1spSx8072kehKJtD2DJghP23yuBDUgxQL2F9aTDlac45MzJ3aueImPOxGYF wi1dcard.cn@gmail.com
複製這段公鑰文字備用。
以 GitHub 為例,在瀏覽器內開啟倉庫主頁,選擇右側的 Settings 標籤頁;點選左側的側邊欄中的 Deploy keys,接著點選右上角的 Add deploy key 按鈕:
提示:其它 Git 託管平臺操作類似,可搜尋類似
GitLab deploy keys
等關鍵詞查詢對應文件。
在 Title 內給公鑰起個名字;在 Key 中貼上剛剛複製的公鑰文字,例如:
注意:除非必要,頁面下方 Allow write access 核取方塊請勿選中,否則該金鑰將具備推送許可權。另外,金鑰儲存後無法修改,如需變更只能重新建立,因此務必確保命名規範、公鑰無誤。
隨後,點選 Add key 按鈕即可新增成功,如圖:
再次回到倉庫主頁,複製 SSH 協議的 Git 倉庫地址備用:
更新與回滾
由於完全基於 Git 部署,因此我們可以「站在巨人的肩膀上」—— 借用 Git 的 reset
功能實現更新、回滾到任意提交。
首先,在伺服器中執行以下命令,將檔案所有者設定為我們手動建立的新使用者:
$ su root -c 'chown -R deployer /var/www/deployment'
將遠端的 HTTPS 協議地址修改為 SSH 協議地址:
$ cd /var/www/deployment
$ git remote set-url origin 'git@github.com:wi1dcard/hello-deployment.git'
其中,git@github.com:wi1dcard/hello-deployment.git
請替換為剛剛複製的倉庫地址。
接下來,使用 git fetch
命令獲取遠端狀態(但不拉取到本地):
$ git fetch -t -v
其中,-t
代表除提交歷史外,同時獲取標籤(Tags);-v
代表開啟 Verbose Mode,直譯為「囉嗦模式」,通常表示輸出更多詳細資訊。
提示:
-v
選項不僅可用於git fetch
;在其它 Git 操作、甚至許多 Unix 命令中,都用於表示開啟囉嗦模式。
稍等片刻,你可能會看到這樣的輸出:
The authenticity of host 'github.com (13.250.177.223)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?
還記得第一次登入伺服器時的提示嗎?與此處的詢問相同,輸入 yes
即可。
如果伺服器上的 Git 倉庫與 GitHub 上的倉庫不存在差異,那麼輸出將會類似:
From github.com:wi1dcard/hello-deployment
= [up to date] master -> origin/master
如果 GitHub 上存在更新的提交,那麼輸出將會類似:
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 1), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:wi1dcard/hello-deployment
602fa83..9a69730 master -> origin/master
此時,本地已經得到了遠端的提交歷史資訊;盡情使用 git reset
命令隨意更新或回滾吧。
例如:
-
穿越到遠端 master 分支的倒數第一次提交(即最新提交),通常用於更新至最新程式碼。
$ git reset --hard origin/master
-
穿越到遠端 master 分支倒數第三次提交,通常用於回滾一部分錯誤提交。
$ git reset --hard origin/master~2
-
穿越到 ID 為 602fa83 的提交,通常用於回滾到特定版本。
$ git reset --hard 602fa83
- 同理,亦可回滾至任意本地分支、標籤、HEAD 等...
注意:
origin/master~2
實際上是表示origin/master
的首個父提交的首個父提交,多數情況下可理解為倒數第三次提交,但這兩個概念並不相等。有興趣請閱讀 Git 相關書籍,此處不再展開。
最後,由於國內網路環境的特殊性,執行以上 Git 命令可能稍有卡頓,若專案較大則更加明顯,可嘗試 Gitee 等國內平臺,雖然功能不如 GitLab 強大,生態不如 GitHub 完善,但至少... 速度飛快。