# PR 门禁检查
**Repository Path**: liwen/pr_check_run
## Basic Information
- **Project Name**: PR 门禁检查
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 0
- **Created**: 2021-10-29
- **Last Updated**: 2022-04-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 2021-10-28 Pull Request 门禁检查帮助文档
# 功能介绍
Pull Request 门禁检查功能提供了在代码更改时为`代码仓库`集成自动化的能力。门禁检查能够让你通过构建一个 Gitee 第三方应用程序,在仓库 Pull Request 代码产生变更时,集成执行持续集成、代码分析、代码检查扫描、自动部署等服务。并将相应的执行结果返回给到 Pull Reequest 提交者。
# 背景
不知道开发者们是否有这样的诉求,在创建 Pull Request 后,希望通过自动化检测服务能代替开发者自动做一部分的代码评审,如:
- CLA/DCO 签署
- 编程语言规范
- 编译测试
- 静态检查
……
自动化检测完成后,通过 API 手段向 Pull Request 评论区输出检测报告,并且在 Pull Request 标签上添加检测结果,如:`CLA检查成功` `静态检查成功` `编译成功`等,用于作为 Pull Request 合并的依据。有些同学一定觉得这个过程太不友好了:
- 检测报告太多,污染评论区,影响代码评审
- 检测报告没有代码行间注释
- 检测以标签展示,起不到合并卡位的作用
- 检测的触发和重新触发都需要通过评论区触发
- 检测报告无法与具体提交的 commit 代码版本一一对应
- 相同检测服务不能形成标准化服务,推广给其他组织、用户使用
……
那么,有没有一种方法可以解决上面的问题呢?
答案是:**有!**
### Pull Request 检查功能介绍
现在 Gitee 推出了 Pull Request **检查**功能,提供了以下能力:
1、Pull Request 流程能对接外部服务
2、Gitee 页面上能彰显外部服务的状态和结果,并支持界面交互直接调用外部服务提供的能力
3、提供 Pull Request 门禁能力
这里使用一个简单时序图来解释下如何接入外部服务能力

