教程:使用 Azure Container Apps 任务部署自托管 CI/CD 运行程序和代理

GitHub Actions和Azure Pipelines允许使用自承载运行程序和代理运行 CI/CD 工作流。 可以使用事件驱动的 Azure 容器应用作业来运行自托管的运行器和代理。

当工作流需要访问本地资源或工具,而这些资源或工具在云托管运行器中不可用时,自托管运行器非常有用。 例如,在容器应用作业中的自托管运行器允许您的工作流访问云托管运行器无法访问的作业虚拟网络内的资源。

以事件驱动的作业方式运行自托管运行器,可以让您使用 Azure 容器应用的无服务器特性。 作业在触发工作流时自动执行,并在作业完成时退出。

您只需支付作业运行时间的费用。

本教程介绍如何将GitHub Actions运行程序作为 event 驱动的容器应用作业运行。

  • 创建容器应用程序环境以部署自托管运行器
  • 创建用于运行使用自承载运行程序的工作流的GitHub存储库
  • 生成运行GitHub Actions运行程序的容器映像
  • 将运行器作为作业部署到容器应用环境
  • 创建使用自承载运行器的工作流并验证其是否运行

重要

仅建议将自托管运行器用于私有存储库。 使用自托管运行器与公共存储库可能会导致执行危险代码。 有关更多信息,请参阅自托管运行器的安全性

注意

每个个人访问令牌 (PAT) 都有到期日期。 请确保在到期日期之前定期轮换 PAT。 有关管理 PAT 的详细信息,请参阅使用个人访问令牌

本教程介绍如何将Azure Pipelines代理作为 event 驱动的容器应用作业运行。

  • 创建容器应用环境以部署自托管代理
  • 创建Azure DevOps组织和项目
  • 生成运行Azure Pipelines代理的容器映像
  • 使用手动任务在容器应用环境中创建一个占位符代理
  • 将代理作为作业部署到容器应用环境
  • 创建使用自托管代理的管道并验证其是否运行

重要

仅建议在私有项目中使用自托管代理。 在公共项目中使用这些内容可能会导致在自托管代理上执行危险代码。 有关详细信息,请参阅自托管代理安全

注意

每个个人访问令牌 (PAT) 都有到期日期。 请确保在到期日期之前定期轮换 PAT。 有关管理 PAT 的详细信息,请参阅使用个人访问令牌

注意

容器应用和作业不支持在容器中运行 Docker。 在容器应用作业中的自承载运行器或代理上运行时,使用 Docker 命令的工作流中的任何步骤都会失败。

先决条件

有关限制列表,请参阅作业限制

设置

若要从 CLI 登录到Azure,请运行以下命令,并按照提示完成身份验证过程。

az cloud set -n AzureChinaCloud
az login
# az cloud set -n AzureCloud   //means return to Public Azure.

为了确保运行最新版本的 CLI,请运行升级命令。

az upgrade

接下来,安装或更新 CLI 的 Azure Container Apps 扩展。

如果在 PowerShell 中的 az containerapp 模块中运行 Azure CLI 或 cmdlet 中的 Az.App 命令时收到有关缺少参数的错误,请确保安装了最新版本的 Azure Container Apps 扩展。

az extension add --name containerapp --upgrade

注意

从 2024 年 5 月开始,Azure CLI扩展默认不再启用预览功能。 要访问容器应用预览功能,请使用 --allow-preview true 安装容器应用扩展。

az extension add --name containerapp --upgrade --allow-preview true

安装当前扩展或模块后,请注册 Microsoft.AppMicrosoft.OperationalInsights 命名空间。

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

创建环境变量

完成Azure CLI设置后,可以定义本文中使用的环境变量。

RESOURCE_GROUP="jobs-sample"
LOCATION="chinanorth3"
ENVIRONMENT="env-jobs-sample"
JOB_NAME="github-actions-runner-job"
RESOURCE_GROUP="jobs-sample"
LOCATION="chinanorth3"
ENVIRONMENT="env-jobs-sample"
JOB_NAME="azure-pipelines-agent-job"
PLACEHOLDER_JOB_NAME="placeholder-agent-job"

创建容器应用环境

Azure Container Apps环境充当容器应用和作业的安全边界,以便它们可以共享同一网络并相互通信。

注意

若要创建与现有虚拟网络集成的容器应用环境,请参阅将虚拟网络部署到Azure Container Apps环境

  1. 使用以下命令创建资源组。

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. 使用以下命令创建容器应用环境。

    az containerapp env create \
        --name "$ENVIRONMENT" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION"
    

