教學課程:使用 GitHub 和 Docker 建立 Jenkins 管線

重要

許多 Azure 服務都有 Jenkins 外掛程式。截至 2024 年 2 月 29 日,其中部分外掛程式將不支援。 Azure CLI 目前是整合 Jenkins 與 Azure 服務的建議方式。 如需詳細資訊,請參閱適用於 Azure 的 Jenkins 外掛程式一文

若要將應用程式開發的建置和測試階段自動化,您可以使用持續整合和部署 (CI/CD) 管線。 在本教學課程中,您會在 Azure VM 上建立 CI/CD 管線,包括如何:

  • 建立 Jenkins VM
  • 安裝和設定 Jenkins
  • 建立 GitHub 與 Jenkins 之間的 Webhook 整合
  • 從 GitHub 認可建立和觸發 Jenkins 建置作業
  • 為您的應用程式建立 Docker 映像
  • 確認 GitHub 認可建置新的 Docker 映像和執行中應用程式的更新

本教學課程使用 Azure Cloud Shell 內的 CLI,其會持續更新為最新版本。 若要開啟 Cloud Shell,請從任何程式代碼區塊頂端選取 [試用]。

如果您選擇在本機安裝和使用 CLI,本教學課程會要求您執行 Azure CLI 2.0.30 版或更新版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱 安裝 Azure CLI

建立 Jenkins 實例

在上一個如何在第一次開機時自定義 Linux 虛擬機的教學課程中,您已瞭解如何使用 cloud-init 將 VM 自定義自動化。 本教學課程使用 cloud-init 檔案在 VM 上安裝 Jenkins 和 Docker。 Jenkins 是熱門的開放原始碼自動化伺服器,可順暢地與 Azure 整合,以啟用持續整合 (CI) 和持續傳遞 (CD)。 如需有關如何使用 Jenkins 的更多教學課程,請參閱 Azure 中樞中的 Jenkins。

在您的目前殼層中,建立名為 cloud-init-jenkins.txt 的檔案,並貼上下列設定。 例如,在 Cloud Shell 中建立檔案,而不是在您的本機電腦上。 輸入 sensible-editor cloud-init-jenkins.txt 以建立檔案,並查看可用的編輯器清單。 請確定已正確複製整個 cloud-init 檔案,特別是第一行:

#cloud-config
package_upgrade: true
write_files:
  - path: /etc/systemd/system/docker.service.d/docker.conf
    content: |
      [Service]
        ExecStart=
        ExecStart=/usr/bin/dockerd
  - path: /etc/docker/daemon.json
    content: |
      {
        "hosts": ["fd://","tcp://127.0.0.1:2375"]
      }
runcmd:
  - apt install openjdk-8-jre-headless -y
  - wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
  - sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
  - apt-get update && apt-get install jenkins -y
  - curl -sSL https://get.docker.com/ | sh
  - usermod -aG docker azureuser
  - usermod -aG docker jenkins
  - service jenkins restart

您必須先使用 az group create 建立資源群組,才能建立 VM。 下列範例會在 eastus 位置建立名為 myResourceGroupJenkins 的資源群組:

az group create --name myResourceGroupJenkins --location eastus

現在使用 az vm create 建立 VM。 --custom-data使用 參數來傳入 cloud-init 組態檔。 如果您將檔案儲存在目前的工作目錄之外,請提供 cloud-init-jenkins.txt 的完整路徑

az vm create --resource-group myResourceGroupJenkins \
    --name myVM \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init-jenkins.txt

建立和設定 VM 需要幾分鐘的時間。

若要允許 Web 流量連線到您的 VM,請使用 az vm open-port 來開啟 Jenkins 流量的埠 8080 ,以及用來執行範例應用程式的 Node.js 應用程式埠 1337

az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 8080 --priority 1001
az vm open-port --resource-group myResourceGroupJenkins --name myVM --port 1337 --priority 1002

設定 Jenkins

若要存取 Jenkins 實例,請取得 VM 的公用 IP 位址:

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv

基於安全性考慮,您必須輸入 VM 上儲存在文字檔中的初始系統管理員密碼,以啟動 Jenkins 安裝。 使用上一個步驟中取得的公用IP位址,透過SSH連線到您的 VM:

