【发布时间】:2019-10-13 16:13:02
【问题描述】:
给定 3 个 Azure DevOps Pipelines(可能还有更多),如下:
- 构建、单元测试、发布工件
- 部署暂存、集成测试
- 部署生产、冒烟测试
如何确保 Pipeline 3 下载 Pipeline 1 中发布的特定工件?
在我看来,挑战在于任务DownloadPipelineArtifact@2 仅在工件来自前一个管道时才提供执行此操作的方法。通过使用以下管道任务:
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'specific'
project: '$(System.TeamProjectId)'
definition: 1
specificBuildWithTriggering: true
buildVersionToDownload: 'latest'
artifactName: 'example.zip'
这适用于父“触发管道”,但不适用于祖父。相反,它返回错误消息:
找不到构建 nnn 的工件 example.zip。
其中 nnn 是直接前任的运行 ID,就好像我指定了 pipelineId: $(Build.TriggeredBy.BuildId)。实际上,Pipeline 3 尝试从 Pipeline 2 中检索 Pipeline 1 工件。如果 definition: 1 行做了一些事情会很好,但是,当设置了 specificBuildWithTriggering: true 时,它似乎什么都不做。
请注意,buildType: 'latest' 不安全;如果在管道 2 运行时从管道 1 发出,它似乎允许发布未经测试的工件。
DownloadPipelineArtifact@2 可能无法实现此目的。很难确定,因为the documentation 没有太多细节。也许还有另一种合理的方式来实现这一点......我想在每个中间管道上发布工件的另一个副本,即使是那些不使用它的管道,是一种方式,但不是很合理。我们可以通过发布一个记录了 BuildId 的工件来消除创建二进制文件副本的丑陋方面,但我们仍然必须从每个管道中检索并重新发布它。
如果有办法识别原始 CI 触发器,例如找到启动 GIT 提交的哈希值,我可以使用它来命名和引用工件。 Build.SourceVersion 在触发的构建之间是否保持不变?任何其他“启动 ID”都可以正常工作。
欢迎您对示例管道场景发表评论,因为我实际上正在使用它,但这不是我问题的重点。我认为这个问题是广泛适用的,因为它适用于构建依赖包时,或者出于任何其他“触发器”有用的原因。
【问题讨论】:
-
同意 sschmeck。问题当然是不同的,因为在您的情况下,您希望在管道开始时使用最新的,您将使用简单的管道变量将其锁定。就我而言,我想要原始触发器的工件。但是,我刚刚在此处添加的有关使用 REST 的答案与您的答案中的建议非常相似,我现在将其链接到下面。
标签: azure-devops azure-pipelines azure-artifacts