创建用于运行工作流的GitHub存储库

若要运行工作流,需要创建包含工作流定义的GitHub存储库。

  1. 转到 GitHub 并登录。

  2. 通过输入以下值创建新的存储库。

    设置
    所有者 选择GitHub用户名。
    存储库名称 为存储库输入名称。
    能见度 选择“专用”
    初始化此存储库 选择“添加 README 文件”。

    使用其他设置的默认值。

  3. 选择“创建存储库”。

  4. 在新存储库中,选择“操作”

  5. 搜索“简单工作流”模板,然后选择“配置”

  6. 选择“提交更改”,将此工作流添加到存储库

工作流在 ubuntu-latest GitHub 托管的运行程序上运行,并将消息输出到控制台。 稍后,你将GitHub托管的运行程序替换为自承载运行程序。

获取GitHub个人访问令牌

若要运行自托管运行器,需要在 GitHub 中创建个人访问令牌 (PAT)。 每次运行程序启动时,PAT 都会生成一个令牌,用于向GitHub注册运行程序。 GitHub Actions运行程序缩放规则使用 PAT 监视存储库的工作流队列,并根据需要启动运行程序。

注意

个人访问令牌(PAT)过期。 定期轮换令牌,使其保持有效并维护不间断的服务。

  1. 在GitHub中,选择右上角的个人资料图片,然后选择Settings

  2. 选择“开发人员设置”。

  3. 个人访问令牌下,选择细粒度令牌

  4. 选择“生成新令牌”

  5. 在“新的细粒度个人访问令牌”屏幕中,输入以下值

    设置
    令牌名称 输入令牌的名称。
    到期日期 选择“30 天”
    存储库访问 选择“仅选择存储库”,然后选择已创建的存储库

    为“存储库权限”输入以下值

    设置
    动作 选择“只读”
    管理 选择“读取和写入”
    元数据 选择“只读”
  6. 选择“生成令牌”。

  7. 复制令牌值。

  8. 定义稍后用于配置运行器和扩展规则的变量。

    GITHUB_PAT="<GITHUB_PAT>"
    REPO_OWNER="<REPO_OWNER>"
    REPO_NAME="<REPO_NAME>"
    REGISTRATION_TOKEN_API_URL="<YOUR_REGISTRATION_TOKEN_API_URL>"
    

    将占位符替换为以下值:

    占位符
    <GITHUB_PAT> 你生成的 GitHub PAT。
    <REPO_OWNER> 之前创建的存储库的所有者。 此值通常是GitHub用户名。
    <REPO_NAME> 之前创建的存储库的名称。 此值与在“存储库名称”字段中输入的名称相同
    <YOUR_REGISTRATION_TOKEN_API_URL> entrypoint.sh 文件中的注册令牌 API URL。 例如“https://myapi.example.com/get-token”

生成GitHub Actions运行器容器镜像

若要创建自承载运行器,需要生成执行运行器的容器映像。 在本节中,将生成容器映像并将其推送到容器注册表。

注意

本教程中生成的映像包含一个适合作为容器应用作业运行的基本自承载运行器。 可以自定义它以包含工作流所需的其他工具或依赖项。

  1. 定义容器映像和注册表的名称。

    CONTAINER_IMAGE_NAME="github-actions-runner:1.0"
    CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
    

    <CONTAINER_REGISTRY_NAME> 替换为用于创建容器注册表的唯一名称。 容器注册表名称必须在 Azure 中统一,长度必须为 5 到 50 个字符,且长度仅包含数字和小写字母。

  2. 创建容器注册表。

    az acr create \
        --name "$CONTAINER_REGISTRY_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Basic
    
  3. 您的容器注册表必须允许 Azure 资源管理器 (ARM) 受众令牌进行身份验证,以便使用托管身份拉取镜像。

    使用以下命令检查是否允许 ARM 令牌访问Azure Container Registry(ACR)。

    az acr config authentication-as-arm show --registry "$CONTAINER_REGISTRY_NAME"
    

    如果允许 ARM 令牌,命令将输出以下内容。

    {
      "status": "enabled"
    }
    

    status disabled如果是,请使用以下命令允许 ARM 令牌。

    az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled
    
  4. 用于创建运行程序映像的 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"
    

    映像现已在容器注册表中可用。

创建用户分配的托管标识

