【问题标题】:Azure CI pipeline with gradle release - skip tasks带有 gradle 版本的 Azure CI 管道 - 跳过任务
【发布时间】:2023-03-05 20:51:01
【问题描述】:

如果运行“发布工件”任务,我有一个要求,我想跳过所有即将执行的任务。仅当在运行管道时将变量之一设置为“true”时,发布工件任务才会运行。

parameters:
  release: $(release)

- task: Bash@3
    displayName: Release artifacts
    condition: and(succeeded(), eq('${{ parameters.release }}', true))
    inputs:
        targetType: 'inline'
        script: |
            # Write your commands here
            # Steps to release the artifacts ( gradle release plugin)
            gradle release -Prelease.useAutomaticVersion=true

- task: Bash@3

- task: Bash@3

有没有办法使用退出代码 0 退出/截断管道?如果其中一个条件为真,我正在寻找一种功能来跳过所有即将执行的任务,而无需在所有任务中添加该检查?

原因:gradle release 会修改 gradle.properties 会再次触发 CI。

【问题讨论】:

  • 请问这是什么状态?取消管道可以满足您的需求吗?

标签: azure-devops azure-pipelines azure-pipelines-build-task


【解决方案1】:

您可以将任务分组到作业中,然后使用输出变量来设置发布任务已运行,并在后续作业中使用此变量来跳过它。请看here。

jobs:
- job: Foo
  steps:
  - script: |
      echo "This is job Foo."
      echo "##vso[task.setvariable variable=doThing;isOutput=true]Yes" #The variable doThing is set to true
    name: DetermineResult
- job: Bar
  dependsOn: Foo
  condition: eq(dependencies.Foo.outputs['DetermineResult.doThing'], 'Yes') #map doThing and check if true
  steps:
  - script: echo "Job Foo ran and doThing is true."

【讨论】:

    【解决方案2】:

    我同意@Krzysztof 提到的逻辑,但它似乎不适合您的场景,因为您的下一个流程是steps 而不是jobs。这意味着您需要为所有后续步骤配置 condition 以使其跳过。

    我有另一个想法。您可以在Release artifacts 步骤之后添加一个powershell 步骤。此powershell 步骤的执行条件只有前一个Release artifacts 步骤成功。

    在此powershell步骤中,您可以运行一个api来取消当前管道。简而言之,一旦Release artifacts 步骤执行成功,跳过所有后续步骤和作业并直接取消当前管道。

      - task: PowerShell@2
        inputs:
          targetType: 'inline'
          script: |
            [String]$project = "$env:SYSTEM_TEAMPROJECT"
            [String]$OrgUri = "$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"
            $header = @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
            $pipeline = $OrgUri + $project + "/_apis/build/builds/" + $(Build.BuildId) + “?api-version=6.0-preview.5"
            $Body=@"
            {"status":4}
            "@
            Invoke-RestMethod -Uri $pipeline -Method PATCH -Body $Body -ContentType "application/json" -Headers $header
        env:
          SYSTEM_ACCESSTOKEN: $(System.AccessToken)
    


    通过这种方式,您无需将condition 配置为所有下一个任务或作业。

    【讨论】:

    • 让我试试
    • @SunilS 希望这是您可以避免对每个下一个任务进行条件检查的方式:-)
    猜你喜欢
    • 2020-02-20
    • 2021-05-10
    • 1970-01-01
    • 2020-05-28
    • 2020-07-28
    • 1970-01-01
    • 2022-08-22
    • 2020-01-30
    • 2019-06-08
    相关资源
    最近更新 更多