教學課程:使用 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 時顯示空白頁面,請重新啟動 Jenkins 服務。 從 SSH 工作階段輸入
- 如有需要,請使用您建立的用戶名稱和密碼登入 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]。
建立 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 分支中的最新認可,如下所示:
現在,對 GitHub 中的 index.js 檔案進行另一個編輯,並認可變更。 等候幾秒鐘,讓作業在 Jenkins 中完成,然後重新整理網頁瀏覽器,以查看在新容器中執行的應用程式更新版本,如下所示:
下一步
在本教學課程中,您已將 GitHub 設定為在每個程式代碼認可上執行 Jenkins 建置作業,然後部署 Docker 容器來測試您的應用程式。 您已了解如何︰
- 建立 Jenkins VM
- 安裝和設定 Jenkins
- 建立 GitHub 與 Jenkins 之間的 Webhook 整合
- 從 GitHub 認可建立和觸發 Jenkins 建置作業
- 為您的應用程式建立 Docker 映像
- 確認 GitHub 認可建置新的 Docker 映像和執行中應用程式的更新
繼續進行下一個教學課程,以深入瞭解如何整合 Jenkins 與 Azure DevOps Services。