为了避免使用管理凭据,请使用托管标识进行身份验证,从Azure Container Registry中的专用存储库拉取映像。 如果可能,请使用用户分配的托管标识来拉取映像。

  1. 创建用户分配的托管标识。 在运行以下命令之前,请选择托管标识的名称,并将 \<PLACEHOLDER\> 替换为该名称。

    IDENTITY="<YOUR_IDENTITY_NAME>"
    
    az identity create \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP
    
  2. 获取标识的资源 ID。

    IDENTITY_ID=$(az identity show \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP \
        --query id \
        --output tsv)
    

将自承载运行器部署为作业

现在可以创建使用容器映像的作业。 在本部分中,你将创建一个作业,该作业运行自承载运行程序,并使用前面生成的 PAT 通过 GitHub 进行身份验证。 作业使用 github-runner 缩放规则根据待处理工作流运行数创建任务执行。

  1. 在容器应用环境中创建作业。

    az containerapp job create \
        --name "$JOB_NAME" \
        --resource-group "$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.cn/$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.cn" \
        --mi-user-assigned "$IDENTITY_ID" \
        --registry-identity "$IDENTITY_ID"
    

    下表描述了命令中使用的关键参数。

    参数 说明
    --replica-timeout 副本可以执行的最长时间。
    --replica-retry-limit 重试失败副本的次数。
    --replica-completion-count 在认为作业执行成功之前必须成功完成的副本数。
    --parallelism 每个作业执行时要启动的副本数量。
    --min-executions 每个轮询间隔内运行的任务最小执行次数。
    --max-executions 每个轮询间隔内执行的最大作业次数。
    --polling-interval 评估缩放规则的轮询间隔。
    --scale-rule-name 缩放规则的名称。
    --scale-rule-type 要使用的刻度规则的类型。 若要了解有关 GitHub Runner 调节器的详细信息,请参阅 KEDA 文档
    --scale-rule-metadata 缩放规则的元数据。 如果您在使用 GitHub Enterprise,请将其 API URL 更新为 githubAPIURL
    --scale-rule-auth 量规规则的身份验证。
    --secrets 完成任务的秘诀。
    --env-vars 作业要使用的环境变量。
    --registry-server 作业要使用的容器注册表服务器。 对于Azure Container Registry,该命令会自动配置身份验证。
    --mi-user-assigned 要分配给作业的用户指定的托管身份的资源 ID。
    --registry-identity 用于通过注册表服务器进行身份验证的托管标识的资源 ID,而无需使用用户名和密码。 如果可能,会自动为该标识创建“acrpull”角色分配。

    缩放规则配置定义要监视的事件源。 在每个轮询间隔评估规则,以确定要触发的作业执行次数。 有关详细信息,请参阅 “设置缩放规则”。

事件驱动作业现已在容器应用环境中创建。

运行工作流并验证作业

作业配置为每隔 30 秒评估一次缩放规则。 在每次评估期间,它会检查需要自托管运行器的挂起工作流,并为每个挂起的工作流启动一个新的作业执行,最多可配置10次执行。

若要验证作业配置,请修改工作流以使用自承载运行程序并触发工作流运行。 然后,可以查看作业执行日志以查看工作流运行。

  1. 在GitHub存储库中,转到之前生成的工作流。 它是 .github/workflows 目录中的 YAML 文件。

  2. 选择就地编辑

  3. 将属性 runs-on 更新为 self-hosted

    runs-on: self-hosted
    
  4. 选择“提交更改...”。

  5. 选择“提交更改”。

  6. 转到操作选项卡。

    新的工作流现已排队。 在 30 秒内,作业执行将启动,工作流将在不久后完成。

    等待操作完成,然后再执行下一步。

  7. 列出作业的执行,以确认作业执行已创建并成功完成。

    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项目和存储库。

  1. 转到 Azure DevOps 并登录到帐户。

  2. 选择现有组织或创建新组织。

  3. 在组织概述页中,选择“新建项目”并输入以下值

    设置
    项目名称 输入项目的名称。
    可见性 选择“专用”
  4. 选择创建

  5. 在侧导航中,选择Repos

  6. 使用自述文件或 .gitignore 初始化主分支下,选择添加自述文件

  7. 保留其余设置的默认值,然后选择“ 初始化”。

创建新代理池

创建新的代理池以运行自承载运行器。

  1. 在Azure DevOps project中,展开左侧导航栏,然后选择Project设置

    Azure DevOps项目设置按钮的Screenshot.

  2. 项目设置导航菜单的Pipelines部分下,选择代理池

    Azure DevOps 代理池按钮的截图。

  3. 选择“添加池”,然后输入以下值

    设置
    待链接的池 选择“新建”。
    池类型 选择自托管
    名称 输入container-apps
    向所有管道授予访问权限 选中此复选框。
  4. 选择创建

