從繁瑣中解脫
學過 Go 但我是 Php 開發者,為了活下去,自己的 Go 專案都快夭折了,而且 連 Go 的語法都快忘記了,索性就從現在開始,第 N 次再次開啟自己的 Go 專案。第一件事,配置好一個好的開發環境,實現程式碼
push
後能看到效果,這個時候就要配置 WebHook。
最開始情況
使用 Nginx 監聽, 轉發到 Go 程式埠:
server{
listen 443 ssl;
server_name *.other.com other.com;
// 略:其它配置 other
location / {
proxy_pass http://127.0.0.1:8080;
}
}
目標
當程式碼
push
到 Git 伺服器,實現自動部署。
實現方式
通過 Go 提供的
os/exec
呼叫 bash 指令碼
bash 檔案程式碼
# 到專案目錄,執行 pull
cd /usr/local/www/other/
git pull
# 找到程式程式
arr=($(netstat -ltnp | grep 8080))
pidstr=${arr[6]}
pidid=(${pidstr//\// })
pidid=${pidid[0]}
# 幹掉程式,然後重新執行
(kill $pidid|go run main.go&)
1.建立一個新的 Go 程式,用來更新 主專案,Go 程式碼更新需要重新執行,如果在原有專案做這件事,會進行不下去:
// 在原有專案做會出現的情況:
func Pull () string {
command := "./pull.bash"
cmd := exec.Command("/bin/bash", "-c", command)
// 略 Other Code
// 永遠也不可能執行到這裡來
// bash 這條命令 (kill $pidid|go run main.go&)
// 會殺掉現在的程式,程式直接結束了,不可能執行後面的 go run main.go &
return "Success"
}
-
我想直接通過現有專案的連線來實現訪問更新程式碼的程式:
// 這裡我省略了「更新程式」的程式碼 因為思路和上面程式碼一樣 func (m *MyController) PostPull() string { http.Get("http://localhost:1414/git/pull") return "Success" // 這裡程式碼是執行不到的,但習慣讓我寫了! }
-
到 Git 服務平臺,新增上鉤子。
鉤子會報 502 錯誤,因為我們在部署的時候,殺掉了它的程式。本來有圖片,不過上傳不了。只要不是 200 狀態,我所用的 Git 服務平臺是不會觸發。
-
解決 502 錯誤,設定 Nginx 502 返回 200:
server{ listen 443 ssl; server_name *.other.com other.com; // 略 Ohter code location / { proxy_pass http://127.0.0.1:8080; // 攔截 伺服器錯誤 error_page 502 503 504 =200 /dealwith_caixuku; } // 攔截並給它 200 location /dealwith_caixuku{ set $ret_body '{"code": "200","msg": "hello world"}'; return 200 $ret_body; } }
- 至此,收工!
總結
- 使用
exec.Command("/bin/bash", "-c", bash_file_path)
這個指令碼開頭千萬不要加#!/bin/bash
,會報 shell 126 錯誤。 - 有想法,就去實現,做了才會有果,不做啥也沒有,而且……還老了!
- 本人能力有限,希望我走過的路,能給有類似需求的朋友提供參考。