Azure DevOps Pipelines如何识别作业由计划调度触发
Azure DevOps 流水线区分触发源实现差异化测试配置
完全可以实现,不需要额外改造现有触发规则,Azure DevOps 流水线原生支持触发源识别,也支持自定义变量供后续步骤做流程分支判断。
核心判断依据:内置触发原因变量
Azure DevOps 会为每次流水线运行自动注入预定义变量 Build.Reason,不同触发源对应固定取值,和你当前场景相关的取值如下:
- 计划调度(即配置的cron夜间构建)触发:值为
Schedule - PR 提交触发:值为
PullRequest - 普通分支推送CI触发(含你配置的
batch: true批量合并触发):值为IndividualCI或BatchedCI - 手动点击运行触发:值为
Manual
你当前配置中schedules段的always: false规则仅控制“分支无更新时是否空跑调度”,不会影响该变量的取值准确性。
方案1:单步骤直接加条件(最简便,适合仅少量步骤需要差异化执行的场景)
不需要额外定义全局变量,直接给需要仅夜间构建执行的严格测试步骤加运行条件即可,示例如下:
# 替换成你实际的严格测试任务,单元测试、集成测试、安全扫描类任务都适用该逻辑 - task: VSTest@3 displayName: 运行夜间全量严格测试 inputs: testSelector: 'testAssemblies' testAssemblyVer2: | **\*StrictTest*.dll !**\*TestAdapter*.dll searchFolder: '$(System.DefaultWorkingDirectory)' runSettingsFile: '$(Build.SourcesDirectory)/strict.runsettings' # 条件含义:前面步骤全部成功,且当前触发源为计划调度时才执行本步骤 condition: and(succeeded(), eq(variables['Build.Reason'], 'Schedule'))
如果需要进一步限定仅pre-release分支的夜间构建才跑严格测试,把条件调整为:
condition: and(succeeded(), eq(variables['Build.Reason'], 'Schedule'), startsWith(variables['Build.SourceBranch'], 'refs/heads/pre-release/'))
PR触发、普通CI触发时,该步骤会自动标记为跳过,不影响正常流水线流程。
方案2:自定义全局标记变量(适合多步骤/多Job需要复用判断逻辑的场景)
如果你有多个步骤、甚至跨多个Job都需要判断是否为夜间构建,不想每个步骤重复写Build.Reason判断,可以在流水线最开头的步骤里自定义一个全局标记变量,后续所有步骤直接校验这个变量即可。
示例:在流水线第一个Job的第一个步骤加入如下PowerShell逻辑初始化变量
steps: - task: PowerShell@2 displayName: 初始化构建类型标记 inputs: targetType: 'inline' script: | if ($env:BUILD_REASON -eq 'Schedule') { # 设置全局可复用变量,跨Job引用时按输出变量规则配置作用域即可 Write-Host "##vso[task.setvariable variable=IsNightlyBuild]true" Write-Host "当前为夜间计划构建,已启用严格测试流程标记" } else { Write-Host "##vso[task.setvariable variable=IsNightlyBuild]false" Write-Host "当前为非计划触发,已标记为跳过严格测试流程" }
后续所有需要仅夜间执行的步骤,条件直接写eq(variables['IsNightlyBuild'], 'true')即可,不需要重复判断触发源。
注意:
Build.Reason是运行时赋值的变量,不要在模板参数解析、变量组静态赋值的编译阶段引用该变量,必须写在步骤的运行时condition或者执行脚本里判断,否则会出现取值为空的问题。
内容的提问来源于stack exchange,提问作者Ken Bonnin Jr
相关产品推荐
相关产品推荐

