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