ssh azureuser@<publicIps>

使用 命令確認 Jenkins 正在執行 service

$ service jenkins status
● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: active (exited) since Tue 2019-02-12 16:16:11 UTC; 55s ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 0 (limit: 4103)
   CGroup: /system.slice/jenkins.service

Feb 12 16:16:10 myVM systemd[1]: Starting LSB: Start Jenkins at boot time...
...

initialAdminPassword檢視 Jenkins 安裝的 ,並複製它:

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

如果檔案尚無法使用,請稍候幾分鐘,讓 cloud-init 完成 Jenkins 和 Docker 安裝。

現在開啟網頁瀏覽器並移至 http://<publicIps>:8080。 完成初始 Jenkins 設定,如下所示:

  • 選擇 [ 選取要安裝的外掛程式]
  • 在頂端的文字框中搜尋 GitHub 。 核取 GitHub方塊,然後選取 [安裝]
  • 建立第一個系統管理員使用者。 輸入使用者名稱,例如 系統管理員,然後提供您自己的安全密碼。 最後,輸入完整名稱和電子郵件位址。
  • 選取 [ 儲存並完成]
  • 一旦 Jenkins 準備就緒,請選取 [ 開始使用 Jenkins]
    • 如果您的網頁瀏覽器在開始使用 Jenkins 時顯示空白頁面,請重新啟動 Jenkins 服務。 從 SSH 工作階段輸入 sudo service jenkins restart,然後重新整理網頁瀏覽器。
  • 如有需要,請使用您建立的用戶名稱和密碼登入 Jenkins。

建立 GitHub Webhook

若要設定與 GitHub 的整合,請從 Azure 範例存放庫開啟 Node.js Hello World 範例應用程式 。 若要將存放庫分叉至您自己的 GitHub 帳戶,請選取 右上角的 [分支 ] 按鈕。

在您建立的分支內建立 Webhook:

  • 選取 [設定],然後選取左側的 [Webhook]。
  • 選擇 [新增 Webhook],然後在篩選方塊中輸入 Jenkins
  • 針對 [ 承載 URL],輸入 http://<publicIps>:8080/github-webhook/。 請確定您包含尾端 /
  • 針對 [內容類型],選取 application/x-www-form-urlencoded
  • 針對 您要觸發此 Webhook 的事件?,選取 [僅推送事件]。
  • 將 [作用中] 設定為已核取。
  • 按兩下 [ 新增 Webhook]。

Add GitHub webhook to your forked repo

建立 Jenkins 作業

若要讓 Jenkins 回應 GitHub 中的事件,例如認可程式代碼,請建立 Jenkins 作業。 使用您自己的 GitHub 分支 URL。

在 Jenkins 網站中,從首頁選取 [建立新作業 ]:

  • 輸入 HelloWorld 作為作業名稱。 選擇 [Freestyle 專案],然後選取 [ 確定]。
  • 在 [ 一般] 區段下,選取 [GitHub 專案 ],然後輸入您的分支存放庫 URL,例如 https://github.com/cynthn/nodejs-docs-hello-world
  • 在 [ 原始程式碼管理 ] 區段底下,選取 [Git],輸入您的分支存放庫 .git URL,例如 https://github.com/cynthn/nodejs-docs-hello-world.git
  • 在 [ 建置觸發程式 ] 區段底下,選取 [GITHub 攔截觸發程式] 以進行 GITscm 輪詢
  • 在 [ 建置] 區段下,選擇 [ 新增建置步驟]。 選取[ 執行殼層],然後在命令視窗中輸入 echo "Test"
  • 選取作業視窗底部的 [ 儲存 ]。

測試 GitHub 整合

若要測試 GitHub 與 Jenkins 整合,請在分支中認可變更。

回到 GitHub Web UI,選取分支存放庫,然後選取 index.js 檔案。 選取鉛筆圖示以編輯此檔案,讓第 6 行讀取:

response.end("Hello World!");

若要認可您的變更,請選取底部的 [ 認可變更 ] 按鈕。

