用 Go 做了一個 Git WebHook 鉤子 實現自動部署

bigbug發表於2019-05-11

從繁瑣中解脫

學過 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"
 }
  1. 我想直接通過現有專案的連線來實現訪問更新程式碼的程式:

    // 這裡我省略了「更新程式」的程式碼 因為思路和上面程式碼一樣
    func (m *MyController) PostPull() string {
    http.Get("http://localhost:1414/git/pull")
    return "Success" // 這裡程式碼是執行不到的,但習慣讓我寫了!
    }
  2. 到 Git 服務平臺,新增上鉤子。

    鉤子會報 502 錯誤,因為我們在部署的時候,殺掉了它的程式。本來有圖片,不過上傳不了。只要不是 200 狀態,我所用的 Git 服務平臺是不會觸發。

  3. 解決 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;
        }
    }
  4. 至此,收工!

總結

  • 使用 exec.Command("/bin/bash", "-c", bash_file_path) 這個指令碼開頭千萬不要加 #!/bin/bash,會報 shell 126 錯誤。
  • 有想法,就去實現,做了才會有果,不做啥也沒有,而且……還老了!
  • 本人能力有限,希望我走過的路,能給有類似需求的朋友提供參考。

世界真大,想讓世界看看我!

相關文章