透過 GitHub Webhook 讓你 push code 到 Github 就會自動觸發本地 Jenkins Pipeline
簡介如何用 ngrok 讓 Github Webhook 觸發本地 Jenkins Pipeline
Jenkins 版本:2.190.1 (2019–09–25)
本篇會介紹如何 push commit 到 Github 後自動觸發本地 Jenkins Pipeline 執行 CI/CD。假定讀者已經安裝並初始化好 Jenkins ,如果沒有可以又希望用 Docker 起的話,可參考 用 Docker 安裝 CI 工具 Jenkins,如果希望用 EC2 起 Jenkins 可參考:Set Up a Jenkins Build Server。其他可參考:Jenkins download and deployment
目錄:
- 安裝並啟動 ngrok 讓本地 Jenkins map 到 ngrok 的 domain
- 在 Github 新增的 Webhook 並填入 ngrok 的 domain 測試是否能觸發 Jenkins
- 新增 Jenkins Pipeline 讓 Github Webhook 在 push code 後自動觸發 Jenkins
一、安裝並啟動 ngrok 讓本地 Jenkins map 到ngrok 的 domain
後端開發的時候,有時候需要將 local server 提供給外部使用,如果是要測試 webhook、或是提供 redirect URL 給第三方 API,就可能要提供 domain、支持 https 協議。如果要這樣,就需要將服務部署到機房或是用 AWS API Gateway 處理,這會讓開發過程變得麻煩且耗時。這時候可以用 ngrok 做 reverse proxy,把本地的 port 映射到一個 public 地址,就能讓外部能夠透過 public 地址連到本地的服務囉!
ngrok 的安裝方式很簡單,先去網站註冊一個免費帳號下載對應的 zip 檔,然後 unzip 檔案後 cd 到檔案
unzip /path/to/ngrok.zip
cd /path/to/解壓縮後的檔案
並複製帳號的 token,執行下面指令連接到你的帳號:
./ngrok authtoken <你的 token>
然後再執行下面指令就可以將本地的 port map 到 ngrok 提供的 domain 囉!(付費版支持客製化 domain)
./ngrok http <你的 port>
比方說我的 Jenkins port 是 8080,就可以透過指令生成 ngrok 的 domain (支持 https 協議):
二、在 Github 新增的 Webhook 並填入 ngrok 的 domain 測試是否能觸發 Jenkins
有了 domain 就可以到 GitHub 新增 Webhook 來觸發 Jenkins 了!
首先登入到 GitHub,點選你希望更新時能透過 GitHub Webhook 觸發 Jenkins 的 Repository,點選 Settings 選取 Webhooks,再點選「add webhook」後輸入 <你的 Jenkins URL (本篇用 https:// 加上 ngrok 提供的 domain)>/github-webhook/,如:https://a5996b3600c6.ngrok.io/github-webhook/
點「Add webhook」後,GitHub 會 ping 你提供的 URL 是否返回 200,如果失敗,可以點進 webhook,滑到最下面查看 Recent Deliveries 的紀錄,在 debug 後重新 deliver 一次。
三、新增 Jenkins Pipeline 讓 Github Webhook 在 push code 後自動觸發 Jenkins
完成後可以到 Jenkins 新增 Pipeline 測試一下囉!Jenkins Pipeline 是 Jenkins 提供的 Plugin,讓 CI/CD 的過程可以透過 Groovy 程式碼和 Pipeline 語法實現,完成從 repository 到測試到部署整個過程皆自動化的流水線。
首先在 Jenkins 首頁點選「New Item」:
然後選 Pipeline 輸入你想取的名字,完成後會到 Pipeline 的 configure 畫面:
Configure — General:
勾選「GitHub project」然後貼上你的 GitHub Repository URL
Configure — Build Triggers:
選取「GitHub hook trigger for GITScm polling」
Configure — Pipeline:
選取「Pipeline Script」然後將下面的測試 code 貼近去,完成後選取 Apply。
properties([pipelineTriggers([githubPush()])])node {
git url: '<你的 github repository URL>',
branch: '<你希望觸發的 branch,比方說 master>'
}
好了後,先點選「Build Now」測試一下,如果不手動 build 一次會失敗:
如果 build 沒問題,就可以 push commit 到 Github 看有沒有觸發囉!
如果要 debug,可以看看 GitHub Hook Log 是否有 push event 的紀錄,如果有,可能是 Jenkins 設定的問題,如果沒有,就是 GitHub Webhook 沒有 trigger Jenkins。
下一篇會分享如何撰寫 Jenkinsfile (撰寫 ing,完成會更新連結)~