
# 设置通用Webhook订阅
 #### 操作场景
CodeArts支持自定义消息通知，将用户操作所产生的事件，以HTTP协议发送给第三方平台。
可配置的服务及事件类型如下表所示。
- [需求管理]
- [代码托管]
- [流水线]
- [代码检查]
- [编译构建]
- [部署]
- [测试计划]
表1事件类型 
| 分类   | 事件类型      |
|:---|:---|
| 原始需求 | 新建/提交     |
| 原始需求 | 编辑        |
| 原始需求 | 删除        |
| 原始需求 | 变更        |
| 原始需求 | 状态更新      |
| 原始需求 | 催单        |
| 原始需求 | 评论        |
| 系统特性 | 新建        |
| 系统特性 | 编辑        |
| 系统特性 | 删除        |
| 系统特性 | 变更        |
| 系统特性 | 基线/取消基线   |
| 系统特性 | 状态更新      |
| 系统特性 | 催单        |
| 系统特性 | 评论        |
| 研发需求 | 新建        |
| 研发需求 | 编辑        |
| 研发需求 | 删除        |
| 研发需求 | 变更        |
| 研发需求 | 基线/取消基线   |
| 研发需求 | 迁移        |
| 研发需求 | 评论        |
| 研发需求 | 催单        |
| 研发需求 | 状态更新      |
| 任务   | 新建        |
| 任务   | 编辑        |
| 任务   | 删除任务      |
| 任务   | 评论        |
| 任务   | 催单        |
| 任务   | 状态更新      |
| 缺陷   | 新建/提交     |
| 缺陷   | 编辑        |
| 缺陷   | 删除        |
| 缺陷   | 迁移        |
| 缺陷   | 状态更新      |
| 缺陷   | 催单        |
| 缺陷   | 评论        |
| 评审单  | 提交        |
| 评审单  | 转他人处理     |
| 评审单  | 撤销/驳回     |
| 评审单  | 变更对象评审完成  |
| 评审单  | 变更对象决策完成  |
| 评审单  | 评审/决策阶段完成 |
| 评审单  | 删除        |
| 评审单  | 评论        |
   
表2事件类型 
| 分类   | 事件类型   |
|:---|:---|
| 仓库   | 容量预警   |
| 仓库   | 删除仓库   |
| 合并请求 | 开启合并请求 |
| 合并请求 | 更新合并请求 |
| 合并请求 | 合并合并请求 |
| 合并请求 | 检视合并请求 |
| 合并请求 | 审核合并请求 |
| 合并请求 | 新建评审意见 |
| 合并请求 | 解决评审意见 |
   
表3事件类型 
| 分类  | 事件类型 |
|:---|:---|
| 流水线 | 已完成  |
| 流水线 | 失败   |
| 流水线 | 暂停   |
| 流水线 | 挂起   |
| 流水线 | 忽略   |
   
表4事件类型 
| 分类     | 事件类型                                                                                                                                                                                                                                                                                                                  |
|:---|:---|
| 代码检查任务 | 检查完成 - 全部  - 门禁通过  - 门禁不通过   |
   
表5事件类型 
| 分类     | 事件类型    |
|:---|:---|
| 编译构建任务 | 任务构建成功  |
| 编译构建任务 | 任务构建失败  |
| 编译构建任务 | 任务被禁用   |
| 编译构建任务 | 任务被删除   |
| 编译构建任务 | 任务配置被更新 |
   
表6事件类型 
| 分类 | 事件类型   |
|:---|:---|
| 应用 | 应用部署成功 |
| 应用 | 应用部署失败 |
| 应用 | 应用部署中止 |
   
