教學課程:使用 Jenkins 從 GitHub 部署至 Azure Kubernetes Service
重要
許多 Azure 服務都有 Jenkins 外掛程式。截至 2024 年 2 月 29 日,其中部分外掛程式將不支援。 Azure CLI 目前是整合 Jenkins 與 Azure 服務的建議方式。 如需詳細資訊,請參閱適用於 Azure 的 Jenkins 外掛程式一文。
本教學課程會藉由在 Jenkins 中設定持續整合 (CI) 和持續部署 (CD),將範例應用程式從 GitHub 部署至 Azure Kubernetes Service (AKS) 叢集。
在本教學課程中,您將完成下列工作:
- 將範例 Azure 投票應用程式部署至 AKS 叢集。
- 建立基本的 Jenkins 專案。
- 設定 Jenkins 與 ACR 互動的認證。
- 建立適用於自動化組建的 Jenkins 建置作業和 GitHub Webhook。
- 測試 CI/CD 管線,以根據 GitHub 程式代碼認可在 AKS 中更新應用程式。
必要條件
若要完成本教學課程,您需要下列專案:
對 Kubernetes、Git、CI/CD 和容器映射的基本瞭解
Azure Container Registry (ACR) 登錄、ACR 登入伺服器名稱和設定為向 ACR 登錄進行驗證的 AKS 叢集。
已安裝及設定 Azure CLI 2.0.46 版或更新版本。 執行
az --version
以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI。安裝在 開發系統上的 Docker
在您的開發系統上安裝 GitHub 帳戶、 GitHub 個人存取令牌和 Git 用戶端
如果您提供自己的 Jenkins 實例,而不是此範例腳本方式來部署 Jenkins,您的 Jenkins 實例需要 安裝並設定 Docker 和 kubectl。
準備您的應用程式
在本文中,您會使用包含 Web 介面和 Redis 的範例 Azure 投票應用程式來儲存暫存數據。
在整合 Jenkins 和 AKS 以進行自動化部署之前,請先手動準備 Azure 投票應用程式並將其部署至 AKS 叢集。 此手動部署可讓您查看應用程式運作情形。
注意
範例 Azure 投票應用程式會使用排程在 Linux 節點上執行的 Linux Pod。 本文中所述的流程也適用於在 Windows Server 節點上排程的 Windows Server Pod。
將列範例應用程式的 GitHub 存放庫 - https://github.com/Azure-Samples/azure-voting-app-redis。 若要將存放庫分叉至您自己的 GitHub 帳戶,請選取 右上角的 [分支 ] 按鈕。
將分支複製到您的開發系統。 複製此存放庫時,請務必使用分支的 URL:
git clone https://github.com/<your-github-account>/azure-voting-app-redis.git
變更為複製分支的目錄:
cd azure-voting-app-redis
若要建立範例應用程式所需的容器映像,請使用 docker-compose.yaml 檔案搭配 docker-compose
:
docker-compose up -d
系統會提取所需的基底映像,並建置應用程式容器。 然後 ,您可以使用 docker images 命令來查看已建立的映射。 已下載或建立三個映像。 映射 azure-vote-front
包含應用程式,並使用 nginx-flask
映像作為基底。 映射 redis
是用來啟動 Redis 實例:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
azure-vote-front latest 9cc914e25834 40 seconds ago 694MB
redis latest a1b99da73d05 7 days ago 106MB
tiangolo/uwsgi-nginx-flask flask 788ca94b2313 9 months ago 694MB
登入您的 Azure Container Registry。
az acr login -n <acrLoginServer>
將取代 <acrLoginServer>
為您的 ACR 登入伺服器。
使用 docker tag 命令,以 ACR 登入伺服器名稱和版本號碼v1
標記映像。 使用在上一個步驟中取得的您自己的 <acrLoginServer>
名稱:
docker tag azure-vote-front <acrLoginServer>/azure-vote-front:v1
最後,將 azure-vote-front 映射推送至您的 ACR 登錄。 同樣地,將 取代 <acrLoginServer>
為您自己的 ACR 登錄登入伺服器名稱,例如 myacrregistry.azurecr.io
:
docker push <acrLoginServer>/azure-vote-front:v1
將範例應用程式部署至 AKS
若要將範例應用程式部署至 AKS 叢集,您可以使用 Azure 投票存放庫根目錄中的 Kubernetes 指令清單檔案。 使用 azure-vote-all-in-one-redis.yaml
如的 vi
編輯器開啟指令清單檔案。 將 microsoft
取代為您的 ACR 登入伺服器名稱。 此值位於指令清單檔的第 60 行:
containers:
- name: azure-vote-front
image: azuredocs/azure-vote-front
接下來,使用 kubectl apply 命令將應用程式部署至 AKS 叢集:
kubectl apply -f azure-vote-all-in-one-redis.yaml
系統會建立 Kubernetes 負載平衡器服務,以將應用程式公開至因特網。 此程序可能需要幾分鐘的時間。 若要監視負載平衡器部署的進度,請使用 kubectl get service 命令搭配 --watch
自變數。
$ kubectl get service azure-vote-front --watch
當 EXTERNAL-IP 位址從擱置變更為 IP 地址之後,請使用 Control + C
來停止 kubectl 監看程式。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
若要查看作用中的應用程式,請開啟網頁瀏覽器至您服務的外部IP位址。 Azure 投票應用程式隨即顯示,如下列範例所示:
設定 Jenkins 控制器
套用下列變更,以從 Jenkins 控制器啟用 AKS 部署:
開啟埠 80
輸入。
az vm open-port \
--resource-group <Resource_Group_name> \
--name <Jenkins_Controller_VM> \
--port 80 --priority 1020
將 <Resource_Group_name>
和 <Jenkins_Controller_VM>
取代為適當的值。
透過 SSH 連線到 Jenkins 控制器
ssh azureuser@<PublicIPAddres>
將取代 <PublicIPAddress>
為 Jenkins 控制器的 IP 位址。
安裝及登入 AzCLI
curl -L https://aka.ms/InstallAzureCli | bash
az login
注意
若要手動安裝 AzCLI,請遵循這些 指示。
安裝 Docker
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -;
sudo apt-key fingerprint 0EBFCD88;
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable";
sudo apt-get update;
sudo apt-get install docker-ce -y;
安裝 Kubectl 並連線至 AKS
sudo az aks install-cli
sudo az aks get-credentials --resource-group <Resource_Group> --name <AKS_Name>
將 <Resource_Group>
和 <AKS_Name>
取代為適當的值。
設定存取權
sudo usermod -aG docker jenkins;
sudo usermod -aG docker azureuser;
sudo touch /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion;
sudo service jenkins restart;
sudo cp ~/.kube/config /var/lib/jenkins/.kube/
sudo chmod 777 /var/lib/jenkins/
sudo chmod 777 /var/lib/jenkins/config
建立 Jenkins 環境變數
Jenkins 環境變數可用來保存 ACR 登入伺服器名稱。 此變數會在 Jenkins 建置作業期間參考。 若要建立此環境變數,請完成下列步驟:
在 Jenkins 入口網站的左側,選取 [ 管理 Jenkins>設定系統]
在 [全域屬性] 底下,選取 [環境變數]。 新增具有 ACR 登入伺服器名稱和
ACR_LOGINSERVER
值的變數。完成時,選取 頁面底部的 [儲存 ]。
建立 ACR 的 Jenkins 認證
在 CI/CD 程式期間,Jenkins 會根據應用程式更新建置新的容器映像,然後 必須將這些映射推送 至 ACR 登錄。
若要讓 Jenkins 將更新的容器映像推送至 ACR,您必須指定 ACR 的認證。
若要區隔角色和許可權,請使用 ACR 登錄的參與者許可權設定 Jenkins 的服務主體。
為 Jenkins 建立服務主體以使用 ACR
首先,使用 az ad sp create-for-rbac 命令建立服務主體:
az ad sp create-for-rbac
此命令所產生的輸出與下列範例類似:
{
"appId": "<app-ID>",
"displayName": "azure-cli-2018-09-28-22-19-34",
"name": "http://azure-cli-2018-09-28-22-19-34",
"password": "<password>",
"tenant": "<tenant-ID>"
}
記下 appId 和 密碼。 這些步驟會使用這些值來設定 Jenkins 中的認證資源。
使用 az acr show 命令取得 ACR 登錄的資源識別碼,並將其儲存為變數。
ACR_ID=$(az acr show --resource-group <Resource_Group> --name <acrLoginServer> --query "id" --output tsv)
將 <Resource_Group>
和 <acrLoginServer>
取代為適當的值。
建立角色指派,將服務主體 參與者 許可權指派給 ACR 登錄。
az role assignment create --assignee <appID> --role Contributor --scope $ACR_ID
將 取代 <appId>
為常數命令輸出中提供的值,以用來建立服務主體。
在 Jenkins 中為 ACR 服務主體建立認證資源
在 Azure 中建立角色指派之後,現在會將 ACR 認證儲存在 Jenkins 認證物件中。 這些認證會在 Jenkins 建置作業期間參考。
回到 Jenkins 入口網站的左側,選取 [管理 Jenkins 管理>認證] Jenkins>市>集全域認證 (不受限制)>新增認證
確定認證種類為 具有密碼 的用戶名稱,並輸入下列專案:
- 用戶名稱 - 為向 ACR 登錄進行驗證所建立之服務主體的 appId 。
- 密碼 - 為您的 ACR 登錄驗證所建立的服務主體密碼 。
- 標識碼 - 認證標識碼,例如 acr-credentials
完成時,認證表單看起來像下列範例:
選取 [ 確定 ],然後返回 Jenkins 入口網站。
建立 Jenkins 專案
從 Jenkins 入口網站的首頁,選取 左側的 [新增專案 ]:
輸入 azure-vote 作為作業名稱。 選擇 Freestyle 項目,然後選取 [ 確定]
在 [ 一般] 區段下,選取 [GitHub 專案 ],然後輸入您的分支存放庫 URL,例如 https://github.com/<your-github-account>/azure-voting-app-redis
在 [ 原始程式碼管理 ] 區段底下,選取 [Git],輸入您的分支存放庫
.git
URL,例如 https://github.com/<your-github-account>/azure-voting-app-redis.git在 [ 建置觸發程式 ] 區段底下,選取 [GITHub 攔截觸發程式] 以進行 GITscm 輪詢
在 [建置環境] 底下,選取 [使用秘密文字或檔案]
在 [系結] 下,選取 [新增>使用者名稱和密碼] (分隔)
輸入
ACR_ID
[用戶名稱變數] 和ACR_PASSWORD
[密碼變數]
選擇新增執行殼層類型的建置步驟,並使用下列文字。 此腳本會建置新的容器映像,並將其推送至您的 ACR 登錄。
# Build new image and push to ACR. WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}" docker build -t $WEB_IMAGE_NAME ./azure-vote docker login ${ACR_LOGINSERVER} -u ${ACR_ID} -p ${ACR_PASSWORD} docker push $WEB_IMAGE_NAME
新增另一個執行殼層類型的建置步驟,並使用下列文字。 此文本會使用來自 ACR 的新容器映像,更新 AKS 中的應用程式部署。
# Update kubernetes deployment with new image. WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}" kubectl set image deployment/azure-vote-front azure-vote-front=$WEB_IMAGE_NAME
完成後,按兩下 [ 儲存]。
測試 Jenkins 組建
在您根據 GitHub 認可將作業自動化之前,請手動測試 Jenkins 組建。
此組建會驗證作業是否已正確設定。 它會確認適當的 Kubernetes 驗證檔案已就緒,且該驗證可讓 ACR 運作。
在專案的左側功能表上,選取 [ 立即建置]。
第一個組建較長,因為 Docker 映射層會向下提取至 Jenkins 伺服器。
組建會執行下列工作:
- 複製 GitHub 存放庫
- 建置新的容器映像
- 將容器映像推送至 ACR 登錄
- 更新 AKS 部署所使用的映像
由於尚未對應用程式程式代碼進行任何變更,因此 Web UI 不會變更。
建置作業完成後,請選取 [建置歷程記錄] 底下的 [組建] #1 。 選取 [主控台輸出 ],然後檢視建置程序的輸出。 最後一行應該表示建置成功。
建立 GitHub Webhook
完成手動建置後,現在將 GitHub 整合到 Jenkins 組建中。 每次將程式代碼認可至 GitHub 時,請使用 Webhook 來執行 Jenkins 建置作業。
若要建立 GitHub Webhook,請完成下列步驟:
流覽至網頁瀏覽器中的分支 GitHub 存放庫。
選取 [ 設定],然後選取 左側的 [Webhook ]。
選擇 [ 新增 Webhook]。 針對 [ 承載 URL],輸入
http://<publicIp:8080>/github-webhook/
,其中<publicIp>
是 Jenkins 伺服器的 IP 位址。 請務必包含尾端/
。 保留內容類型的其他預設值,並在推送事件上觸發。選取 [新增 Webhook]。
測試完整的 CI/CD 管線
現在您可以測試整個 CI/CD 管線。 當您將程式代碼認可推送至 GitHub 時,會發生下列步驟:
- GitHub Webhook 會通知 Jenkins。
- Jenkins 會啟動建置作業,並從 GitHub 提取最新的程式代碼認可。
- Docker 組建是使用更新的程式代碼啟動,而新的容器映像會以最新的組建編號標記。
- 這個新的容器映像會推送至 Azure Container Registry。
- 在 Azure Kubernetes Service 上執行的應用程式會使用 Azure Container Registry 的最新映像進行更新。
在您的開發電腦上,使用程式碼編輯器開啟複製的應用程式。 在 /azure-vote/azure-vote 目錄下,開啟名為 config_file.cfg 的檔案。 將此檔案中的投票值更新為貓和狗以外的值,如下列範例所示:
# UI Configurations
TITLE = 'Azure Voting App'
VOTE1VALUE = 'Blue'
VOTE2VALUE = 'Purple'
SHOWHOST = 'false'
更新時,儲存盤案、認可變更,並將其推送至 GitHub 存放庫的分支。 GitHub Webhook 會在 Jenkins 中觸發新的建置作業。 在 Jenkins Web 儀錶板中,監視建置程式。 需要幾秒鐘的時間才能提取最新的程式碼、建立和推送更新的映像,以及在 AKS 中部署更新的應用程式。
建置完成後,請重新整理範例 Azure 投票應用程式的網頁瀏覽器。 隨即顯示您的變更,如下列範例所示: