使用 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 应用程序

使用ACR Task在云中自动化生成容器镜像

通过 Terraform Helm 提供程序和 Azure DevOps 部署 helm 图表,同时从 ACR 获取 helm 图表