You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:36:20