如何在Azure Pipeline中获取任务结果变量并检查Docker镜像推送状态?
解决方案
1. 添加镜像检查步骤(失败时终止流水线)
你可以在推送步骤后新增一个script任务,通过判断docker image inspect的退出码来控制流水线状态。当退出码为1时,手动返回错误码触发流水线失败。
修改后的完整Pipeline配置如下:
stages: - stage: A jobs: - job: build steps: - script: docker image build -t repo/myimage:1 . displayName: "构建Docker镜像" - script: docker push repo/myimage:1 displayName: "推送Docker镜像到仓库" - script: | # 执行镜像检查命令 docker image inspect repo/myimage:1 # 判断退出码,1表示镜像不存在 if [ $? -eq 1 ]; then echo "错误:镜像repo/myimage:1未成功推送到仓库" # 返回错误码,标记任务失败 exit 1 fi displayName: "检查镜像是否推送成功"
说明:
$?是bash环境中获取上一条命令退出码的变量,对应docker image inspect的返回值exit 1会让当前script任务标记为失败,进而终止整个流水线
如果使用Windows CMD环境,语法调整为:
- script: | docker image inspect repo/myimage:1 if %errorlevel% equ 1 ( echo 错误:镜像repo/myimage:1未成功推送到仓库 exit /b 1 ) displayName: "检查镜像是否推送成功"
2. 在任务结果中获取Azure Pipeline变量
2.1 获取预定义系统变量
Azure Pipeline提供大量预定义变量(如构建ID、分支名等),直接通过$(变量名)的形式在任务中引用即可:
示例:在script任务中打印常用预定义变量
- script: | echo 当前构建ID:$(Build.BuildId) echo 当前触发分支:$(Build.SourceBranchName) echo 工件暂存目录:$(Build.ArtifactStagingDirectory) displayName: "打印预定义系统变量"
2.2 传递并获取自定义输出变量
如果需要在任务或作业之间传递变量,可通过输出变量机制实现:
步骤1:在前置任务中设置输出变量
- script: | # 执行镜像检查并将退出码设为输出变量 docker image inspect repo/myimage:1 echo "##vso[task.setvariable variable=inspectExitCode;isOutput=true]$?" name: ImageInspectTask displayName: "执行镜像检查并设置输出变量"
name: ImageInspectTask:给当前任务命名,用于后续引用输出变量##vso[task.setvariable...]:Azure Pipeline日志命令,isOutput=true标记变量为可跨任务输出
步骤2:在同作业后续任务中引用
直接通过$(任务名.变量名)格式调用:
- script: | echo 镜像检查退出码:$(ImageInspectTask.inspectExitCode) if [ $(ImageInspectTask.inspectExitCode) -eq 1 ]; then echo "镜像推送失败" exit 1 fi displayName: "使用输出变量判断结果"
步骤3:跨作业引用输出变量
需先设置作业依赖,再通过dependencies对象获取:
stages: - stage: A jobs: - job: build steps: - script: | docker image inspect repo/myimage:1 echo "##vso[task.setvariable variable=inspectExitCode;isOutput=true]$?" name: ImageInspectTask - job: check dependsOn: build variables: inspectCode: $[ dependencies.build.outputs['ImageInspectTask.inspectExitCode'] ] steps: - script: | echo 跨作业获取的退出码:$(inspectCode)
内容的提问来源于stack exchange,提问作者barteloma
相关产品推荐
相关产品推荐