如上图所示,Gitee 推送事件并接受用户操作请求以完成对接。即 Gitee 需要提供 WebHook 事件通知和接受用户操作检测请求的 API 接口。
### 接口说明
> PS:调用检查接口,需要拥有仓库管理员的权限
#### 创建一个检查任务
> `POST` : /repos/{owner}/{repo}/check-runs
| 参数名 | 数据类型 | 参数所在位置 | 参数描述 |
|---|---|---|---|
| owner | string | path | 仓库所在的空间地址,以 https://gitee.com/oschina/git-osc 为例,`repo` 取值为 oschina |
| repo | string | path | 仓库地址,以 https://gitee.com/oschina/git-osc 为例,`repo` 取值为 git-osc |
| name | string | formData | 必填参数,检查任务名称,如:`ci-pipeline-runn` |
| head_sha | string | formData | 必填参数,表示当次代码推送时,分支上最新提交的 Commit SHA |
| details_url | string | formData | 选填,提供门禁检查项能力服务主页 **诺墨这里改一下** |
| status | string | formData | 选填,当前检查任务所处的状态。具体值可以是以下值的其中一个:
- `queued`: 表示当前检查任务处于排队中 (默认值)
- `in_progress`: 表示当前检查任务处于进行中状态
- `completed`: 表示当前检查任务已执行完毕|
| started_at | string | formData | 选填,检查任务的开始时间,要求时间格式符合 `ISO 8601` 规范 |
| completed_at | string | formData | 选填,检查任务的完成时间,要求时间格式为 `ISO 8601` 规范 |
| conclusion | string | formData | 选填,检查任务的最终状态(结论),具体值可以是以下值的其中一个:
- `action_required`: 待解决
- `cancelled`: 已取消
- `failure`: 任务失败
- `neutral`: 暂无状态
- `success`: 任务成功
- `skipped`: 跳过
- `stale`: 陈旧的
- `timed_out`: 任务超时
当检查任务结束时(`completed_at` 不为空或 `status` 取值为 `completed`),`conclusion` 必填参数。
当前字段取值为 `action_required` 时,应在 `details_url` 提供详情地址。
当任务结束,提供了结论将自动设置该检查任务为 `completed` 状态。将再也无法更改该结论 |
| output | object | formData | 选填,检查任务结束后提供的检测报告,具体数据结构参照下方 **《门禁检查报告数据结构》** |
| actions | objects | formData | 选填,在门禁检查相关界面上显示一个按钮,点击提醒你的做额外的事情 **诺墨这里改一下** |
##### 门禁检查结果报告()数据结构
门禁检查的报告通过在 `门禁检查任务` 中指定 `output` 字段,定义并输出具体的报告内容给到 Gitee,Gitee 将解析报告中包含的信息,并在门禁检查任务的详情上展示出来。以下为 `门禁检查报告` 的具体数据结构:
| 参数名 | 数据类型 | 参数描述 |
|---|---|---|
| title | string | 必填参数,检查任务报告的标题 |
| summary | string | 必填参数,检查项的总结概述,该属性支持 `Markdown` 格式 |
| text | string | 选填,检查项详细内容。该属性支持 `Markdown` 格式 |
| annotations | array of objects | 选填,用于将分析结果声明并注释到对应的代码上。具体数据结构参照下方 `分析注释数据结构`。 |
| images | array of objects | 选填,在报告中添加图像,图片将会展示在 UI 界面中。具体数据结构参照下方 `分析注释数据结构`。 |
###### 门禁检查报告 annotations 属性数据结构
门禁检查报告中,`output` 字段的 `annotations` 属性,可以通过声明的方式,将分析信息以注释的形式标注到代码行中,让用户可以在看代码的同时看到详细的分析结果。
> 标注后的注释可以在 `Pull Request 详情 > 文件`选项卡看到。
| 参数名 | 数据类型 | 参数描述 |
|---|---|---|
| path | string | 必填参数,指定标注的文件路径,如:`README.md`、`src/main/example.java`|
| start_line | integer | 必填参数,注释的起始行号 |
| end_line | integer | 必填参数,注释的结束行号 |
| start_column | integer | 选填,注释起始列数,当 `start_line` 与 `end_line` 不相等时省略 |
| end_column | integer | 选填,注释结束列数,当 `start_line` 与 `end_line` 不相等时省略 |
| annotation_level | string | 选填,注释的等级。具体值可以是以下值的其中一个:
- `notice`: 提醒
- `warning`: 警告
- `failure`:失败错误 |
| message | string | 必填参数,对这几行代码的反馈的简短描述 |
| title | string | 选填,注释的标题 |
| raw_details | string | 选填,注释的详细信息 |
###### 门禁检查报告 images 属性数据结构
门禁检查报告中,`output` 字段的 `images` 属性,可以通过声明的方式,将图片添加到报告中,图片将会展示在 UI 界面中。
| 参数名 | 数据类型 | 参数描述 |
| --------- | --------- | -------------- |
| alt | string | 必填参数,图片名 |
| image_url | string | 必填参数,图片地址 |
| caption | string | 图片描述 |
###### 门禁检查任务扩展操作(actions)数据结构
在门禁检查任务中,第三方服务可以通过定义 `actions` 属性,实现在门禁检查相关界面上显示一个按钮,用于在门禁检查任务详情中,被动触发与检查项所在服务之间的交互。以下为 `门禁检查任务扩展操作` 的具体数据结构:
| 参数名 | 数据类型 | 参数描述 |
|---|---|---|
| label | string | 必填参数,展示在 UI 界面上的标签 |
| description | string | 必填参数,描述具体操作的描述。 |
| identifier | string | 必填参数,扩展操作的唯一标识 |
#### 获取某个检查任务
> `GET` /repos/{owner}/{repo}/check-runs/{check_run_id}
| 参数名 | 数据类型 | 参数描述 |
|---|---|---|
| owner | string | 必填,仓库所在的空间地址,以 https://gitee.com/oschina/git-osc 为例,`repo` 取值为 oschina |
| repo | string | 必填,仓库地址,以 https://gitee.com/oschina/git-osc 为例,`repo` 取值为 git-osc |
| check_run_id | integer | 调用 `创建一个检查任务` 接口并成功创建检查任务后返回的检查项 ID |
#### 更新某个检查任务
`PATCH` /repos/{owner}/{repo}/check-runs/{check_run_id}
| 参数名 | 数据类型 | 参数所在位置 | 参数描述 |
|---|---|---|---|
| owner | string | path | 仓库所在的空间地址,以 https://gitee.com/oschina/git-osc 为例,`repo` 取值为 oschina |
| repo | string | path | 仓库地址,以 https://gitee.com/oschina/git-osc 为例,`repo` 取值为 git-osc |
| name | string | formData | 必填参数,检查任务名称,如:ci-pipeline-runn |
| check_run_id | integer | formData | 调用 `创建一个检查任务` 接口并成功创建检查任务后返回的检查项 ID |
| details_url | string | formData | 门禁服务提供的链接 |
| status | string | formData | 当前状态。值域 queued, in_progress, completed. 默认: queued |
| started_at | string | formData | 检查任务开始时间,要求时间格式为 ISO 8601 |
| completed_at | string | formData | 检查任务完成时间,要求时间格式为 ISO 8601 |
| conclusion | string | formData | 当 completed_at 不为空或者状态是 completed 时必填参数,检查任务最终的结论。值域为:action_required, cancelled, failure, neutral, success, skipped, stale, timed_out。 当值为 action_required 时,应在 details_url 提供详情 url。 注意:提供了结论将自动设置该检查任务为 completed 状态。将再也无法更改该结论 |
| output | object | formData | 检测报告,可以接受输出各种数据,具体数据结构参照 `创建一个检查任务`->`检查任务报告属性`
|
| actions | objects | formData | 在 Gitee 界面上显示一个按钮,具体数据结构参照 `创建一个检查任务`->`检查任务报告属性` |
#### 获取某个检查任务注释
> `GET`:/repos/{owner}/{repo}/check-runs/{check_run_id}/annotations
| 参数名 | 数据类型 | 参数描述 |
|---|---|---|
| owner | string | path | 仓库所在的空间地址,以 https://gitee.com/oschina/git-osc 为例,`repo` 取值为 oschina |
| repo | string | path | 仓库地址,以 https://gitee.com/oschina/git-osc 为例,`repo` 取值为 git-osc |
| check_run_id | integer | 调用 `创建一个检查任务` 接口并成功创建检查任务后返回的检查项 ID |
| per_page | integer | 可选参数,单次请求获取的最大数据量,最大值为 100,默认值为 20 |
| page | integer | 可选参数,请求的页数,默认值为 1 |
#### 获取指定仓库上某个提交对应的检查任务
> `GET` /repos/{owner}/{repo}/commits/{ref}/check-runs
| 参数名 | 数据类型 | 参数描述 |
|---|---|---|
| owner | string | path | 仓库所在的空间地址,以 https://gitee.com/oschina/git-osc 为例,`repo` 取值为 oschina |
| repo | string | path | 仓库地址,以 https://gitee.com/oschina/git-osc 为例,`repo` 取值为 git-osc |
| ref | string | 指定仓库上指定提交的 Commit SHA |
| check_name | string | Returns check runs with the specified name. |
| status | string | |
| per_page | integer | |
| page | integer | |
### Pull Request 检查 WebHook 数据结构说明
### WebHook 数据结构
当第三方服务在调用门禁检查项相关接口时,平台会通过 `WebHook` 将相关事件异步通知到第三方服务。具体 `WebHook` 通知数据结构如下:
| WebHook 字段 | 类型 | 字段描述 |
|---|---|---|
| action | string | 该字段表示当前用户触发的事件类型,具体值可以是以下值的其中一个:
- `created`: 创建检查任务
- `completed`: 当检查任务的状态变成完成
- `rerequested`: 当用户在 UI 界面上重新运行检查任务
- `requested_action`: 用户使用检查项提供的功能按钮 |
| requested_action | string | 第三方门禁检查服务在创建检查任务时,在门禁检查任务扩展操作(`actions`)中自定义的唯一标识 `identifier` 的值 |
| check_run | object | 被触发检查任务的详细信息 |
| project | object | 被触发检查任务所在仓库信息 |
| sender | object | 触发检查任务操作的用户信息 |
### 保护分支设置 Pull Request 准入规则
在保护分支策略里,设置「要求门禁状态成功才能合并」,勾选检查项,点击保存。在后续 Pull Request 创建检查时,如果设置「要求门禁状态成功才能合并」的检查项没有成功,该 Pull Request 是不允许合并的。
有两个注意事项:
1. 最近一周执行过的检查项才能被筛选
2. 如果设置「要求门禁状态成功才能合并」的检查项没有成功,仓库管理员可以跳过这个限制强制合并 Pull Request
快来体验吧!