如何在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'
三、跳过调度实现快速部署
通过添加流水线变量可以快速切换调度模式,实现一键跳过等待逻辑:
- 在流水线定义中添加布尔变量
SkipSchedule,默认值设为false - 修改等待脚本,优先检查该变量:
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
相关产品推荐
相关产品推荐

