Azure Pipeline如何仅在artifact存在时下载并发布构件
实现方案
你可以通过变量+执行条件的配置实现需求,以下是两种常用的可落地方案:
方案1:通过构建任务的输出变量控制后续任务执行
这是最严谨的方案,直接基于构建任务的执行状态判断:
- 给你的首个构建任务设置自定义名称,比如命名为
buildJob,在构建任务的执行逻辑末尾,添加变量输出代码:
如果检测到变更且已生成产物,执行命令输出标记变量:echo "##vso[task.setvariable variable=artifactExists;isOutput=true]true"
如果没有变更未生成产物,输出:echo "##vso[task.setvariable variable=artifactExists;isOutput=true]false" - 给第二个artifact下载任务添加执行条件:
condition: eq(dependencies.buildJob.outputs['buildJob.artifactExists'], 'true')
配置后只有构建任务生成了产物,下载任务才会执行,否则直接跳过不会报错。 - 第三个后续任务也可以复用同一个执行条件,或者额外叠加目录检测逻辑。
方案2:前置检测产物存在性再执行后续任务
如果不想修改原有构建任务的逻辑,可以新增一个前置检测任务做判断:
- 新增一个无需执行条件的Shell/PowerShell检测任务,每次流程都会运行,逻辑如下(以Windows代理PowerShell为例):
$targetPath = "$(Build.ArtifactStagingDirectory)\你的产物目录名" if (Test-Path $targetPath) { echo "##vso[task.setvariable variable=runFollowTask]true" } else { echo "##vso[task.setvariable variable=runFollowTask]false" } - 给下载、后续任务都配置执行条件:
condition: eq(variables['runFollowTask'], 'true')即可,检测到产物不存在时后续任务全部跳过,流程直接正常结束不会失败。
额外提示
如果只是想避免下载任务报错打断流程,也可以直接给下载任务配置continueOnError: true,就算找不到对应artifact也不会终止流程,再配合后续任务的目录检测判断是否执行即可,不过该方案严谨性低于前两种。
内容的提问来源于stack exchange,提问作者IsraGab
相关产品推荐
相关产品推荐

