Azure 发布管道:即使添加了替换镜像标签的步骤,Docker 镜像标签也不会被替换

Posted

技术标签:

【中文标题】Azure 发布管道:即使添加了替换镜像标签的步骤,Docker 镜像标签也不会被替换【英文标题】:Azure Release Pipeline: Docker Image Tag will not be replaced even after adding step to replace image tag 【发布时间】:2020-09-25 10:37:11 【问题描述】:

我正在使用经典编辑器创建发布管道以部署到 Azure Kubernetes 服务,但是,在 Azure Kubernetes 服务 (AKS) 中部署后,我不断收到 InvalidImageName 错误。问题是由于无法在 Azure 容器注册表 (ACR) 中找到指定的映像,其中 docker 映像标记 $TAG 变量似乎无法被管道 $(Build.BuildId) 中的内部版本号替换。

我的 Azure 容器注册表 (ACR) 存储库

aks中的错误截图:

我尝试在发布管道中创建变量以将值分配给 TAG 变量。此后,我继续创建一个“命令行”任务步骤,将值设置到 deployment.yml 文件中。 它正在设置如下所示的值。但是,当我运行kubectl apply 命令来运行deployment.yml 文件时,TAG 没有显示内部版本号。对此我将不胜感激。

在寻求帮助之前, 我已经从这个问题中尝试了一些 *** 答案,但无法这样做 How to kubernetes "kubectl apply" does not update existing deployments How to provide docker image tag dynamically to docker-compose.yml in Azure Release Pipeline Task?

【问题讨论】:

除了 infile 之外,当您尝试使用相同的文件作为源文件和目标文件时,您还需要指定输出文件。随意尝试我的答案,让我知道它是否有帮助:) 你好朋友,这个问题怎么样?下面的答案是否解决了您的问题,如果是,您可以Accept it as an Answer,这样它可以帮助遇到相同问题的其他社区成员,我们可以存档这个帖子,谢谢。 【参考方案1】:

你本来就做不到(至少目前是这样)。

但是,您可以使用例如 HELM 并将部署更改为图表。

另一种方法是使用token replace,而且工作量肯定比使用 HELM 少。为此(对于默认配置),您需要将语法更改为 #TAG#

如果你使用 linux 主机代理,你也可以考虑envsubst 然后

    - script: |
        envsubst '$TAG' < deployment-template.yaml > deployment.yaml
      displayName: Replace Environment Variables

我假设您使用$TAG 提交的文件名为deployment-template.yaml

【讨论】:

在显示名称为“替换环境变量”的任务中,我运行以下命令 - script: | envsubst '$TAG' &lt; deployment-template.yaml &gt; deployment.yaml displayName: Replace Environment Variables 它可以将图像标签更改为内部版本号,但是一旦继续执行下一个任务,图片标签回到 $TAG 我该如何使用 Helm 来解决这个问题?【参考方案2】:

不要直接运行envsubst '$TAG' &lt;deployment.yml,试试这个:

echo "$(envsubst '$TAG' <path\deployment.yml)" > path\deployment.yml

建议先导航(cd)到你的depolyment.yml文件所在的目录,然后运行命令echo "$(envsubst '$TAG' &lt;deployment.yml)" &gt; deployment.yml

有关您的问题的更多详细信息:

&lt; 表示 infile,您仍然需要使用 &gt; 将更改输出到一个文件。

检查注意 here:如果我们想使用相同的文件作为源文件和目标文件,我们将不得不使用类似moreutil的sponge。但是 sponge 在托管代理中不可用,所以我建议使用 echo "$(originalCommand)" &gt; outputfile 作为解决方法。

【讨论】:

【参考方案3】:

在构建阶段下的 azure-pipelines.yml 中有一个要添加标签的位置。

stages:
- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
          $(release)

对我来说它在第 42 行。 在标签部分,您可以添加更多标签变量 或者只是硬编码它们。 我上面的设置在 acr 中创建了 2 个标签,一个带有内部版本号,另一个带有在管道上设置的 $(release) 变量的内容。

两个标签都引用同一个清单。

【讨论】:

以上是关于Azure 发布管道:即使添加了替换镜像标签的步骤,Docker 镜像标签也不会被替换的主要内容,如果未能解决你的问题,请参考以下文章

枚举Azure管道中的秘密变量

Azure 中管道步骤中输入/输出参数的大小

在 azure-devops 中的发布管道期间创建标签

[错误] Bash 以代码“1”退出 - Azure YAML 管道中的替换错误

Azure DevOps Server 2020 - 如何编辑经典发布管道的描述和标签?

如何从 Azure ML 管道脚本步骤注册模型