获取Azure DevOps个人访问令牌

若要运行自承载运行器,需要在 Azure DevOps 中创建个人访问令牌 (PAT)。 使用 PAT 通过 Azure DevOps 对运行程序进行身份验证。 缩放规则还利用令牌来检查待处理的管道运行数量,并触发新的作业内的执行。

注意

个人访问令牌(PAT)过期。 定期轮换令牌,使其保持有效并维护不间断的服务。

  1. 在Azure DevOps中,选择右上角个人资料图片旁边的User 设置

  2. 选择“个人访问令牌”。

  3. 在“个人访问令牌”页中,选择“新建令牌”并输入以下值

    设置
    名称 输入令牌的名称。
    组织 选择之前选择或创建的组织。
    作用域 选择“自定义”
    显示所有作用域 选择“显示所有范围”
    代理池(读取和管理) 选择“代理池(读取和管理)”

    将所有其他范围保留为未选中状态。

  4. 选择创建

  5. 将令牌值复制到安全位置。

    离开此页后,将无法检索令牌。

  6. 定义稍后用于配置容器应用作业的变量。

    AZP_TOKEN="<AZP_TOKEN>"
    ORGANIZATION_URL="<ORGANIZATION_URL>"
    AZP_POOL="container-apps"
    

    将占位符替换为以下值:

    占位符 注释
    <AZP_TOKEN> 你生成的 Azure DevOps PAT。
    <ORGANIZATION_URL> Azure DevOps组织的 URL。 请确保 URL 末尾没有多余的 / 例如,https://dev.azure.com/myorghttps://myorg.visualstudio.com

生成Azure Pipelines代理容器映像

若要创建自托管代理,需要生成运行代理的容器映像。 在本节中,将生成容器映像并将其推送到容器注册表。

注意

在本教程中,您构建的镜像包含一个基本的自托管代理,适合作为容器应用(Container Apps)作业运行。 可以自定义它以包含管道所需的其他工具或依赖项。

重要

如果管道生成.NET Framework 应用程序,则可能需要在容器映像中包含 Mono。 示例 Dockerfile 包括 .NET SDK,但不包括 Mono。 请考虑使用基于Windows的容器,或根据需要添加 Mono 依赖项。

  1. 返回终端,定义容器映像和注册表的名称。

    CONTAINER_IMAGE_NAME="azure-pipelines-agent:1.0"
    CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
    

    <CONTAINER_REGISTRY_NAME> 替换为用于创建容器注册表的唯一名称。

    容器注册表名称必须在 Azure 中统一,长度必须为 5 到 50 个字符,且长度仅包含数字和小写字母。

  2. 创建容器注册表。

    az acr create \
        --name "$CONTAINER_REGISTRY_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Basic \
        --admin-enabled true
    
  3. 用于创建运行程序映像的 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 Container Apps或Azure DevOps中的任何资源。

  1. 在容器应用环境中创建创建占位符代理的手动作业。

    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.cn/$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.cn"
    

    下表描述了命令中使用的关键参数。

    参数 说明
    --replica-timeout 副本可以执行的最长时间。
    --replica-retry-limit 重试失败副本的次数。
    --replica-completion-count 在认为作业执行成功之前必须成功完成的副本数。
    --parallelism 每个作业执行时要启动的副本数量。
    --secrets 完成任务的秘诀。
    --env-vars 作业要使用的环境变量。
    --registry-server 作业要使用的容器注册表服务器。 对于Azure Container Registry,该命令会自动配置身份验证。

    设置 AZP_PLACEHOLDER 环境变量会将代理容器配置为在不运行作业的情况下注册为脱机占位符代理。

  2. 执行手动任务以创建占位符代理。

    az containerapp job start -n "$PLACEHOLDER_JOB_NAME" -g "$RESOURCE_GROUP"
    
  3. 列出作业的执行,以确认作业执行已创建并成功完成。

    az containerapp job execution list \
        --name "$PLACEHOLDER_JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --output table \
        --query '[].{Status: properties.status, Name: name, StartTime: properties.startTime}'
    
  4. 验证占位符代理是否已在Azure DevOps中创建。

    1. 在Azure DevOps中,转到你的项目。
    2. 选择项目设置>代理池>container-apps>代理
    3. 请确认已列出名为placeholder-agent的占位符代理,其状态为离线。
  5. 你不再需要这份工作。 可以删除该帐户。

    az containerapp job delete -n "$PLACEHOLDER_JOB_NAME" -g "$RESOURCE_GROUP"
    

