教學課程:使用 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 中更新應用程式。

必要條件

若要完成本教學課程,您需要下列專案:

準備您的應用程式

在本文中,您會使用包含 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 自變數。 當 EXTERNAL-IP 位址從擱置變更為 IP 地址之後,請使用 Control + C 來停止 kubectl 監看程式。

$ kubectl get service azure-vote-front --watch

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
azure-vote-front   LoadBalancer   10.0.215.27   <pending>     80:30747/TCP   22s
azure-vote-front   LoadBalancer   10.0.215.27   40.117.57.239   80:30747/TCP   2m

若要查看作用中的應用程式,請開啟網頁瀏覽器至您服務的外部IP位址。 Azure 投票應用程式隨即顯示,如下列範例所示:

Azure sample vote application running in AKS

設定 Jenkins 控制器

套用下列變更,以從 Jenkins 控制器啟用 AKS 部署:

開啟埠 80 輸入。

az vm open-port \
--resource-group <Resource_Group_name> \
--name <Jenkins_Controller_VM>  \
--port 80 --priority 1020

將和 <Jenkins_Controller_VM> 取代<Resource_Group_name>為適當的值。

透過 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>

將和 <AKS_Name> 取代<Resource_Group>為適當的值。

設定存取權

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 值的變數。

    Jenkins environment variables

  • 完成時,選取 頁面底部的 [儲存 ]。

建立 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": "626dd8ea-042d-4043-a8df-4ef56273670f",
  "displayName": "azure-cli-2018-09-28-22-19-34",
  "name": "http://azure-cli-2018-09-28-22-19-34",
  "password": "1ceb4df3-c567-4fb6-955e-f95ac9460297",
  "tenant": "72f988bf-86f1-41af-91ab-2d7cd011db48"
}

記下 appId密碼。 這些步驟會使用這些值來設定 Jenkins 中的認證資源。

使用 az acr show 命令取得 ACR 登錄的資源識別碼,並將其儲存為變數。

ACR_ID=$(az acr show --resource-group <Resource_Group> --name <acrLoginServer> --query "id" --output tsv)

將和 <acrLoginServer> 取代<Resource_Group>為適當的值。

建立角色指派,將服務主體 參與者 許可權指派給 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

完成時,認證表單看起來像下列範例:

Create a Jenkins credential object with the service principal information

選取 [ 確定 ],然後返回 Jenkins 入口網站。

建立 Jenkins 專案

從 Jenkins 入口網站的首頁,選取 左側的 [新增專案 ]:

  1. 輸入 azure-vote 作為作業名稱。 選擇 Freestyle 項目,然後選取 [ 確定]

  2. 在 [ 一般] 區段下,選取 [GitHub 專案 ],然後輸入您的分支存放庫 URL,例如 https://github.com/<your-github-account>/azure-voting-app-redis

  3. 在 [ 原始程式碼管理 ] 區段底下,選取 [Git],輸入您的分支存放庫 .git URL,例如 https://github.com/<your-github-account>/azure-voting-app-redis.git

  4. 在 [ 建置觸發程式 ] 區段底下,選取 [GITHub 攔截觸發程式] 以進行 GITscm 輪詢

  5. 在 [建置環境] 底下,選取 [使用秘密文字或檔案]

  6. 在 [系結] 下,選取 [新增>使用者名稱和密碼] (分隔)

    • 輸入 ACR_ID [用戶名稱變數] 和 ACR_PASSWORD [密碼變數]

      Jenkins bindings

  7. 選擇新增執行殼層類型的建置步驟,並使用下列文字。 此腳本會建置新的容器映像,並將其推送至您的 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
    
  8. 新增另一個執行殼層類型的建置步驟,並使用下列文字。 此文本會使用來自 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
    
  9. 完成後,按兩下 [ 儲存]。

測試 Jenkins 組建

在您根據 GitHub 認可將作業自動化之前,請手動測試 Jenkins 組建。

此組建會驗證作業是否已正確設定。 它會確認適當的 Kubernetes 驗證檔案已就緒,且該驗證可讓 ACR 運作。

在專案的左側功能表上,選取 [ 立即建置]。

Jenkins test build

第一個組建較長,因為 Docker 映射層會向下提取至 Jenkins 伺服器。

組建會執行下列工作:

  1. 複製 GitHub 存放庫
  2. 建置新的容器映像
  3. 將容器映像推送至 ACR 登錄
  4. 更新 AKS 部署所使用的映像

由於尚未對應用程式程式代碼進行任何變更,因此 Web UI 不會變更。

建置作業完成後,請選取 [建置歷程記錄] 底下的 [組建] #1 。 選取 [主控台輸出 ],然後檢視建置程序的輸出。 最後一行應該表示建置成功。

建立 GitHub Webhook

完成手動建置後,現在將 GitHub 整合到 Jenkins 組建中。 每次將程式代碼認可至 GitHub 時,請使用 Webhook 來執行 Jenkins 建置作業。

若要建立 GitHub Webhook,請完成下列步驟:

  1. 流覽至網頁瀏覽器中的分支 GitHub 存放庫。

  2. 選取 [設定],然後選取左側的 [Webhook]。

  3. 選擇 [ 新增 Webhook]。 針對 [ 承載 URL],輸入 http://<publicIp:8080>/github-webhook/,其中 <publicIp> 是 Jenkins 伺服器的 IP 位址。 請務必包含尾端 /。 保留內容類型的其他預設值,並在推送事件上觸發。

  4. 選取 [新增 Webhook]

    Create a GitHub webhook for Jenkins

測試完整的 CI/CD 管線

現在您可以測試整個 CI/CD 管線。 當您將程式代碼認可推送至 GitHub 時,會發生下列步驟:

  1. GitHub Webhook 會通知 Jenkins。
  2. Jenkins 會啟動建置作業,並從 GitHub 提取最新的程式代碼認可。
  3. Docker 組建是使用更新的程式代碼啟動,而新的容器映像會以最新的組建編號標記。
  4. 這個新的容器映像會推送至 Azure Container Registry。
  5. 在 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 投票應用程式的網頁瀏覽器。 隨即顯示您的變更,如下列範例所示:

Sample Azure vote in AKS updated by the Jenkins build job

下一步