透過 GitHub Webhook 讓你 push code 到 Github 就會自動觸發本地 Jenkins Pipeline

Jo-Yu Liao
8 min readAug 11, 2020

簡介如何用 ngrok 讓 Github Webhook 觸發本地 Jenkins Pipeline

image source: google

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

目錄:

  1. 安裝並啟動 ngrok 讓本地 Jenkins map 到 ngrok 的 domain
  2. 在 Github 新增的 Webhook 並填入 ngrok 的 domain 測試是否能觸發 Jenkins
  3. 新增 Jenkins Pipeline 讓 Github Webhook 在 push code 後自動觸發 Jenkins

一、安裝並啟動 ngrok 讓本地 Jenkins map 到ngrok 的 domain

image source: https://www.twilio.com/blog/2015/09/6-awesome-reasons-to-use-ngrok-when-testing-webhooks.html

後端開發的時候,有時候需要將 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 協議):

ngrok

二、在 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」

Github hook trigger for GITScm polling

Configure — Pipeline:

選取「Pipeline Script」然後將下面的測試 code 貼近去,完成後選取 Apply。

properties([pipelineTriggers([githubPush()])])node {
git url: '<你的 github repository URL>',
branch: '<你希望觸發的 branch,比方說 master>'
}
Pipeline

好了後,先點選「Build Now」測試一下,如果不手動 build 一次會失敗:

Build Now

如果 build 沒問題,就可以 push commit 到 Github 看有沒有觸發囉!

triggered by Github

如果要 debug,可以看看 GitHub Hook Log 是否有 push event 的紀錄,如果有,可能是 Jenkins 設定的問題,如果沒有,就是 GitHub Webhook 沒有 trigger Jenkins。

GitHub Hook Log

下一篇會分享如何撰寫 Jenkinsfile (撰寫 ing,完成會更新連結)~

--

--