创建自托管代理器用于事件驱动的作业

创建占位符代理后,可以创建自承载代理。 在本节中,您将创建一个事件驱动的任务,当管道被触发时,此任务运行自托管代理。

重要

确保Azure DevOps组织 URL 正确且可访问。 KEDA azure 管道缩放程序需要适当的身份验证和网络连接来监视管道队列。

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.cn/$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.cn"

下表描述了命令中使用的缩放规则参数。

参数 说明
--min-executions 每个轮询间隔内运行的任务最小执行次数。
--max-executions 每个轮询间隔内执行的最大作业次数。
--polling-interval 评估缩放规则的轮询间隔。
--scale-rule-name 缩放规则的名称。
--scale-rule-type 要使用的刻度规则的类型。 若要了解有关Azure Pipelines缩放程序的详细信息,请参阅 KEDA documentation
--scale-rule-metadata 缩放规则的元数据。
--scale-rule-auth 量规规则的身份验证。

缩放规则配置定义要监视的事件源。 在每个轮询间隔评估规则,以确定要触发的作业执行次数。 有关详细信息,请参阅 “设置缩放规则”。

事件驱动作业现已在容器应用环境中创建。

运行流水线并验证任务

配置自承载代理作业后,运行管道以验证它是否正常工作。

  1. 在Azure DevOps项目的左侧导航中,转到 Pipelines

  2. 选择“创建管道”。

  3. 选择 Azure Repos Git 作为代码的位置。

  4. 选择之前创建的存储库。

  5. 选择“启动管道”。

  6. 在管道 YAML 中,将 poolvmImage: ubuntu-latest 更改为 name: container-apps

    pool:
      name: container-apps
    
  7. 选择“保存并运行”。

    流水线运行并使用您在容器应用环境中创建的自托管代理任务。

  8. 列出作业的执行,以确认作业执行已创建并成功完成。

    az containerapp job execution list \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --output table \
        --query '[].{Status: properties.status, Name: name, StartTime: properties.startTime}'
    

Troubleshooting

如果遇到自托管代理的问题,请尝试以下故障排除步骤。

管道作业保持排队状态,不会触发容器应用作业

如果管道保持排队状态且未触发作业执行,请尝试以下步骤:

  1. 验证缩放规则配置。 检查缩放规则元数据是否与Azure DevOps设置匹配。

    az containerapp job show \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --query "properties.configuration.eventTriggerConfig.scale.rules[0]"
    
  2. 确保个人访问令牌具有正确的权限且未过期。

  3. 容器应用环境必须能够访问Azure DevOps组织 URL,因此请验证环境中的网络连接。

  4. 检查轮询间隔。 默认轮询间隔为 30 秒。 如果需要,可以增加它,但此更改可能会延迟作业执行。

  5. 检查作业执行日志中是否有任何错误消息。

    az containerapp job execution list \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --output table
    

容器镜像中缺少依赖项

如果在生成 .NET Framework 应用程序时遇到“找不到可执行文件:'mono'”之类的错误:

  1. 使用适当的基础映像。 确保容器映像包含生成过程所需的所有依赖项。

  2. 如果需要在 Linux 上生成 .NET Framework 应用程序,请使用以下命令将 Mono 添加到容器映像:

    # Add to your Dockerfile
    RUN apt-get update && apt-get install -y mono-complete
    
  3. 请考虑 Windows 容器。 对于.NET框架应用程序,请考虑使用基于Windows的容器映像而不是 Linux。

  4. 对于版本,请使用 .NET Core/5+。 新式.NET版本不需要 Mono,并且适用于 Linux 容器。

代理注册问题

如果代理无法向Azure DevOps注册:

  1. 检查令牌权限。 确保 PAT 具有“代理池(读取和管理)”权限。

  2. 验证组织 URL。 请确保组织的网址正确,并且没有末尾斜杠。

  3. 检查代理池名称。 确认代理池名称在Azure DevOps和作业配置之间完全匹配。

提示

遇到问题? 在Azure Container Apps 存储库中打开一个问题,把您的建议告诉我们。

清理资源

完成后,运行以下命令以删除包含容器应用资源的资源组。

注意

以下命令删除指定的资源组及其包含的所有资源。 如果资源组包含本教程范围之外的资源,该命令也会删除这些资源。

az group delete \
    --resource-group $RESOURCE_GROUP

若要删除GitHub存储库,请参阅 Deleting a repository

后续步骤