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

如何在Azure DevOps YAML流水线中设置步骤定时执行?

在Azure Pipelines YAML中实现步骤级调度与快速部署

一、为步骤设置工作日EST中午的调度

要让发布步骤等待到工作日美国东部时间(EST)中午执行,可通过PowerShell脚本计算等待时长并实现延迟,完全匹配0 12 * * 1-5的cron规则,无需依赖额外插件:

PowerShell实现示例

steps:
- powershell: |
    # 切换到EST时区
    $estTimeZone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Eastern Standard Time")
    $currentEstTime = [System.TimeZoneInfo]::ConvertTimeFromUtc((Get-Date).ToUniversalTime(), $estTimeZone)
    
    # 判断当前是否为工作日且未到12点
    if ($currentEstTime.DayOfWeek -ge 1 -and $currentEstTime.DayOfWeek -le 5) {
        if ($currentEstTime.Hour -lt 12) {
            $waitDuration = (New-TimeSpan -Start $currentEstTime -End (Get-Date $currentEstTime -Hour 12 -Minute 0 -Second 0)).TotalSeconds
            Write-Host "等待 $([math]::Round($waitDuration)) 秒,直到EST中午12点执行"
            Start-Sleep -Seconds $waitDuration
        }
    } else {
        # 非工作日,计算到下周一EST12点的等待时间
        $daysToMonday = 1 - [int]$currentEstTime.DayOfWeek + 7
        $nextMonday12 = (Get-Date $currentEstTime).AddDays($daysToMonday) | Get-Date -Hour 12 -Minute 0 -Second 0
        $waitDuration = (New-TimeSpan -Start $currentEstTime -End $nextMonday12).TotalSeconds
        Write-Host "当前为非工作日,等待 $([math]::Round($waitDuration)) 秒,直到下周一EST中午12点执行"
        Start-Sleep -Seconds $waitDuration
    }
  displayName: '等待至工作日EST中午'

- script: echo "执行核心发布步骤"
  displayName: '发布步骤'

二、为每个步骤单独设置调度

完全可以为每个步骤配置独立的调度逻辑,只需在目标步骤前添加专属的等待脚本任务即可。比如让步骤1等待当天工作日中午,步骤2等待下一工作日中午:

steps:
# 步骤1:等待当天工作日EST中午
- powershell: |
    $estTimeZone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Eastern Standard Time")
    $currentEstTime = [System.TimeZoneInfo]::ConvertTimeFromUtc((Get-Date).ToUniversalTime(), $estTimeZone)
    
    if ($currentEstTime.DayOfWeek -ge 1 -and $currentEstTime.DayOfWeek -le 5) {
        if ($currentEstTime.Hour -lt 12) {
            $waitDuration = (New-TimeSpan -Start $currentEstTime -End (Get-Date $currentEstTime -Hour 12 -Minute 0 -Second 0)).TotalSeconds
            Start-Sleep -Seconds $waitDuration
        }
    } else {
        $daysToMonday = 1 - [int]$currentEstTime.DayOfWeek + 7
        $nextMonday12 = (Get-Date $currentEstTime).AddDays($daysToMonday) | Get-Date -Hour 12 -Minute 0 -Second 0
        $waitDuration = (New-TimeSpan -Start $currentEstTime -End $nextMonday12).TotalSeconds
        Start-Sleep -Seconds $waitDuration
    }
  displayName: '步骤1:等待至当天工作日EST中午'
- script: echo "执行发布步骤1"
  displayName: '发布步骤1'

# 步骤2:等待下一工作日EST中午
- powershell: |
    $estTimeZone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Eastern Standard Time")
    $currentEstTime = [System.TimeZoneInfo]::ConvertTimeFromUtc((Get-Date).ToUniversalTime(), $estTimeZone)
    
    # 判断是否需要等待到下一个工作日
    $nextWorkday = $currentEstTime
    if ($currentEstTime.DayOfWeek -eq 5) { # 周五,跳转到周一
        $nextWorkday = $currentEstTime.AddDays(3)
    } elseif ($currentEstTime.DayOfWeek -eq 6) { # 周六,跳转到周一
        $nextWorkday = $currentEstTime.AddDays(2)
    } elseif ($currentEstTime.DayOfWeek -eq 0) { # 周日,跳转到周一
        $nextWorkday = $currentEstTime.AddDays(1)
    } elseif ($currentEstTime.Hour -ge 12) { # 工作日已过12点,跳转到次日
        $nextWorkday = $currentEstTime.AddDays(1)
    }
    
    $nextWorkday12 = Get-Date $nextWorkday -Hour 12 -Minute 0 -Second 0
    $waitDuration = (New-TimeSpan -Start $currentEstTime -End $nextWorkday12).TotalSeconds
    Write-Host "等待 $([math]::Round($waitDuration)) 秒,直到下一工作日EST中午12点执行"
    Start-Sleep -Seconds $waitDuration
  displayName: '步骤2:等待至下一工作日EST中午'
- script: echo "执行发布步骤2"
  displayName: '发布步骤2'

三、跳过调度实现快速部署

通过添加流水线变量可以快速切换调度模式,实现一键跳过等待逻辑:

  1. 在流水线定义中添加布尔变量SkipSchedule,默认值设为false
  2. 修改等待脚本,优先检查该变量:
steps:
- powershell: |
    # 检查是否启用快速部署
    if ($env:SkipSchedule -eq "true") {
        Write-Host "已触发快速部署,跳过调度等待"
        exit 0
    }
    
    # 以下为原等待逻辑
    $estTimeZone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Eastern Standard Time")
    $currentEstTime = [System.TimeZoneInfo]::ConvertTimeFromUtc((Get-Date).ToUniversalTime(), $estTimeZone)
    
    if ($currentEstTime.DayOfWeek -ge 1 -and $currentEstTime.DayOfWeek -le 5) {
        if ($currentEstTime.Hour -lt 12) {
            $waitDuration = (New-TimeSpan -Start $currentEstTime -End (Get-Date $currentEstTime -Hour 12 -Minute 0 -Second 0)).TotalSeconds
            Start-Sleep -Seconds $waitDuration
        }
    } else {
        $daysToMonday = 1 - [int]$currentEstTime.DayOfWeek + 7
        $nextMonday12 = (Get-Date $currentEstTime).AddDays($daysToMonday) | Get-Date -Hour 12 -Minute 0 -Second 0
        $waitDuration = (New-TimeSpan -Start $currentEstTime -End $nextMonday12).TotalSeconds
        Start-Sleep -Seconds $waitDuration
    }
  displayName: '等待至工作日EST中午'
  env:
    SkipSchedule: $(SkipSchedule)

- script: echo "执行发布步骤"
  displayName: '发布步骤'

触发流水线时,只需将SkipSchedule变量设置为true,即可直接跳过等待逻辑执行发布。


内容的提问来源于stack exchange,提问作者FoxDeploy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:11:13