使用 ACR(天蓝色容器注册表)作为 Azure Devops json 管道的输入
Posted
技术标签:
【中文标题】使用 ACR(天蓝色容器注册表)作为 Azure Devops json 管道的输入【英文标题】:Use ACR ( azure container registry) as input to Azure Devops json pipeline 【发布时间】:2021-02-03 06:10:34 【问题描述】:无法找到将 ACR 中的图像作为工件传递到 Azure DevOps 管道 JSON 的方法。 换句话说,我正在尝试从 Azure DevOps Releases 复制工件(参见附图),希望用户在运行 JSON 管道时可以选择从 ACR 中选择图像。
Image from ACR as artifact in Azure DevOps Releases
【问题讨论】:
嗨,您有机会查看以下答案吗?进展如何?如果成功了,请您接受它作为答案。 【参考方案1】:您可以使用 container resources 来使用容器映像作为 yaml 管道的一部分。您可以使用runtime parameters 允许用户在运行管道时选择图像。见下例:
1、定义运行时参数让用户选择图片。
parameters:
- name: ACRimage
type: string
default: image1
values:
- image1
- image2
- image3
然后当单击Run
运行管道时,用户将可以选择在管道中使用哪个图像。
2、在管道中添加 ACR 容器资源。
在您可以添加 ACR 容器资源之前。你需要创建Docker Registry service connection
然后您可以在管道中定义容器资源,如下所示:
resources:
containers:
- container: ACRimage
image: $parameters.ACRimage
endpoint: ACR-service-connection
所以完整的 yaml 管道如下所示:
parameters:
- name: ACRimage
type: string
default: image1
values:
- image1
- image2
- image3
resources:
containers:
- container: ACRimage
image: $parameters.ACRimage
endpoint: ACR-service-connection
trigger: none
pool:
vmImage: 'ubuntu-latest'
steps:
【讨论】:
谢谢李维。您将图像标签填充为列表值的建议可能会有所帮助,但目前需要针对我的用例动态更新标签列表。我没有找到任何方法用 ACR 中的实际标签列表动态更新这个标签列表。如果我这样做,将更新我的答案。【参考方案2】:您可以使用Container Resource Block
您可以为 Azure 容器使用一流的容器资源类型 注册表 (ACR) 以使用您的 ACR 图像。这种资源类型可以是 用作您的工作的一部分,也用于启用自动管道 触发器。
trigger:
- none # Disbale trigger on the repository itself
resources:
containers:
- container: string # identifier for the container resource
type: ACR
azureSubscription: string # Azure subscription (ARM service connection) for container registry;
resourceGroup: string # resource group for your ACR
registry: string # registry for container images
repository: string # name of the container image repository in ACR
trigger: true
如果您只想在某些标签上触发(或排除某些标签),您可以替换 trigger
值,如下所示
trigger:
tags:
include: [ string ] # image tags to consider the trigger events, defaults to any new tag
exclude: [ string ] # image tags on discard the trigger events, defaults to none
一个完整的管道示例:
trigger:
- none # Disable trigger on the repository itself
resources:
containers:
- container: myId # identifier for the container resource
type: ACR
azureSubscription: test # Azure subscription (ARM service connection) for container registry;
resourceGroup: registry # resource group for your ACR
registry: myregistry # registry for container images
repository: hello-world # name of the container image repository in ACR
trigger: true
pool:
vmImage: 'ubuntu-latest'
steps:
- bash: |
echo "The registry is: $(resources.container.myId.registry)"
echo "The repository is: $(resources.container.myId.repository)"
echo "The tag is: $(resources.container.myId.tag)"
如果您将新图像推送到 helloworld 存储库,则管道将启动
docker pull hello-world:latest
docker tag hello-world:latest myregistry.azurecr.io/hello-world:newtag
docker push hello-world:latest myregistry.azurecr.io/hello-world:newtag
脚本步骤的结果是
The registry is: myregistry
The repository is: hello-world
The tag is: newtag
【讨论】:
你好 Danielorn。谢谢,但 rerources.containers 用于在该容器中运行您的构建阶段。我不想这样做,不想传递图像标签并部署该图像。所以图像是我管道的工件。 @vibhoremiglani 这正是我的示例所做的。它在将新标签推送到指定的存储库时触发,然后您可以访问注册表、存储库名称和标签名称并使用它来拉取或部署映像。【参考方案3】:很抱歉通知这一点,但 azure yaml 管道不支持这一点。
danielorn 建议的“rerources.containers”,用于在该容器中运行构建阶段。我不想那样做。 目的是从用户部署获取图像标签并部署该图像。所以需要图像需要像在发布管道中一样作为工件传递。 遗憾的是,目前 YAMl 管道不支持此功能,我得到了一个天蓝色团队的确认。
【讨论】:
您的声明“resources.containers
,用于在该容器中运行您的构建阶段”根本不正确,您将它与符合您的描述的jobs.container
混淆了。在我的示例中,您可以看到如何在图像更改时触发管道并访问触发管道的图像标签
您对您想要实现的目标的描述也有点不清楚,您是想在图像更改时触发管道(就像您在工件更新时触发管道)还是您只是提供用户的下拉列表中填充了特定图像的所有标签?以上是关于使用 ACR(天蓝色容器注册表)作为 Azure Devops json 管道的输入的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core在Azure Kubernetes Service中的部署和管理
如何授予 AKS 通过 terraform 访问 ACR 的权限?
如何从 Azure 容器应用服务向 Azure ACR 进行身份验证
使用 docker 和 azure 容器注册表在 azure kubernetes 中部署 Angular 和 Spring Boot 应用程序
通过 Terraform Helm 提供程序和 Azure DevOps 部署 helm 图表,同时从 ACR 获取 helm 图表