輕鬆部署 Laravel 應用 | 《13. 更新與回滾》

Wi1dcard發表於2019-03-25

: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 完善,但至少... 速度飛快。

我感謝自己平凡,敢愛敢恨沒負擔。
我感謝自己不凡,可愛可恨都包攬。

相關文章