从 Azure Pipelines 部署到 Azure 容器应用
Azure 容器应用允许使用 Azure Pipelines 将修订版发布到容器应用。 将提交推送到 Azure DevOps 存储库时,会触发一个管道来更新容器注册表中的容器映像。 Azure 容器应用基于更新的容器映像创建新修订版。
管道由推送到存储库中特定分支的提交触发。 创建管道时,需要确定哪个分支是触发器。
容器应用 Azure Pipelines 任务
该任务支持以下方案:
- 从 Dockerfile 生成并部署到容器应用
- 在没有 Dockerfile 的情况下从源代码生成并部署到容器应用。 支持的语言包括 .NET、Java、Node.js、PHP 和 Python
- 将现有容器映像部署到容器应用
在生产版本中,此任务附带 Azure DevOps,且不再需要显式安装。 有关完整文档,请参阅 AzureContainerApps@1 - Azure 容器应用部署 v1 任务。
用法示例
下面是该任务的一些常见使用方案。 有关详细信息,请参阅任务的文档。
生成并部署到容器应用
以下代码片段演示如何从源代码生成容器映像并将其部署到容器应用。
steps:
- task: AzureContainerApps@1
inputs:
appSourcePath: '$(Build.SourcesDirectory)/src'
azureSubscription: 'my-subscription-service-connection'
acrName: 'myregistry'
containerAppName: 'my-container-app'
resourceGroup: 'my-container-app-rg'
该任务使用 appSourcePath
中的 Dockerfile 生成容器映像。 如果找不到 Dockerfile,该任务将尝试从 appSourcePath
中的源代码生成容器映像。
将现有容器映像部署到容器应用
以下代码片段演示如何将现有容器映像部署到容器应用。 该任务使用服务连接向注册表进行身份验证。 如果未为服务连接的标识分配注册表的 AcrPush
角色,请使用 acrUsername
和 acrPassword
输入参数提供注册表的管理员凭据。
steps:
- task: AzureContainerApps@1
inputs:
azureSubscription: 'my-subscription-service-connection'
containerAppName: 'my-container-app'
resourceGroup: 'my-container-app-rg'
imageToDeploy: 'myregistry.azurecr.cn/my-container-app:$(Build.BuildId)'
重要
如果你在单独的步骤中生成容器映像,请确保使用生成 ID 等唯一标记,而不要使用类似于 latest
的稳定标记。 有关详细信息,请参阅映像标记最佳做法。
向 Azure 容器注册表进行身份验证
Azure 容器应用任务需要向 Azure 容器注册表进行身份验证才能推送容器映像。 容器应用也需要向 Azure 容器注册表进行身份验证才能拉取容器映像。
为了推送映像,该任务将使用 azureSubscription
中提供的服务连接自动向 acrName
中指定的容器注册表进行身份验证。 如果未为服务连接的标识分配注册表的 AcrPush
角色,请使用 acrUsername
和 acrPassword
提供注册表的管理员凭据。
为了拉取映像,Azure 容器应用将使用托管标识(建议)或管理员凭据向 Azure 容器注册表进行身份验证。 若要使用托管标识,任务的目标容器应用必须配置为使用托管标识。 若要使用注册表的管理员凭据进行身份验证,请设置任务的 acrUsername
和 acrPassword
输入。
配置
执行以下步骤来配置 Azure DevOps 管道以部署到 Azure 容器应用。
- 为应用创建 Azure DevOps 存储库
- 创建启用了托管标识的容器应用
- 将 Azure 容器注册表的
AcrPull
角色分配到容器应用的托管标识 - 从 Azure DevOps 市场安装 Azure 容器应用任务
- 为 Azure 订阅配置 Azure DevOps 服务连接
- 创建 Azure DevOps 管道
先决条件
要求 | 说明 |
---|---|
Azure 帐户 | 如果没有,请创建一个试用版订阅。 需要拥有 Azure 订阅的“参与者”或“所有者”权限才能继续操作。 有关详细信息,请参阅使用 Azure 门户分配 Azure 角色。 |
Azure DevOps 项目 | 转到 Azure DevOps 并选择“免费开始”。 然后创建新项目。 |
Azure CLI | 安装 Azure CLI。 |
创建 Azure DevOps 存储库并克隆源代码
在创建管道之前,应用的源代码必须在存储库中。
登录到 Azure DevOps 并导航到你的项目。
打开“存储库”页。
在顶部导航栏中选择“存储库”下拉菜单,然后选择“导入存储库”。
输入以下信息并选择“导入”:
字段 Value 存储库类型 Git 克隆 URL https://github.com/Azure-Samples/containerapps-albumapi-csharp.git
名称 my-container-app
选择“克隆”以查看存储库 URL 并复制它。
打开终端并运行以下命令以克隆存储库:
git clone <REPOSITORY_URL> my-container-app
请将
<REPOSITORY_URL>
替换为复制的 URL。
创建容器应用并配置托管标识
执行以下步骤使用 az containerapp up
命令创建容器应用。 此命令将创建 Azure 资源,生成容器映像,将映像存储在注册表中,然后将其部署到容器应用。
创建应用后,可将托管标识添加到该应用,并为该标识分配 AcrPull
角色,以允许该标识从注册表中拉取映像。
切换到克隆的存储库的 src 文件夹。
cd my-container-app cd src
使用
az containerapp up
命令创建 Azure 资源并部署容器应用。az containerapp up \ --name my-container-app \ --source . \ --ingress external
在命令输出中,记下 Azure 容器注册表的名称。
获取容器注册表的完整资源 ID。
az acr show --name <ACR_NAME> --query id --output tsv
将
<ACR_NAME>
替换为注册表的名称。为容器应用启用托管标识。
az containerapp identity assign \ --name my-container-app \ --resource-group my-container-app-rg \ --system-assigned \ --output tsv
在命令输出中,记下托管标识的主体 ID。
将 Azure 容器注册表的
AcrPull
角色分配到容器应用的托管标识。az role assignment create \ --assignee <MANAGED_IDENTITY_PRINCIPAL_ID> \ --role AcrPull \ --scope <ACR_RESOURCE_ID>
请将
<MANAGED_IDENTITY_PRINCIPAL_ID>
替换为托管标识的主体 ID,并将<ACR_RESOURCE_ID>
替换为 Azure 容器注册表的资源 ID。配置容器应用以使用托管标识从 Azure 容器注册表中拉取映像。
az containerapp registry set \ --name my-container-app \ --resource-group my-container-app-rg \ --server <ACR_NAME>.azurecr.io \ --identity system
将
<ACR_NAME>
替换为 Azure 容器注册表的名称。
创建 Azure DevOps 服务连接
若要部署到 Azure 容器应用,需要为 Azure 订阅创建一个 Azure DevOps 服务连接。
在 Azure DevOps 中选择“项目设置”。
选择“服务连接”。
选择“新建服务连接”。
选择“Azure 资源管理器”。
选择“服务主体(自动)”,然后选择“下一步”。
输入以下信息并选择“保存”:
字段 值 订阅 选择 Azure 订阅。 资源组 选择包含你的容器应用和容器注册表的资源组 ( my-container-app-rg
)。服务连接名称 my-subscription-service-connection
若要详细了解服务连接,请参阅连接到 Azure。
创建 Azure DevOps YAML 管道
在你的 Azure DevOps 项目中,选择“管道”。
选择“新建管道”。
选择“Azure Repos Git”。
选择包含你的源代码的存储库 (
my-container-app
)。选择“初学者管道”。
在编辑器中,将文件内容替换为以下 YAML:
trigger: branches: include: - main pool: vmImage: ubuntu-latest steps: - task: AzureContainerApps@1 inputs: appSourcePath: '$(Build.SourcesDirectory)/src' azureSubscription: '<AZURE_SUBSCRIPTION_SERVICE_CONNECTION>' acrName: '<ACR_NAME>' containerAppName: 'my-container-app' resourceGroup: 'my-container-app-rg'
请将
<AZURE_SUBSCRIPTION_SERVICE_CONNECTION>
替换为在上一步骤中创建的 Azure DevOps 服务连接的名称 (my-subscription-service-connection
),并将<ACR_NAME>
替换为你的 Azure 容器注册表的名称。选择“保存并运行”。
Azure Pipelines 运行将开始生成并部署你的容器应用。 若要检查进度,请导航到“管道”并选择该运行。 在执行第一个管道运行期间,系统可能会提示你授权管道使用你的服务连接。
若要部署应用的新修订版,请将新提交推送到 main 分支。