Azure DevOps推送至AWS ECR的Docker镜像标签递增及latest设置方案
解决方案
要实现自动递增修订号和添加latest标签的需求,你可以按以下步骤修改Azure DevOps流水线配置:
1. 添加获取最新修订号的步骤
在登录AWS的步骤之后,新增一个脚本步骤来查询ECR仓库中当前的最新修订号,并计算出下一个版本号:
- script: | # 获取所有符合 MAIN_VERSION.SUB_VERSION.* 格式的镜像标签 TAGS=$(aws ecr list-images --repository-name $(REPOSITORY_NAME) --region $(AWS_REGION) --query 'imageIds[*].imageTag' --output text | grep "^$(MAIN_VERSION).$(SUB_VERSION)\." | sort -V) # 如果没有找到对应标签,默认修订号为0 if [ -z "$TAGS" ]; then NEW_REVISION=0 else # 提取最新标签的修订号并加1 LATEST_TAG=$(echo "$TAGS" | tail -n 1) REVISION=$(echo "$LATEST_TAG" | cut -d '.' -f 3) NEW_REVISION=$((REVISION + 1)) fi # 将新修订号设置为流水线变量 echo "##vso[task.setvariable variable=NEW_REVISION]$NEW_REVISION" displayName: 'Calculate new revision number' env: AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID) AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY)
注意:需要确保
$(REPOSITORY_NAME)变量已在dev变量组中定义,或者直接替换为你的ECR仓库名称。
2. 修改Docker任务,使用新修订号并添加latest标签
更新Docker@2任务的tags字段,同时指定递增后的版本标签和latest标签:
- task: Docker@2 displayName: Build docker image inputs: repository: $(REPOSITORY_URI) command: buildAndPush tags: | $(MAIN_VERSION).$(SUB_VERSION).$(NEW_REVISION) latest
完整修改后的流水线配置
整合后的完整yaml代码如下:
# Docker # Build a Docker image trigger: - master resources: - repo: self variables: - group: dev stages: - stage: Build displayName: Build image jobs: - job: Build displayName: Build pool: vmImage: ubuntu-latest steps: - script: | aws ecr get-login-password --region $(AWS_REGION) | docker login --username AWS --password-stdin $(AWS_ACCOUNT_ID).dkr.ecr.$(AWS_REGION).amazonaws.com displayName: 'Login to AWS' env: AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID) AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY) - script: | TAGS=$(aws ecr list-images --repository-name $(REPOSITORY_NAME) --region $(AWS_REGION) --query 'imageIds[*].imageTag' --output text | grep "^$(MAIN_VERSION).$(SUB_VERSION)\." | sort -V) if [ -z "$TAGS" ]; then NEW_REVISION=0 else LATEST_TAG=$(echo "$TAGS" | tail -n 1) REVISION=$(echo "$LATEST_TAG" | cut -d '.' -f 3) NEW_REVISION=$((REVISION + 1)) fi echo "##vso[task.setvariable variable=NEW_REVISION]$NEW_REVISION" displayName: 'Calculate new revision number' env: AWS_ACCESS_KEY_ID: $(AWS_ACCESS_KEY_ID) AWS_SECRET_ACCESS_KEY: $(AWS_SECRET_ACCESS_KEY) - task: Docker@2 displayName: Build docker image inputs: repository: $(REPOSITORY_URI) command: buildAndPush tags: | $(MAIN_VERSION).$(SUB_VERSION).$(NEW_REVISION) latest
关键说明
- 脚本通过
aws ecr list-images获取所有标签,用grep过滤出匹配主版本和次版本的标签,再用sort -V按版本号排序,确保拿到最新的修订号。 - 如果是第一次构建(无对应标签),修订号默认从0开始,生成
MAIN_VERSION.SUB_VERSION.0的标签。 - Docker任务的
tags字段支持多行输入,同时推送递增版本标签和latest标签到ECR。
内容的提问来源于stack exchange,提问作者Itzik.B
相关产品推荐
相关产品推荐