在 Jenkins 中,新組建會在作業頁面左下角的 [建置歷程記錄] 區段下開始。 選擇組建編號連結,然後選取 左側的控制台輸出 。 您可以從 GitHub 提取程式代碼時檢視 Jenkins 採取的步驟,而建置動作會將訊息 Test 輸出至主控台。 每次在 GitHub 中認可時,Webhook 都會觸達 Jenkins,並以這種方式觸發新的組建。

定義 Docker 組建映像

若要查看以 GitHub 認可為基礎的 Node.js 應用程式,請建置 Docker 映射以執行應用程式。 映像是從 Dockerfile 建置的,其會定義如何設定執行應用程式的容器。

從您 VM 的 SSH 連線,變更為以您在上一個步驟中建立的作業命名的 Jenkins 工作區目錄。 在此範例中,名為 HelloWorld

cd /var/lib/jenkins/workspace/HelloWorld

在此工作區目錄中建立檔案,並 sudo sensible-editor Dockerfile 貼上下列內容。 請確定已正確複製整個 Dockerfile,特別是第一行:

FROM node:alpine

EXPOSE 1337

WORKDIR /var/www
COPY package.json /var/www/
RUN npm install
COPY index.js /var/www/

此 Dockerfile 會使用 Alpine Linux 的基底 Node.js 映射,公開 Hello World 應用程式執行的埠 1337,然後複製應用程式檔案並將其初始化。

建立 Jenkins 建置規則

在上一個步驟中,您已建立將訊息輸出至控制台的基本 Jenkins 建置規則。 讓我們建立建置步驟,以使用我們的 Dockerfile 並執行應用程式。

回到 Jenkins 實例,選取您在上一個步驟中建立的作業。 選取 左側的 [設定 ],然後向下捲動至 [ 置] 區段:

  • 拿掉現有的 echo "Test" 建置步驟。 選取現有建置步驟方塊右上角的紅色十字。

  • 選擇 [新增建置步驟],然後選取 [ 執行殼層]

  • 在 [ 命令] 方塊中,輸入下列 Docker 命令,然後選取 [ 儲存]:

    docker build --tag helloworld:$BUILD_NUMBER .
    docker stop helloworld && docker rm helloworld
    docker run --name helloworld -p 1337:1337 helloworld:$BUILD_NUMBER node /var/www/index.js &
    

Docker 建置步驟會建立映像,並使用 Jenkins 組建編號標記映射,以便您維護映像的歷程記錄。 執行應用程式的任何現有容器都會停止,然後移除。 接著會使用映像啟動新的容器,並根據 GitHub 中的最新認可來執行 Node.js 應用程式。

測試管線

若要查看整個管線的運作情形,請再次編輯 分支 GitHub 存放庫中的 index.js 檔案,然後選取 [ 認可變更]。 新的作業會根據 GitHub 的 Webhook 在 Jenkins 中啟動。 建立 Docker 映像並在新的容器中啟動您的應用程式需要幾秒鐘的時間。

如有需要,請再次取得 VM 的公用 IP 位址:

az vm show --resource-group myResourceGroupJenkins --name myVM -d --query [publicIps] --o tsv

開啟網頁瀏覽器並輸入 http://<publicIps>:1337。 您的 Node.js 應用程式隨即顯示,並反映 GitHub 分支中的最新認可,如下所示:

Running Node.js app

現在,對 GitHub 中的 index.js 檔案進行另一個編輯,並認可變更。 等候幾秒鐘,讓作業在 Jenkins 中完成,然後重新整理網頁瀏覽器,以查看在新容器中執行的應用程式更新版本,如下所示:

Running Node.js app after another GitHub commit

下一步

在本教學課程中,您已將 GitHub 設定為在每個程式代碼認可上執行 Jenkins 建置作業,然後部署 Docker 容器來測試您的應用程式。 您已了解如何︰

  • 建立 Jenkins VM
  • 安裝和設定 Jenkins
  • 建立 GitHub 與 Jenkins 之間的 Webhook 整合
  • 從 GitHub 認可建立和觸發 Jenkins 建置作業
  • 為您的應用程式建立 Docker 映像
  • 確認 GitHub 認可建置新的 Docker 映像和執行中應用程式的更新

繼續進行下一個教學課程,以深入瞭解如何整合 Jenkins 與 Azure DevOps Services。