如何通过Webhook连接Azure DevOps Boards与ServiceNow并触发API端点?
实现Azure DevOps Boards与ServiceNow的Webhook集成
步骤1:确认ServiceNow API端点信息
你已创建Scripted REST API,先整理好以下关键信息:
- API完整访问URL(例如
https://<你的实例名>.service-now.com/api/自定义路径/端点) - 认证方式:一般是ServiceNow用户名+密码(Basic Auth),或已配置的OAuth令牌
- 请求方法:根据你的脚本逻辑选择(通常为
POST,用于接收事件推送数据)
步骤2:在Azure DevOps中创建Webhook订阅
- 进入目标Azure DevOps项目,打开项目设置 > 服务挂钩
- 点击创建订阅,选择Azure DevOps Services作为服务源,再选工作项更新作为触发事件
- 配置筛选规则:
- 勾选要监听的工作项类型:事件(Incident)和任务(Task)
- 设置触发时机:比如“工作项被创建、更新、删除时”(按需调整)
- 配置HTTP请求操作:
- 填入你ServiceNow的API端点URL
- 选择对应的HTTP方法(如
POST) - 设置认证:选基本认证并输入ServiceNow账号密码;若用OAuth则配置对应令牌
- 请求正文:Azure DevOps会自动生成包含工作项详情的JSON payload,可根据ServiceNow脚本需求精简字段
步骤3:验证Webhook有效性
- 在Azure DevOps的Webhook配置页面点击测试,触发模拟的工作项更新事件
- 查看ServiceNow的系统日志或API专属日志,确认请求是否被成功接收并处理
- 若出现错误,优先排查:
- URL是否正确,实例名无拼写错误
- 认证信息是否有效,账号是否有API访问权限
- 请求payload格式是否匹配ServiceNow脚本的解析逻辑
步骤4:适配ServiceNow脚本处理Azure DevOps数据
以下是示例脚本,用于解析Azure DevOps推送的工作项数据并同步到ServiceNow:
(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) { // 解析Azure DevOps发送的payload var payload = request.body.data; var workItemId = payload.resource.id; var workItemTitle = payload.resource.fields['System.Title']; var workItemType = payload.resource.fields['System.WorkItemType']; var updateTime = payload.resource.fields['System.ChangedDate']; // 同步Incident类型工作项到ServiceNow事件表 if (workItemType === 'Incident') { var incident = new GlideRecord('incident'); // 通过自定义字段关联Azure DevOps工作项ID incident.addQuery('u_azure_work_item_id', workItemId); incident.query(); if (incident.next()) { incident.short_description = workItemTitle; incident.u_azure_update_time = updateTime; incident.update(); } else { incident.initialize(); incident.short_description = workItemTitle; incident.u_azure_work_item_id = workItemId; incident.u_azure_update_time = updateTime; incident.insert(); } } // 同步Task类型工作项到ServiceNow任务表(逻辑类似) if (workItemType === 'Task') { var task = new GlideRecord('task'); task.addQuery('u_azure_work_item_id', workItemId); task.query(); if (task.next()) { task.short_description = workItemTitle; task.u_azure_update_time = updateTime; task.update(); } else { task.initialize(); task.short_description = workItemTitle; task.u_azure_work_item_id = workItemId; task.u_azure_update_time = updateTime; task.insert(); } } })(request, response);
常见问题排查
- 请求被拦截:检查ServiceNow是否设置了IP白名单,确保Azure DevOps的IP地址在允许范围内
- 数据解析失败:在ServiceNow脚本中加入日志打印,输出完整的Azure DevOps payload,确认字段路径是否正确
- 认证失败:验证账号密码是否正确,或OAuth令牌是否过期、权限是否足够
内容的提问来源于stack exchange,提问作者Paul George
相关产品推荐
相关产品推荐

