如何跳过在Azure DevOps中创建空Drop并不触发Release的构建

36次阅读
没有评论

问题描述

在使用Azure DevOps时,有一个需求是希望在跳过构建的同时,不触发Release。目前,当构建被跳过时,Release仍然会被标记为成功,并创建一个空的Drop。这会触发一个失败的Release,因为Drop是空的。用户想知道正确的跳过构建并不触发Release的方法。是否有可能只禁用创建空的Drop?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

可以尝试在特定分支上添加一个阶段条件,只有满足条件时才运行该阶段。以下是一个示例:

stages:
- stage: CheckShouldBuildStage
  displayName: Check Should Build
  jobs:
  - job: CheckShouldBuildJob
    displayName: Check Should Build
    steps:
      - powershell: |
          $doBuild = $True
          $sourceBranchName="$env:BUILD_SOURCEBRANCHNAME"
          $buildReason="$env:BUILD_REASON"
          # Get PR information for branch
          ...
          if ($branchHasPr -eq $True -and $buildReason -ne "PullRequest" -and $buildReason -ne "Manual") {
            $doBuild = $False
            Write-Host "Pr Build found, and not the merged PR build. Cancelled build."
          }
          ...
          if ($doBuild -eq $True) {
            Write-Host "DoBuildVar=YES"
            Write-Host "##vso[task.setvariable variable=DoBuildVar;isOutput=true]YES"
          } else {
            Write-Host "DoBuildVar=NO"
            Write-Host "##vso[task.setvariable variable=DoBuildVar;isOutput=true]NO"
          }
        name: CheckShouldBuildTask
        displayName: Check Should Build
- stage: BuildAndTest
  condition: eq(dependencies.CheckShouldBuildStage.outputs['CheckShouldBuildJob.CheckShouldBuildTask.DoBuildVar'], 'YES')
  dependsOn: CheckShouldBuildStage
  displayName: Build and Test
  jobs:
    ...

在上面的示例中,我们首先定义了一个名为CheckShouldBuildStage的阶段,用于检查是否应该构建。在该阶段中,我们使用了一个PowerShell脚本来检查当前分支是否有关联的PR,并根据条件设置一个变量DoBuildVar。如果满足构建条件,变量值为YES,否则为NO
然后,在BuildAndTest阶段中,我们使用了一个条件来判断是否应该运行该阶段。条件是检查前一个阶段的输出变量DoBuildVar的值是否为YES。只有当满足条件时,才会运行该阶段。

方案2

使用脚本或工具来管理构建和发布的顺序可能会增加复杂性,并且需要确保构建和发布之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制构建和发布的顺序。你可以使用Azure DevOps的条件语法来控制构建和发布的触发条件。以下是一个示例:

stages:
- stage: Build
  displayName: Build
  jobs:
  - job: BuildJob
    displayName: Build
    steps:
      # 构建步骤
- stage: Release
  displayName: Release
  dependsOn: Build
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
  jobs:
  - job: ReleaseJob
    displayName: Release
    steps:
      # 发布步骤

在上面的示例中,我们定义了两个阶段:BuildReleaseRelease阶段依赖于Build阶段,并且只有当Build阶段成功完成且分支为master时,才会触发Release阶段。
请注意,这只是一个示例,你可以根据自己的需求和条件来调整条件语句。
请注意,以上解决方案仅供参考,具体实现方式可能因你的具体情况而有所不同。建议你参考Azure DevOps的官方文档和其他资源,以了解更多关于条件语法和构建发布流程的信息。

正文完