需求場景
自己寫了個項目。爲小程序提供後端。以前都是用nodejs自己寫工具的。前陣子通過同事瞭解到 git 有一些 hook 可以幫我們做這些操作,更合理和方便。用了 git hook 可以實現提交代碼之後自動在服務器上部署。而不用手動去做一些操作。所以就查閱學習了一波。
需求分析
實現上述需求大概思路是,在 push 代碼的時候用回調一個腳本或者方法來執行一些部署的操作。其中可以用 git 的 post-receive
這個 hook 來實現 push 完的時候,調用 shell 腳本。
也可以用 git webhook 在 push
完成的時候調用一個接口。然後自己寫個部署的工具,對外暴露一個部署接口,提供給 git webhook 來調用。
我自己用了 gogs。如果在界面中操作的話就是如下兩張圖:
在項目的 Settings 中找到 webhooks ,然後輸入對外的 payload url 即可。
或者在項目的 Settings 中找到 git hooks,然後編輯 post-receive
然後,就出現了 shell 腳本輸入的界面。
具體實現細節
梳理了大概的思路,下面就是做。雖然圖形界面操作方便,但是經過查閱資料發現,直接在git項目中創建 git hooks 更方便。具體細節如下:
進入項目目錄,找到 hooks 目錄。然後看到如下目錄結構
默認可能不存在 post-receive 這個文件,我們可以複製一份 post-receive.sample 文件重命名爲 post-receive。
然後再 post-receive 文件中寫一些部署操作的 shell 腳本就可以了。
當前,我的項目是一個後端項目。所以首先,我們需要把本項目文件直接 clone 到服務器的一個目錄下 命令如下:
sudo git --work-tree=/目標目錄 --git-dir=/通常是.git結尾的項目目錄 checkout -f
根據實際情況就改成自己的目錄結構即可。
其次,我們需要 npm install 然後再 npm run build,而且,npm run build 還應該在 npm install 執行完畢之後再執行。所以命令如下:
npm install && npm run build
當然,如果我們需要使用 pm2 ,直接在 package.json 中定義 build script 如下即可:
接着我們會發現,當前用戶可能是git用戶在調用 shell 腳本。所以我們要先切換用戶。shell 裏邊切換用戶怎麼寫呢?方法如下:
sudo su - root <<EOF
命令1;
命令2;
EOF
注意,su 後邊有個 - ,不加這個短橫線代表直接切換用戶了。中間寫我們要切換用戶後執行的命令就可以了。
好了,貼出整個腳本來show一下:
然後保存文件後,在本地提交下代碼試一下,齊活,正常重新部署了。
其他
這個折騰的過程中,發現一些比較實用的 linux 命令,這裏再強化下咯:
whoami
我是誰
whereis node
查找 node 在哪