Azure devops 如何构建Docker映像,然后使用构建的映像运行测试

Azure devops 如何构建Docker映像,然后使用构建的映像运行测试,azure-devops,azure-pipelines,azure-pipelines-build-task,Azure Devops,Azure Pipelines,Azure Pipelines Build Task,我想使用Azure管道构建Docker映像,然后使用容器作业在构建的映像内运行测试 映像应使用生成id作为标记(或生成id、提交哈希和分支名称的组合)。如果我使用一个静态标记作为值(例如,build),让两个管道并行运行可能会导致不必要的争用情况 构建步骤非常简单-登录、构建并推送到Docker Hub 但是,在指定使用容器的测试作业时,我无法使用变量 下面是一个有效的示例,但它不使用私有注册表 variables: - group: dockerCredentials # cont

我想使用Azure管道构建Docker映像,然后使用容器作业在构建的映像内运行测试

映像应使用生成id作为标记(或生成id、提交哈希和分支名称的组合)。如果我使用一个静态标记作为值(例如,
build
),让两个管道并行运行可能会导致不必要的争用情况

构建步骤非常简单-登录、构建并推送到Docker Hub

但是,在指定使用容器的测试作业时,我无法使用变量

下面是一个有效的示例,但它不使用私有注册表

variables:
  - group: dockerCredentials
    # contains: dockerUsername, dockerPassword
  - name: imageName
    value: azure-pipelines-test
  - name: dockerRegistry
    value: krsb
  - name: fullImageName
    value:

jobs:
- job: build
  pool:
    vmImage: 'Ubuntu-16.04'
  steps:
  - script: |
      docker login -u $(dockerUsername) -p $(dockerPassword)
      docker build -t '$(dockerRegistry)/$(imageName):$(build.buildId)' .
      docker push '$(dockerRegistry)/$(imageName):$(build.buildId)'
    displayName: 'docker build'

- job: test
  dependsOn:
  - build
  pool:
    vmImage: ubuntu-16.04
  container:
    image: $[ format('{0}/{1}:{2}', variables['dockerRegistry'], variables['imageName'], variables['build.buildId']) ]
    endpoint: docker-hub-registry
  steps:
  - script: printenv
如果要使用私有注册表,我不将容器指定为字符串,而是使用此语法(Docker hub凭据在端点中指定):

使用此语法时,无法使用
$[variables['name']]
语法,此语法未展开,管道运行时会输出错误:

##[command]/usr/bin/docker pull $[ format('{0}:{1}', variables['imageName'], variables['build.buildId']) ]
"docker pull" requires exactly 1 argument.
如果我使用
$(imageName):$(build.buildId)
,情况也是如此


是否可以在映像名称中使用变量?

我测试了这个管道,它工作得非常好-适用于docker hub和专用ACR。您使用的是什么私有注册表?另外,在构建作业中,您直接使用
docker login
,在测试作业中使用
docker hub registry
服务连接-确保它们匹配,并且管道尝试从推送到的同一注册表中提取映像。这个问题是几年前发布的,因此可能已经实现了。我现在没有使用Azure DevOps,所以我没有任何方法来测试它。如果它能工作,那就好了——我相信这是一个可以加快管道速度的功能。
##[command]/usr/bin/docker pull $[ format('{0}:{1}', variables['imageName'], variables['build.buildId']) ]
"docker pull" requires exactly 1 argument.