【问题标题】:AzureDevOps - DownloadPipelineArtifact@2 does not download artifact if the very previous run didnt produce artifactAzure DevOps - DownloadPipelineArtifact@2 不下载上次运行的工件没有产生工件
【发布时间】:2021-04-19 18:52:52
【问题描述】:

我们使用 Azure Pipelines(YAML 非经典)进行构建和发布。阶段如下:

  1. 构建
  2. Deploy_DEV
  3. Deploy_UAT
  4. Deploy_PERF
  5. Deploy_PROD

YAML 是参数化的,用户可以选择要运行的阶段。例如:

  1. 构建和部署 DEV,或
  2. 构建 + 部署 DEV + 部署 UAT。

现在问题出现在以下场景中:

  1. 构建 + 部署 DEV。 >> 结果:作品
  2. 部署 SIT(DownloadPipelineArtifact@2 和 runVersion: 'latestFromBranch')>> 结果:工作因为上次构建 ID 产生了工件并且部署成功
  3. 部署 UAT (DownloadPipelineArtifact@2 with runVersion: 'latestFromBranch') >> 结果失败,因为最后一次部署到 SIT 的作业没有产生任何工件。

我不知道这是这个管道任务的错误还是缺点,但希望DownloadPipelineArtifact@2 任务指的是生成工件的分支的最后一个构建 ID。从日志看来,DownloadPipelineArtifact@2 任务只是尝试从之前的管道运行中下载工件,而这可能没有产生任何工件。

在任何项目中运行 1 个构建然后随着时间的推移将该构建部署到各种环境(促进工件)是很正常的。所以每次运行的管道阶段如下所示:

  1. 在提交时构建工件 1
  2. 将工件 1 部署到 Env x
  3. 将工件 2 部署到 Env y
  4. 将工件 3 部署到 Env z ...等。

有人可以建议这是任务的缺点还是我做错了什么?

下面是我的任务配置:

- task: DownloadPipelineArtifact@2
  displayName: Download LATEST artifact
  inputs:
    buildType: 'specific'
    project: '$(System.TeamProjectId)'
    definition: '$(System.DefinitionId)'
    runVersion: 'latestFromBranch'
    branchName: '$(Build.SourceBranch)'
    targetPath: '$(Pipeline.Workspace)'

【问题讨论】:

    标签: visual-studio azure-devops


    【解决方案1】:

    “特定”构建类型的“DownloadPipelineArtifact”任务检查管道中最后一次成功的构建,如果在最后一次成功的构建中没有产生工件,你会得到“没有找到构建 xxx 的工件艺术”。这就是“DownloadPipelineArtifact”任务的工作原理。

    要解决您的问题,有两种方法:

    1. 对于每个管道运行,您运行两个阶段(构建 + 部署),然后为“DownloadPipelineArtifact”任务设置“当前”构建类型。这样,你总能得到最新的神器,我推荐这种方式。

    2. 在每个部署阶段添加“PublishPipelineArtifact”任务,以便管道运行中始终有工件。

         - task: DownloadPipelineArtifact@2
           inputs:
             buildType: 'specific'
             project: '94eb5b0e-78fd-4ec0-a3c5-62d5becb6c0f'
             definition: '119'
             buildVersionToDownload: 'latest'
             artifactName: 'A.A'
             targetPath: '$(Pipeline.Workspace)'
         - task: PublishPipelineArtifact@1
           inputs:
             targetPath: '$(Pipeline.Workspace)/A.A'
             artifact: 'A.A'
             publishLocation: 'pipeline'
      

    【讨论】:

    • 您好,感谢您的回复。对于 #1 - 在某些情况下,我们只想部署最新版本。 IE。我们构建一次并部署多次,因此该管道运行中有 1 个阶段而不是 2 个阶段。这将节省时间,因为构建可能需要时间,并且每次为了部署而进行构建都是多余的。对于#2 - 我已经尝试过,它似乎是一个只能发布一次的神器。错误:x-my-aritfaact-20210419.4 already exists for build 7348
    • 您是如何发布的?你可以查看我更新的回复。
    • 你查看我更新的回复了吗?有用吗?
    • 嗨,我已经用 publishLocation: 'Pipeline' 尝试了你的代码,但仍然出现同样的错误:##[error]Artifact x-my-artifact-20210421.1 already exists for build 7633. 我基本上是在尝试实现你在上面提供的选项 2重新发布相同的管道工件,以便在其他后续管道运行中重用。
    • 我的 PublishPipelineArtifact 任务代码:- task: PublishPipelineArtifact@1 inputs: targetPath: $(System.DefaultWorkingDirectory) artifactName: $(Build.DefinitionName)-$(Build.BuildNumber) publishLocation: 'pipeline'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多