表7事件类型 
| 分类   | 事件类型                   |
|:---|:---|
| 测试用例 | 分配用例处理者                |
| 测试用例 | 修改用例                   |
| 测试用例 | 执行手工用例                 |
| 测试用例 | 接口测试用例执行完成             |
| 测试用例 | 删除用例                   |
| 测试套  | 新建测试套                  |
| 测试套  | 更新测试套                  |
| 测试套  | 删除测试套                  |
| 测试套  | 测试套件执行完成               |
| 测试报表 | 新建报表                   |
| 测试报表 | 更新报表                   |
| 测试报表 | 删除报表                   |
| 分支计划 | 新建计划                   |
| 分支计划 | 更新计划                   |
| 分支计划 | 编辑风险信息（在测试质量看板中编辑风险信息） |
| 分支计划 | 删除计划                   |
| 分支计划 | 删除分支                   |
| 分支计划 | 测试计划完成后发送质量报告          |
| 目录   | 删除目录                   |
| 评论通知 | 评论通知（在手工测试用例下变更评论）     |
   
#### 约束与限制
- 仅IPD类项目支持本功能。
 
#### 前提条件
已新建CodeArts项目，在项目中的角色为"项目管理员"或"项目经理"。
#### 新建Webhook订阅
1. 进入CodeArts首页。 
   1. 登录[CodeArts控制台](https://console.huaweicloud.com/devcloud)，单击![](https://support.huaweicloud.com/usermanual-devcloud/zh-cn_image_0000001917408514.png)，根据需要选择已开通CodeArts的区域。
   
   2. 单击"前往工作台"。 如果当前账号采用的是历史计费模式（详情请参考[历史计费模式说明](https://support.huaweicloud.com/price-devcloud/codearts_29_0031.html)），则单击"立即使用"。
      
   
   
   
   
2. 单击目标项目名称，进入项目。
3. 在导航中依次单击"设置 \> 通用设置 \> 通知设置"，进入通知设置页面。
4. 选择"通用Webhook"页签。
5. 选择需要配置通知的服务，单击"新建Webhook订阅"。
6. 根据实际需要完成参数配置，单击"确定"。 
   操作成功后，页面中显示新建的Webhook订阅记录。
   图1新建webhook（以流水线服务为例）   
   ![](https://support.huaweicloud.com/usermanual-devcloud/zh-cn_image_0000002504271713.png "点击放大")
   表8新建Webhook订阅 
   | 参数      | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   |:---|:---|
   | 订阅事件名称  | 通用Webhook的名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | URL     | HTTP Server的接收请求的URL地址，当前只支持使用POST方式接收。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 事件类型    | 触发通用Webhook通知的事件类型，支持的事件类型参考[操作场景]。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | HTTP请求头 | 通用Webhook通知的HTTP请求头。此参数为可选参数。 HTTP请求头是HTTP协议中定义的一种规范。 服务在对应的事件发生时，会调用用户配置的URL。调用URL时，有可能会需要同时携带HTTP请求头（例如用来鉴权）。 HTTP请求头的格式一般为"key: value"，例如：Content-Type: application/json。 一次请求可以发送多个请求头，当发送多个请求头时，通过换行分隔，每一行代表一个请求头。 单个请求头最大长度100，最多可输入20个请求头。 了解更多HTTP请求头相关知识，请参考[HTTP官网文档](https://datatracker.ietf.org/doc/html/rfc7231#section-5)。 |
   | 自定义模板   | 通过自定义模板设置请求Body，可使用"${}"动态定义参数（例如"${eventName}"表示事件名），可支持参数请参考[事件数据结构说明]。                                                                                                                                                                                                                                                                                                                                                                                                                                         |
      
   
   
 
 #### 事件数据结构说明
- 需求管理：
  表9需求管理服务动态定义参数表 
  | 动态参数                 | 说明     |
  |:---|:---|
  | ${project.id}        | 项目ID   |
  | ${project.url}       | 项目url  |
  | ${issue.id}          | 工作项ID  |
  | ${issue.title}       | 工作项名称  |
  | ${issue.url}         | 工作项URL |
  | ${operator.username} | 操作用户名  |
  | ${operator.id}       | 操作人ID  |
  | ${review.id}         | 评审单ID  |
  | ${review.title}      | 评审单标题  |
  | ${review.url}        | 评审单URL |
  | ${operation}         | 事件名称   |
  | ${event.id}          | 事件ID   |
  | ${event.time}        | 事件时间   |
     
  
- 代码托管
  - 仓库
    
    | 订阅事件 | 事件名  | 事件编码                                    |
    |:---|:---|:---|
    | 删除仓库 | 删除仓库 | CodeArtsRepo-Repository-Delete          |
    | 容量预警 | 容量预警 | CodeArtsRepo-Repository-CapacityWarning |
       
    ```
    {
    "eventCode": "",  // 事件编码
    "eventName": "", // 事件名
    "project": {
    "id": "", //项目 ID
    "url": "" // 项目 URL
    },
    "repo": {
    "id": 0, // 仓库ID
    "webUrl": "",  // 仓库访问地址
    "httpUrl": "",  // 仓库http地址
    "sshUrl": "",  // 仓库ssh地址
    "name": "", // 仓库名称
    "groupName": "" // 组织名
    },
    "operator": {
    "id": 0, // 操作人用户ID
    "nickName": "", // 操作人用户昵称
    "name": "", // 操作人用户名
    "username": "", // 操作人用户IAM ID
    "tenantName":"" // 操作人租户名
    }
    }
    ```
    
  
  - 合并请求
    
    | 订阅事件   | 事件名      | 事件编码                                     |
    |:---|:---|:---|
    | 开启合并请求 | 开启合并请求   | CodeArtsRepo-MergeRequest-Create         |
    | 更新合并请求 | 更新合并请求   | CodeArtsRepo-MergeRequest-Update         |
    | 合并合并请求 | 合并合并请求   | CodeArtsRepo-MergeRequest-Merge          |
    | 检视合并请求 | 合并请求检视通过 | CodeArtsRepo-MergeRequest-ReviewPass     |
    | 检视合并请求 | 合并请求检视撤销 | CodeArtsRepo-MergeRequest-ReviewRevoke   |
    | 审核合并请求 | 合并请求审核拒绝 | CodeArtsRepo-MergeRequest-ApprovalReject |
    | 审核合并请求 | 合并请求审核通过 | CodeArtsRepo-MergeRequest-ApprovalPass   |
    | 审核合并请求 | 合并请求审核撤销 | CodeArtsRepo-MergeRequest-ApprovalRevoke |
    | 新建评审意见 | 新建评审意见   | CodeArtsRepo-MergeRequest-CreateComment  |
    | 解决评审意见 | 解决评审意见   | CodeArtsRepo-MergeRequest-Resolve        |
       
    ```
    {
    "eventCode": "",  // 事件 ID
    "eventName": "", // 事件名
    "project": {
    "id": "", //项目 ID
    "url": ""  // 项目 URL
    },
    "repo": {
    "id": 0, // 仓库 ID
    "webUrl": "",  // 仓库访问地址
    "httpUrl": "",  // 仓库http地址
    "sshUrl": "",  // 仓库ssh地址
    "name": "", // 仓库名称
    "groupName": "" // 组织名
    }
    "operator": {
    "id": 0, // 操作人用户ID
    "nickName": "", // 操作人用户昵称
    "name": "", // 操作人用户名
    "username": "", // 操作人用户IAM ID
    "tenantName":"" // 操作人租户名
    },
    "mergeRequest": {
    "id": 0, // 合并请求ID
    "iid": 0, // 合并请求序列ID
    "url":"", // 合并请求访问地址
    "createdAt": "", // 合并请求创建时间
    "updatedAt": "",// 合并请求更新时间
    "title": "", // 合并请求标题
    "description": "", // 合并请求描述
    "sourceBranch": "", // 合并请求源分支
    "targetBranch": "", // 合并请求目标分支
    "state": "",// 合并请求状态：opened、closed、merged、locked
    "author": {
    "id": 0, // 合并请求创建人用户ID
    "nickName": "", // 合并请求创建人用户昵称
    "name": "", // 合并请求创建人用户名
    "username": "" // 合并请求创建人用户IAM ID
    "tenantName":"" // 合并请求创建人租户名
    }
    },
    "mergeRequestReview": {
    "id": 0, // 评审意见 ID
    "body": "", // 评审意见内容
    "url": "",  // 评审意见访问地址
    "author": {
    "id": 0, // 评审意见创建人用户ID
    "nickName": "", // 评审意见创建人用户昵称
    "name": "", // 评审意见创建人用户名
    "username": "" // 评审意见创建人用户IAM ID
    "tenantName":"" // 评审意见创建人租户名
    },
    "createdAt": "", // 评审意见创建时间
    "updatedAt": "",// 评审意见更新时间
    }
    }
    ```
    
   
- 代码检查
  ```
  {
  "eventName": "检查完成",  //事件名
  "eventCode": "taskExecuteCompleted",  //事件编码
  "project": {
  "id": "", //项目 ID
  "url": "" // 代码检查项目地址
  },
  "task" : {
  "id": "", // 任务 ID
  "name": "", // 任务名称
  "gitUrl": "",  // 仓库地址
  "creator": ""  // 任务创建人
  },
  "job": {
  "id": "", // 执行 ID
  "startTime": "", // 任务执行开始时间
  "finishTime": "", // 任务执行结束时间
  "status": "",  // 任务状态（成功、失败、终止）
  "gateResult": "", // 门禁结果（通过、不通过）
  "executor": "", // 执行人
  "url": "" // 执行记录跳转地址
  },
  "issues": {
  "critical": "", // 致命问题数
  "major": "", // 严重问题数
  "minor": "", // 一般问题数
  "suggestion": "" // 提示问题数
  }
  }
  ```
  
- 编译构建
  表10编译构建服务动态定义参数表 
  | 动态参数                   | 说明                             |
  |:---|:---|
  | ${BUILD.TITLE}         | 标题，如"编译构建通知"。                  |
  | ${BUILD.URL}           | 构建任务链接。                        |
  | ${BUILD.EVENT}         | 任务事件，如"编辑了构建任务"。               |
  | ${BUILD.EXECUTOR_NAME} | 事件执行人，如"路人甲"。                  |
  | ${BUILD.EXECUTOR_ID}   | 事件执行人ID，如"路人甲的ID"。             |
  | ${BUILD.EXECUTE_TIME}  | 事件执行时间，如"2025-02-06 11:11:11"。 |
  | ${BUILD.TASK_NAME}     | 构建任务名，如"测试构建任务1"。              |
  | ${BUILD.PROJECT_NAME}  | 构建任务所在项目名，如"测试项目1"。            |
  | ${BUILD.PROJECT_ID}    | 构建任务所在项目的ID，如"测试项目1的ID"。       |
     
  
- 部署
  
  | 事件名    | 事件编码    |
  |:---|:---|
  | 应用部署成功 | success |
  | 应用部署失败 | failure |
  | 应用部署中止 | stop    |
     
  ```
  {
  "eventName": "应用部署成功",  //事件名
  "eventCode": "success",  //事件编码
  "taskName": "", //应用名称
  "projectName": "", //项目名称
  "result": "", //执行结果
  "sort": "", //执行序号
  "startUser": "", //执行人
  "startTime": "", //执行时间
  "link":""//部署详情链接
  }
  ```
  
- 流水线 流水线服务参数的调用方式为"${pipeline.参数名}"，例如：调用流水线ID"${pipeline.pipeline_id}"。
  流水线服务提供的可调用参数如下。
  ```
  {
  "pipeline": {
  "pipeline_id": "", //流水线ID
  "run_number": "", //流水线执行编号
  "project_id": "", //流水线所属项目ID
  "run_id": "", //流水线执行ID
  "timestamp": "", //流水线执行时间戳
  "trigger_type": "", //流水线触发类型
  "name": "" //流水线名称
  }
  }
  ```
  
 
