如何在Azure DevOps配置预部署门控校验ServiceNow计划时间触发发布
Azure DevOps发布管道预部署门控:校验ServiceNow变更计划时间搭建思路
核心思路
通过自定义PowerShell脚本调用ServiceNow API获取变更请求的计划时间,与当前时间做对比,以此作为预部署门控的校验逻辑,配合Azure DevOps门控的重试机制实现自动等待计划时间到达后执行发布。
具体步骤
确认前置条件
确保已配置的ServiceNow服务连接具备读取变更请求(Change Request)的权限,能访问planned_start_date(或对应计划时间字段)。同时,在发布管道中定义变量(如SN_ChangeRequest_Number)用于传递目标变更请求编号。配置预部署门控
进入发布管道目标阶段的「预部署条件」,勾选「启用门控」,添加「PowerShell脚本」任务作为门控校验任务。编写时间校验PowerShell脚本
脚本需完成以下操作:- 读取变更请求编号变量;
- 通过ServiceNow REST API获取对应变更的计划时间;
- 转换时间格式并与当前时间(建议统一用UTC避免时区问题)对比;
- 根据对比结果返回成功/失败状态,控制门控是否通过。
示例脚本:
# 读取管道变量中的变更请求编号 $changeRequestNumber = "$(SN_ChangeRequest_Number)" # 构造ServiceNow API请求头(凭据通过Azure DevOps服务连接自动注入) $headers = @{ "Authorization" = "Basic $(System.AccessToken)" "Accept" = "application/json" } # 调用ServiceNow API获取计划时间字段 $apiEndpoint = "https://your-servicenow-instance.service-now.com/api/now/table/change_request?sysparm_query=number=$changeRequestNumber&sysparm_fields=planned_start_date" $apiResponse = Invoke-RestMethod -Uri $apiEndpoint -Headers $headers -Method Get # 转换时间格式并统一为UTC时区 $plannedStartTime = [DateTime]::Parse($apiResponse.result.planned_start_date).ToUniversalTime() $currentUtcTime = [DateTime]::UtcNow # 时间对比逻辑 if ($currentUtcTime -ge $plannedStartTime) { Write-Host "校验通过:当前UTC时间($currentUtcTime) >= 计划UTC时间($plannedStartTime)" exit 0 } else { Write-Error "校验不通过:当前UTC时间($currentUtcTime) < 计划UTC时间($plannedStartTime)" exit 1 }设置门控重试规则
在门控设置中配置重试间隔(如5分钟)和最大重试次数,让管道能自动周期性校验,直到时间条件满足或达到重试上限。关联变更请求与发布触发
可通过两种方式传递变更编号:- 手动触发发布时,将变更请求编号作为参数输入;
- 配置ServiceNow与Azure DevOps的集成,当变更请求满足特定状态(如已批准)时自动触发发布,并传递变更编号至管道变量。
测试验证
创建测试变更请求,分别设置计划时间为「未来10分钟」和「过去时间」,触发发布管道,验证门控是否按预期等待或直接通过。
内容的提问来源于stack exchange,提问作者Enig
相关产品推荐
相关产品推荐

