使用 Yaml 管道在同一阶段重试作业时如何从上次作业执行中下载工件?

How to download artifacts from the last job execution when retrying a job in the same stage using Yaml pipelines?

我有一个阶段有 3 个作业:
作业 A -> 始终发布工件
作业 B -> 始终发布工件
作业 C -> 依赖并使用来自作业 A 和作业 B 的工件

作业 A 和 B 失败后可以重试。

理想情况下,作业 A 和 B 会覆盖重试时生成的工件,但 Yaml 管道不允许删除工件,建议的解决方法是将作业 ID 放在工件名称中。

在以下情况下,如何从作业 C 中的作业 A 和 B 获取正确的工件:
管道已执行且作业 A 成功但作业 B 失败 - 两者仍发布工件导致:
JobA_Artifact1
JobB_Artifact1

重试失败的作业 B 并成功,但我们最终得到以下工件:
JobA_Artifact1
JobB_Artifact1
JobB_Artifact2

在作业 C 中 - 我现在如何从作业 A(来自之前的执行)中获取最新的工件以及从作业 B 中获取最新的工件?我希望有比在工件末端贴一个计数器然后基本上向后搜索每个工件更好的方法。

How to download artifacts from the last job execution when retrying a job in the same stage using Yaml pipelines?

更新:

经过与kmxp的讨论,我发现我最初提供的方案并不适合他的情况。让我分享最后的解决方法。

由于工件不在构建代理本地,而是发布到构建管道工件,因此我们无法使用某些脚本手动清理它。

要解决这个问题,我们可以使用工件名称的变量,例如:

工作 A 和工作 B:

- powershell: |
    echo "##vso[task.setvariable variable=artifactJobId;isOutput=true]$(System.JobId)"
  Name: setArtifactJobId

工作 C:

variables: 
  JobAArtifactId: $[ dependencies.JobA.outputs['setArtifactJobId.artifactJobId'] ]

但还有另一种情况,当JobA或Jobb失败时,无法从Job C访问该变量。我们可以为上述 powershell 任务添加条件 succeededOrFailed():

- powershell: |
    echo "##vso[task.setvariable variable=artifactJobId;isOutput=true]$(System.JobId)"
  Name: setArtifactJobId
  condition: succeededOrFailed()