教學課程:使用 Azure 容器應用程式作業,部署自我裝載 CI/CD 執行器和代理程式
GitHub Actions 和 Azure Pipelines 可讓您使用自我裝載執行器和代理程式來執行 CI/CD 工作流程。 您可以使用事件驅動的 Azure 容器應用程式作業,執行自我裝載執行器和代理程式。
當您須執行需要存取雲端裝載執行器無法使用的本機資源或工具的工作流程時,自我裝載執行器相當實用。 例如,容器應用程式作業中的自我裝載執行器可讓您的工作流程存取作業虛擬網路內的資源,而雲端裝載執行器無法存取這些資源。
將自我裝載執行器作為事件驅動作業執行,可讓您利用 Azure 容器應用程式的無伺服器本質。 作業會在觸發工作流程時自動執行,並在作業完成時結束。
您只須針對作業執行的時間付費即可。
在本教學課程中,您會了解如何將 GitHub Actions 執行器作為事件驅動容器應用程式作業執行。
- 建立容器應用程式環境以部署自我裝載執行器
- 建立 GitHub 存放庫以執行使用自我裝載執行器的工作流程
- 建置會執行 GitHub Actions 執行器的容器映像
- 將執行器作為作業部署至容器應用程式環境
- 建立使用自我裝載執行器的工作流程,並確認其可正常執行
重要
自我裝載執行器僅適用於私人存放庫。 如果將其與公用存放庫搭配使用,可能會導致危險程式碼在您的自我裝載執行器上執行。 如需詳細資訊,請參閱自我裝載執行器安全性 (英文)。
在本教學課程中,您會了解如何將 Azure Pipelines 代理程式作為事件驅動容器應用程式作業執行。
- 建立容器應用程式環境以部署自我裝載式代理程式
- 建立 Azure DevOps 組織與專案
- 建置執行 Azure Pipelines 代理程式的容器映像
- 使用手動作業,在容器應用程式環境中建立預留位置代理程式
- 將代理程式作為作業部署至容器應用程式環境
- 建立使用自我裝載式代理程式的管線,並確認其可正常執行
重要
自我裝載式代理程式僅適用於私人專案。 如果將其與公用專案搭配使用,可能會導致危險程式碼在您的自我裝載式代理程式上執行。 如需詳細資訊,請參閱自我裝載式代理程式安全性 (部分機器翻譯)。
注意
容器應用程式和作業不支援在容器中執行 Docker。 在容器應用程式作業中的自我裝載執行器或代理程式上執行時,工作流程中使用 Docker 命令的任何步驟都會失敗。
必要條件
- Azure DevOps 組織:如果您沒有具備有效訂閱的 DevOps 組織,可以免費建立一個。
如需限制清單,請參閱作業限制 (部分機器翻譯)。
設定
若要從 CLI 登入 Azure,請執行下列命令,並遵循提示來完成驗證流程。
az login
若要確定您執行的是最新版本 CLI,請執行升級命令。
az upgrade
接下來,安裝或更新 CLI 的 Azure 容器應用程式延伸模組。
如果您在 Azure CLI 中執行 az containerapp
命令或 Azure PowerShell 模組中的 Cmdlet Az.App
時收到遺漏參數的錯誤,請確定您已安裝最新版的 Azure 容器應用程式延伸模組。
az extension add --name containerapp --upgrade
注意
從 2024 年 5 月開始,Azure CLI 延伸模組預設不會再啟用預覽功能。 若要存取容器應用程式預覽功能,請使用 --allow-preview true
安裝容器應用程式延伸模組。
az extension add --name containerapp --upgrade --allow-preview true
現在已安裝目前的延伸模組或模組,請註冊 Microsoft.App
和 Microsoft.OperationalInsights
命名空間。
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
建立環境變數
現在您的 Azure CLI 設定已完成,接下來您可以定義本文中使用的環境變數了。
RESOURCE_GROUP="jobs-sample"
LOCATION="northcentralus"
ENVIRONMENT="env-jobs-sample"
JOB_NAME="github-actions-runner-job"
RESOURCE_GROUP="jobs-sample"
LOCATION="northcentralus"
ENVIRONMENT="env-jobs-sample"
JOB_NAME="azure-pipelines-agent-job"
PLACEHOLDER_JOB_NAME="placeholder-agent-job"
建立容器應用程式環境
Azure 容器應用程式環境可作為容器應用程式和作業的安全界限,讓其共用相同的網路並彼此通訊。
注意
若要建立與現有虛擬網路整合的容器應用程式環境,請參閱將虛擬網路提供給內部 Azure 容器應用程式環境 (部分機器翻譯)。
使用下列命令建立資源群組。
az group create \ --name "$RESOURCE_GROUP" \ --location "$LOCATION"
使用下列命令建立容器應用程式環境。
az containerapp env create \ --name "$ENVIRONMENT" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION"
建立用於執行工作流程的 GitHub 存放庫
若要執行工作流程,您必須建立包含工作流程定義的 GitHub 存放庫。
瀏覽至 GitHub 並登入。
輸入下列值來建立新的存放庫。
設定 值 負責人 選取 GitHub 使用者名稱。 儲存機制名稱 輸入存放庫名稱。 能見度 選取 [私人]。 將此存放庫初始化的方式 選取 [新增讀我檔案]。 將其餘值保留為預設選取項目。
選取 [建立存放庫]。
在新的存放庫中,選取 [動作]。
搜尋簡單工作流程範本,然後選取 [設定]。
選取 [認可變更],將工作流程新增至存放庫。
工作流程會在 ubuntu-latest
GitHub 裝載執行器上執行,並將訊息列印至主控台。 稍後,您可將 GitHub 裝載執行器取代為自我裝載執行器。
取得 GitHub 個人存取權杖
若要執行自我裝載執行器,您必須在 GitHub 中建立個人存取權杖 (PAT)。 每次執行器啟動時,PAT 都會用於產生權杖,以向 GitHub 註冊執行器。 GitHub Actions 執行器調整規則也會使用 PAT 來監視存放庫的工作流程佇列,並視需要啟動執行器。
注意
個人存取令牌 (PAT) 有到期日。 定期輪替您的令牌,以確保令牌維持有效(未過期),以維持不間斷的服務。
在 GitHub 中,選取右上角的設定檔圖片,然後選取 [設定]。
選取 [開發人員設定]。
在 [個人存取權杖] 下,選取 [微調權杖]。
選取 [產生新的權杖] 。
在 [新增細部個人存取權杖] 畫面中,輸入下列值。
設定 值 權杖名稱 輸入權杖的名稱。 到期 選取 [30 天]。 存放庫存取 選取 [僅選取存放庫],然後選取您建立的存放庫。 針對 [存放庫權限] 輸入下列值。
設定 值 動作 選取 [唯讀]。 系統管理 選取 [讀取及寫入]。 中繼資料 選取 [唯讀]。 選取 [產生權杖]。
複製權杖值。
定義稍後用於設定執行器和調整規則的變數。
GITHUB_PAT="<GITHUB_PAT>" REPO_OWNER="<REPO_OWNER>" REPO_NAME="<REPO_NAME>"
以下列值取代預留位置:
預留位置 值 <GITHUB_PAT>
您所產生的 GitHub PAT。 <REPO_OWNER>
您先前所建立存放庫的擁有者。 此值通常是您的 GitHub 使用者名稱。 <REPO_NAME>
您先前所建立存放庫的名稱。 此值與您在 [存放庫名稱] 欄位中輸入的名稱相同。
建置 GitHub Actions 執行器容器映像
若要建立自我裝載執行器,您必須建置執行執行器的容器映像。 在本節中,您會建置容器映像,並將其推送至容器登錄。
注意
您在本教學課程中建置的映像包含基本的自我裝載執行器,適合作為容器應用程式作業執行。 您可以加以自訂,以包含工作流程所需的其他工具或相依性。
定義容器映像和登錄的名稱。
CONTAINER_IMAGE_NAME="github-actions-runner:1.0" CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
請將
<CONTAINER_REGISTRY_NAME>
取代為用於建立容器登錄的唯一名稱。 容器登錄名稱必須是 Azure 內的唯一名稱,且長度為 5 到 50 個字元,僅包含數字和小寫字母。建立容器登錄庫。
az acr create \ --name "$CONTAINER_REGISTRY_NAME" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION" \ --sku Basic \ --admin-enabled true
用於建立執行器映像的 Dockerfile 可在 GitHub 取得。 執行下列命令以複製存放庫,並使用
az acr build
命令在雲端中建置容器映像。az acr build \ --registry "$CONTAINER_REGISTRY_NAME" \ --image "$CONTAINER_IMAGE_NAME" \ --file "Dockerfile.github" \ "https://github.com/Azure-Samples/container-apps-ci-cd-runner-tutorial.git"
映像現在可在容器登錄中取得。
將自我裝載執行器部署為作業
您現在可以建立用於使用容器映像的作業。 在本節中,您會建立作業,以使用您先前產生的 PAT 來執行自我裝載執行器,並使用 GitHub 進行驗證。 此作業會使用 github-runner
調整規則,根據擱置的工作流程執行數目來建立作業執行。
在容器應用程式環境中建立作業。
az containerapp job create -n "$JOB_NAME" -g "$RESOURCE_GROUP" --environment "$ENVIRONMENT" \ --trigger-type Event \ --replica-timeout 1800 \ --replica-retry-limit 0 \ --replica-completion-count 1 \ --parallelism 1 \ --image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" \ --min-executions 0 \ --max-executions 10 \ --polling-interval 30 \ --scale-rule-name "github-runner" \ --scale-rule-type "github-runner" \ --scale-rule-metadata "githubAPIURL=https://api.github.com" "owner=$REPO_OWNER" "runnerScope=repo" "repos=$REPO_NAME" "targetWorkflowQueueLength=1" \ --scale-rule-auth "personalAccessToken=personal-access-token" \ --cpu "2.0" \ --memory "4Gi" \ --secrets "personal-access-token=$GITHUB_PAT" \ --env-vars "GITHUB_PAT=secretref:personal-access-token" "GH_URL=https://github.com/$REPO_OWNER/$REPO_NAME" "REGISTRATION_TOKEN_API_URL=https://api.github.com/repos/$REPO_OWNER/$REPO_NAME/actions/runners/registration-token" \ --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io"
下表描述命令中使用的重要參數。
參數 描述 --replica-timeout
複本的執行持續時間上限。 --replica-retry-limit
重試失敗複本的次數。 --replica-completion-count
在將作業的執行視為成功前,所需成功完成的複本數目。 --parallelism
每個作業執行要啟動的複本數目。 --min-executions
每個輪詢間隔要執行的作業執行數目下限。 --max-executions
每個輪詢間隔要執行的作業執行數目上限。 --polling-interval
評估調整規則的輪詢間隔。 --scale-rule-name
調整規則的名稱。 --scale-rule-type
要使用的調整規則類型。 若要深入了解 GitHub 執行器調整工具,請參閱 KEDA 文件 (英文)。 --scale-rule-metadata
調整規則的中繼資料。 如果您使用的是 GitHub Enterprise,請使用其 API URL 更新 githubAPIURL
。--scale-rule-auth
調整規則的驗證。 --secrets
要用於作業的秘密。 --env-vars
要用於作業的環境變數。 --registry-server
要用於作業的容器登錄伺服器。 若為 Azure Container Registry,命令會自動設定驗證。 調整規則設定會定義要監視的事件來源。 其會在每個輪詢間隔進行評估,並判斷要觸發的作業執行數目。 若要深入了解,請參閱設定調整規則 (部分機器翻譯)。
系統現在會在容器應用程式環境中建立事件驅動作業。
執行工作流程並確認作業
作業設定為每隔 30 秒評估一次調整規則。 在每次評估期間,其會檢查需要自我裝載執行器的擱置工作流程執行數目,並為擱置工作流程啟動新的作業執行,最多可設定 10 次執行。
若要確認作業已正確設定,您可以修改工作流程以使用自我裝載執行器並觸發工作流程執行。 然後,您可以檢視作業執行記錄,以查看工作流程執行情況。
在 GitHub 存放庫中,瀏覽至您先前產生的工作流程。 這是
.github/workflows
目錄中的 YAML 檔案。選取 [Edit in place] \(就地編輯\)。
將
runs-on
屬性更新為self-hosted
:runs-on: self-hosted
選取 [認可變更]。
選取 [認可變更]。
瀏覽至 [動作] 索引標籤。
新的工作流程現已排入佇列。 在 30 秒內,作業執行將會啟動,而工作流程在不久後便會完成。
等候動作完成,再繼續執行下一個步驟。
列出作業的執行,以確認作業執行已建立並順利完成。
az containerapp job execution list \ --name "$JOB_NAME" \ --resource-group "$RESOURCE_GROUP" \ --output table \ --query '[].{Status: properties.status, Name: name, StartTime: properties.startTime}'
建立 Azure DevOps 專案和存放庫
若要執行管線,您需要 Azure DevOps 專案和存放庫。
瀏覽至 Azure DevOps 並登入您的帳戶。
選取現有組織或建立新組織。
在組織概觀頁面中,選取 [新增專案],然後輸入下列值。
設定 值 專案名稱 輸入專案的名稱。 可視性 選取 [私人]。 選取 建立。
在左側導覽中,選取 [Repos]。
在 [Initialize main branch with a README or .gitignore] \(使用讀我檔案或 .gitignore 將主分支初始化\) 下,選取 [新增讀我檔案]。
保留其餘值的預設值,然後選取 [初始化]。
建立新的代理程式集區
建立新的代理程式集區,以執行自我裝載執行器。
在您的 Azure DevOps 專案中,展開左側導覽列,然後選取 [專案設定]。
在 [專案設定] 導覽功能表的 [Pipelines] 區段底下,選取 [代理程式集區]。
選取 [新增集區],並輸入下列值。
設定 值 要連結的集區 選取新增。 集區類型 選取 [自我裝載]。 名稱 輸入 container-apps。 授與所有管線的存取權限 選取此核取方塊。 選取 建立。
取得 Azure DevOps 個人存取權杖
若要執行自我裝載執行器,您必須在 Azure DevOps 中建立個人存取權杖 (PAT)。 PAT 可用於透過 Azure DevOps 驗證執行器。 調整規則也會使用 PAT 確定擱置的管線執行數目,並觸發新的作業執行。
[!注意]
個人存取令牌 (PAT) 有到期日。 定期輪替您的令牌,以確保令牌維持有效(未過期),以維持不間斷的服務。
在 Azure DevOps 中,選取右上角設定檔圖片旁的 [使用者設定]。
選取 [個人存取權杖]。
在 [個人存取權杖] 頁面中,選取 [新增權杖],並輸入下列值。
設定 值 名稱 輸入權杖的名稱。 組織 選取您先前選擇或建立的組織。 範圍 選取 [Custom defined] \(已定義自訂\)。 顯示所有範圍 選取 [顯示所有範圍]。 代理程式集區 (讀取與管理) 選取 [代理程式集區 (讀取與管理)]。 所有其他範圍都保留為未選取。
選取 建立。
將權杖值複製到安全位置。
離開此頁面之後,即無法擷取權杖。
定義稍後用於設定容器應用程式作業的變數。
AZP_TOKEN="<AZP_TOKEN>" ORGANIZATION_URL="<ORGANIZATION_URL>" AZP_POOL="container-apps" REGISTRATION_TOKEN_API_URL="<YOUR_REGISTRATION_TOKEN_API_URL>"
以下列值取代預留位置:
預留位置 值 註解 <AZP_TOKEN>
您所產生的 Azure DevOps PAT。 <ORGANIZATION_URL>
您的 Azure DevOps 組織 URL。 請確認 URL 結尾沒有後置 /
。例如, https://dev.azure.com/myorg
或https://myorg.visualstudio.com
。<YOUR_REGISTRATION_TOKEN_API_URL>
entrypoint.sh 檔案中的註冊令牌 API URL。 例如,'https://myapi.example.com/get-token'
建置 Azure Pipelines 代理程式容器映像
若要建立自我裝載式代理程式,您必須建置執行代理程式的容器映像。 在本節中,您會建置容器映像,並將其推送至容器登錄。
注意
您在本教學課程中建置的映像包含基本的自我裝載式代理程式,適合作為容器應用程式作業執行。 您可以加以自訂,以包含管線所需的其他工具或相依性。
返回終端,定義容器映像和登錄的名稱。
CONTAINER_IMAGE_NAME="azure-pipelines-agent:1.0" CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
請將
<CONTAINER_REGISTRY_NAME>
取代為用於建立容器登錄的唯一名稱。容器登錄名稱必須是 Azure 內的唯一名稱,且長度為 5 到 50 個字元,僅包含數字和小寫字母。
建立容器登錄庫。
az acr create \ --name "$CONTAINER_REGISTRY_NAME" \ --resource-group "$RESOURCE_GROUP" \ --location "$LOCATION" \ --sku Basic \ --admin-enabled true
用於建立執行器映像的 Dockerfile 可在 GitHub 取得。 執行下列命令以複製存放庫,並使用
az acr build
命令在雲端中建置容器映像。az acr build \ --registry "$CONTAINER_REGISTRY_NAME" \ --image "$CONTAINER_IMAGE_NAME" \ --file "Dockerfile.azure-pipelines" \ "https://github.com/Azure-Samples/container-apps-ci-cd-runner-tutorial.git"
映像現在可在容器登錄中取得。
建立預留位置自我裝載式代理程式
您必須先建立預留位置代理程式,才能在新代理程式集區中執行自我裝載式代理程式。 預留位置代理程式確保代理程式集區可供使用。 若沒有預留位置代理程式,使用代理程式集區的管線會失敗。
您可以執行手動作業來註冊離線預留位置代理程式。 作業執行一次後即可刪除。 預留位置代理程式不會取用 Azure 容器應用程式或 Azure DevOps 中的任何資源。
在容器應用程式環境中建立手動作業,以建立預留位置代理程式。
az containerapp job create -n "$PLACEHOLDER_JOB_NAME" -g "$RESOURCE_GROUP" --environment "$ENVIRONMENT" \ --trigger-type Manual \ --replica-timeout 300 \ --replica-retry-limit 0 \ --replica-completion-count 1 \ --parallelism 1 \ --image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" \ --cpu "2.0" \ --memory "4Gi" \ --secrets "personal-access-token=$AZP_TOKEN" "organization-url=$ORGANIZATION_URL" \ --env-vars "AZP_TOKEN=secretref:personal-access-token" "AZP_URL=secretref:organization-url" "AZP_POOL=$AZP_POOL" "AZP_PLACEHOLDER=1" "AZP_AGENT_NAME=placeholder-agent" \ --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io"
下表描述命令中使用的重要參數。
參數 描述 --replica-timeout
複本的執行持續時間上限。 --replica-retry-limit
重試失敗複本的次數。 --replica-completion-count
在將作業的執行視為成功前,所需成功完成的複本數目。 --parallelism
每個作業執行要啟動的複本數目。 --secrets
要用於作業的秘密。 --env-vars
要用於作業的環境變數。 --registry-server
要用於作業的容器登錄伺服器。 若為 Azure Container Registry,命令會自動設定驗證。 設定
AZP_PLACEHOLDER
環境變數,可設定代理程式容器註冊為離線預留位置代理程式,而無須執行作業。執行手動作業以建立預留位置代理程式。
az containerapp job start -n "$PLACEHOLDER_JOB_NAME" -g "$RESOURCE_GROUP"
列出作業的執行,以確認作業執行已建立並順利完成。
az containerapp job execution list \ --name "$PLACEHOLDER_JOB_NAME" \ --resource-group "$RESOURCE_GROUP" \ --output table \ --query '[].{Status: properties.status, Name: name, StartTime: properties.startTime}'
確認已在 Azure DevOps 中建立預留位置代理程式。
- 在 Azure DevOps 中,瀏覽至您的專案。
- 選取 [專案設定] > [代理程式集區] > [container-apps] > [代理程式]。
- 確認已列出名為
placeholder-agent
的預留位置代理程式,且其狀態為離線。
不再需要此作業。 您可以刪除它。
az containerapp job delete -n "$PLACEHOLDER_JOB_NAME" -g "$RESOURCE_GROUP"
建立自我裝載式代理程式作為事件驅動作業
既然您已有預留位置代理程式,則可以建立自我裝載式代理程式。 在本節中,您會建立事件驅動作業,以在觸發管線時執行自我裝載式代理程式。
az containerapp job create -n "$JOB_NAME" -g "$RESOURCE_GROUP" --environment "$ENVIRONMENT" \
--trigger-type Event \
--replica-timeout 1800 \
--replica-retry-limit 0 \
--replica-completion-count 1 \
--parallelism 1 \
--image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" \
--min-executions 0 \
--max-executions 10 \
--polling-interval 30 \
--scale-rule-name "azure-pipelines" \
--scale-rule-type "azure-pipelines" \
--scale-rule-metadata "poolName=$AZP_POOL" "targetPipelinesQueueLength=1" \
--scale-rule-auth "personalAccessToken=personal-access-token" "organizationURL=organization-url" \
--cpu "2.0" \
--memory "4Gi" \
--secrets "personal-access-token=$AZP_TOKEN" "organization-url=$ORGANIZATION_URL" \
--env-vars "AZP_TOKEN=secretref:personal-access-token" "AZP_URL=secretref:organization-url" "AZP_POOL=$AZP_POOL" \
--registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io"
下表描述命令中使用的調整規則參數。
參數 | 描述 |
---|---|
--min-executions |
每個輪詢間隔要執行的作業執行數目下限。 |
--max-executions |
每個輪詢間隔要執行的作業執行數目上限。 |
--polling-interval |
評估調整規則的輪詢間隔。 |
--scale-rule-name |
調整規則的名稱。 |
--scale-rule-type |
要使用的調整規則類型。 若要深入了解 Azure Pipelines 調整工具,請參閱 KEDA 文件 (英文)。 |
--scale-rule-metadata |
調整規則的中繼資料。 |
--scale-rule-auth |
調整規則的驗證。 |
調整規則設定會定義要監視的事件來源。 其會在每個輪詢間隔進行評估,並判斷要觸發的作業執行數目。 若要深入了解,請參閱設定調整規則 (部分機器翻譯)。
系統現在會在容器應用程式環境中建立事件驅動作業。
執行管線並確認作業
既然您已設定自我裝載式代理程式作業,現在可以執行管線並確認其是否正常運作。
在 Azure DevOps 專案的左側導覽中,瀏覽至 [Pipelines]。
選取 [建立準銷售案源]。
選取 [Azure Repos Git] 做為程式碼的位置。
選取您先前建立的存放庫。
選取 [入門管線]。
在管線 YAML 中,將
pool
從vmImage: ubuntu-latest
變更為name: container-apps
。pool: name: container-apps
選取儲存並執行。
管線會執行並使用您在容器應用程式環境中建立的自我裝載式代理程式作業。
列出作業的執行,以確認作業執行已建立並順利完成。
az containerapp job execution list \ --name "$JOB_NAME" \ --resource-group "$RESOURCE_GROUP" \ --output table \ --query '[].{Status: properties.status, Name: name, StartTime: properties.startTime}'
提示
有問題嗎? 在 Azure 容器應用程式存放庫中提出問題,讓我們在 GitHub 上了解該問題。
清除資源
完成後,請執行下列命令來刪除包含您容器應用程式資源的資源群組。
警告
下列命令會刪除指定的資源群組和其中包含的所有資源。 如果本教學課程範圍以外的資源存在於指定的資源群組中,則也會一併刪除。
az group delete \
--resource-group $RESOURCE_GROUP
若要刪除 GitHub 存放庫,請參閱刪除存放庫 (英文)。