【问题标题】:Azure Dev-ops Pipeline - Conditional execution of taskAzure Devops Pipeline - 有条件地执行任务
【发布时间】:2020-03-02 04:30:18
【问题描述】:

我们有一个 Azure Pipline 用于部署我们的代码。 (它与大数据有关)。

我们不需要每次都部署的任务很少。仅当某些文件已更改时,我们才需要这样做。所以我想跟随。

  • 通过 git 命令检查特定文件是否在上次提交中被更改。
  • 如果是这样,将特定变量设置为true 否则false
  • 现在,对于部署任务,使用custom condition 并检查上面的变量是否有true

问题 我无法执行git command,因为工件是从没有.git 目录的build pipeline 复制的。

我试图克隆一个 git 目录,但是,凭据的配置方式我无法克隆它。

有没有不同的方法来解决这个问题。

即仅当特定文件已更改时才在发布管道中执行某些任务。

【问题讨论】:

  • 对您的预期解决方案的“最后一次提交”参数要小心。任何给定的构建都可以有任意数量的提交,我认为您不能只强制执行一个。您需要使用git diff-tree --no-commit-id --name-only -r $change.id,其中$change 是当前构建/发布的所有提交的迭代中的当前项。
  • 嗨,最近怎么样?贝文的回答对你有帮助吗?如果是,您可以接受答案,因此其他 SO 用户将能够看到该解决方案是否有效。如果您仍然遇到一些问题,请随时在此处留下表扬 :-)

标签: azure azure-devops azure-pipelines


【解决方案1】:

您可以将 git 存储库添加为附加工件:

【讨论】:

  • 您的意思是作为taskrelease 管道中的一部分?这对我有什么帮助?
  • 不是任务的一部分,您希望在发布期间获得 git repo(但您没有成功克隆它),因此您可以将 repo 添加为工件,它将在开始时下载发布的,所以添加一个任务来完成你的 3 个步骤。
【解决方案2】:

Tl;Dr 有很多方法可以将它们拼接在一起

  1. 如 @Shayki 所述,将 git 存储库添加到您的发布管道工件中
  2. 使用 --no-checkout 选项手动将 git repo 添加到发布管道中
  3. 在构建中执行 git 操作并在工件中包含一些标志文件
  4. 在构建中执行 git 操作并标记构建(首选)
  5. .git 目录推送到工件中

将 git repo 添加到您的发布管道工件

将 Git 存储库作为工件添加到您的发布管道将允许部署代理访问源代码控制(包括代码文件),以便您可以在相关发布阶段进行查询。

手动添加 git repo 到你的发布管道

我认为 Azure DevOps UI 不会为您提供仅克隆 .git 目录的选项,这会阻止您的部署代理实际拥有源代码。但是,如果您“允许脚本访问 oAuth 令牌”,您应该能够使用它通过 powershell 使用 git clone --no-checkout url 手动克隆存储库。

在工件中包含一些标志文件

其他途径是对生成工件的构建管道进行决策,并使用您的工件发布一个开关文件,指示该版本应该(不)执行预期的任务。

标记构建

可能有不同的方法可以做到这一点,但我不知道。如果在 git 中的搜索表明该版本需要做额外的工作,请使用 RESTapi 到 add a tag 进行构建。不要忘记在构建作业中设置“允许脚本使用 oAuth 令牌”。然后在你的发布管道中创建一个FullMin 阶段,其中 full 有额外的任务,而 min 没有。

通过这些阶段,您可以使用基于构建标签的工件过滤器功能。


如果您不想(或不能)使用单独的阶段并使用工件过滤器,您可以通过 powershell get the tags 并使用您在问题中提到的自定义条件。

.git 目录推送到工件中

如果您完全一心想要在发布管道上做出决定,并且无法从那里访问存储库,请将 .git 目录从您的构建推送到(一个新的?)工件中,然后使用它在发布管道上。 (这似乎是一个真正的 hack,我不完全确定它会起作用)。

【讨论】:

    【解决方案3】:

    我找到了两种方法来实现这一点。我使用 Powershell,但可以更改为您喜欢的任何口味。

    在您的构建管道中运行您的 git diff:

    $CSV_FileName = git diff-tree --no-commit-id --name-only $Commit_ID -r | where {$_ -like "*.csv"}
    $Ps1_FileName = git diff-tree --no-commit-id --name-only $Commit_ID -r | where {$_ -like "*.ps1"}
    

    然后运行你的条件

    方法一

    添加一个构建标签,然后将其设置为发布中的阶段条件。我首选的舞台控制方法。

    构建

    #Set Build Tag
    if ($CSV_FileName) {
     Write-Host "##vso[build.addbuildtag]CSV"
    }
    if ($PS1_FileName) {
     Write-Host "##vso[build.addbuildtag]PS1"
    }
    

    发布

    Stage Artifact Filter: Branch | Include | <TagName>
    

    方法二

    绑定一个变量组来执行您的构建和发布管道。这允许对每个任务的条件进行更精细的控制,但有点笨拙。确保在发布结束时重置变量组中的变量。

    构建

    #Update Variable Group
    if ($CSV_FileName) {
     echo $env:AZURE_DEVOPS_EXT_PAT | az devops login
     az devops configure -d organization=https://dev.azure.com/<your_organisation>/ project=<your_project>
    
     az pipelines variable-group variable update --id <id_here> --name <name_here> --value <value_here>
    }
    if ($PS1_FileName) {
     echo $env:AZURE_DEVOPS_EXT_PAT | az devops login
     az devops configure -d organization=https://dev.azure.com/<your_organisation>/ project=<your_project>
    
     az pipelines variable-group variable update --id <id_here> --name <name_here> --value <value_here>
    }
    

    发布

    Task Condition: and(succeeded(), eq(variables['VariableName'], 'Value'))
    

    【讨论】:

    • Method2 似乎正是我正在寻找的。但是,在method1中我没有得到这部分Stage Artifact Filter: Branch | Include | &lt;TagName&gt;你能解释一下吗
    • 我刚刚仔细查看了 Josh 的答案,并且在“标记构建”下有一个屏幕截图
    猜你喜欢
    • 2020-10-08
    • 2020-06-11
    • 2021-09-08
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2020-08-27
    • 2020-12-18
    • 2020-09-28
    相关资源
    最近更新 更多