共用方式為


教學課程:使用 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

建立 VM 之前,請先使用 az group create 來建立資源群組。 下列範例會在 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>

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

$ 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...
...

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

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 帳戶,請選取右上角的 [分支 ] 按鈕。

在您建立的 Fork 中建立 webhook:

  • 選取 [設定],然後選取左側的 [Webhooks]
  • 選擇 [新增 Webhook],然後在篩選方塊中輸入 Jenkins
  • 針對 負載 URL,輸入 http://<publicIps>:8080/github-webhook/。 請確保您包含結尾的 /
  • 針對 [內容類型],選取 application/x-www-form-urlencoded
  • 針對 您希望哪些事件來觸發這個 Webhook?,選擇 只有推送事件。
  • [作用中] 設定為已核取。
  • 按兩下 [新增 Webhook]。

將 GitHub Webhook 新增至分支存放庫

建立 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 輪詢
  • 在 [ 建置] 區段下,選擇 [新增建置步驟]。 選取 執行 Shell,然後在命令視窗中輸入 echo "Test"
  • 選取作業視窗底部的 [ 儲存 ]。

測試 GitHub 整合

若要測試 GitHub 與 Jenkins 的整合,請在你的 fork 提交變更。

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

response.end("Hello World!");

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

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

定義 Docker 建置映像

若要查看依據 GitHub 提交運行的 Node.js 應用程式,請建置 Docker 映像來執行該應用程式。 映像是從 Dockerfile 建置的,其會定義如何設定執行應用程式的容器。

從 SSH 連線到您的 VM,切換到 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" 建置步驟。 選取現有建置步驟方塊右上角的紅色十字。

  • 選擇 新增建置步驟,然後選擇 執行 Shell

  • 在 [ 命令] 方塊中,輸入下列 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 分叉中的最新提交,如下所示:

執行 Node.js 應用程式

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

在另一個 GitHub 提交之後執行 Node.js 應用程式

後續步驟

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

  • 建立 Jenkins VM
  • 安裝和設定 Jenkins
  • 建立 GitHub 與 Jenkins 之間的 Webhook 整合
  • 從 GitHub 提交建立和觸發 Jenkins 建置工作
  • 為您的應用程式建立 Docker 映像
  • 確認 GitHub 提交能夠構建新的 Docker 映像並更新正在運行的應用程式

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