git:issue-update
1760 字约 6 分钟
git:issue-update
更新 Issue 状态,关闭或打开 Issue,修改 Issue 标签。
适用事件
工作机制
查找 Issue 是否存在 -> 检查是否符合 when 条件(可选) -> 检查是否符合 lint 条件(可选)-> 更新 issue 状态或标签
Issue 获取方式
默认情况下无需额外配置:任务会自动判断要操作的 Issue(见下文的「默认获取」)。 只有当你想从某段自定义文本中解析 IssueId(而非使用提交记录)时, 才需要配置 fromText 或 fromFile,详细说明见「参数」章节。
1. 配置了 fromFile 或 fromText 时:
从传入的文本文件或文本中解析获取。fromFile 优先级高于 fromText。
2. 默认获取(未配置 fromFile 或 fromText 时):
Issue 相关事件:
取当前 Issue。
PR 相关事件:
从该 PR 的 commits 的提交日志中解析获取。
commit.add事件:从新增 commits 的提交日志中解析获取。
非新建分支的
push事件:从本次推送 commits 的提交日志中解析获取。
其他情况:
从最新 commit 的提交日志中解析获取。
提示
如需在 branch.delete 事件中使用,由于分支已删除、 无法从上下文获取,需通过 fromText 或 fromFile 参数提供解析内容。
解析格式:从上述来源的文本中,提取以下两种格式的 IssueId:
#IssueID:表示当前仓库的 Issue。例如#123,表示当前仓库 id 为 123 的 Issue。groupName/repoName#IssueID:表示跨仓库(其他仓库)的 Issue。 例如test/test#123,表示 test/test 仓库中 id 为 123 的 Issue。
注意:
#123或test/test#123前需要有空格。
提交日志中如何带上 IssueID
提交代码时,可在提交日志中加上关联的 IssueID, 使用该内置任务时,可自动提取到关联 Issue, 用于更新 Issue 标签和状态
推荐在提交日志的 body 中带上 IssueID,命令行操作方式如下:
- 方法一:用
shift + enter换行,建议 title 和 body 之间加上一个空行
git commit -m "fix(云原生构建): 修复一个错误
cnb/feedback#123"- 方法二:
以下提交方式,title 和 body 之间会产生两个换行
git commit -m "fix(云原生构建): 修复一个错误" -m "cnb/feedback#123"参数
以下列表先概览 git:issue-update 的全部参数。
- fromText:从给定文本解析 IssueId,缺省时从提交记录解析
- fromFile:从本地文件读取并解析 IssueId,优先级高于
fromText - state:关闭或打开 Issue
- label:添加/移除 Issue 标签
- assignee:添加/移除处理人
- when:过滤条件,满足才操作
- lint:检查条件,不满足则抛异常
- defaultColor:添加标签的默认颜色
- prefix:需要处理的 Issue 前缀
各参数详细说明如下。
fromText
- type:
String - required:
false
从给定的文本中解析 IssueId。
不声明时,自动从上下文里的提交记录解析。 可以指定一个包含 IssueId 引用的文本来声明操作对象, 比如配合变更日志生成插件一起使用,将变更日志中的 IssueId 自动提取出来。
fromFile
- type:
String - required:
false
从文本文件中读取内容并解析 IssueId。优先级高于 fromText。
当内容过多时,建议使用该参数,将内容通过文件传递,避免超出限制。
state
- type: IssueStateMap
- required:
false
对应 state 属性,为 close 时,可关闭 Issue。
label
- type: UpdateLabel
- required:
false
对 label 的操作描述。
assignee
- type: UpdateAssignee
- required:
false
对 处理人 的操作描述。
when
- type: IssueUpdateStatus
- required:
false
过滤条件,多个条件之间是 or 关系。为空时表示对所有 Issue 操作。
lint
- type: IssueUpdateStatus
- required:
false
检查 Issue 是否满足条件,不满足时抛出异常, 多个条件之间是 or 关系,为空时表示不做检查。
defaultColor
- type:
String - required:
false
添加的标签的默认颜色,当有传入 label.add 参数时才有效。
prefix
- type:
String[] - required:
false
需要处理的 issue 前缀,例如如果传入的是 close 和 closed, 则会处理所有带有 close 和 closed 前缀的 issue。 例如 close #123 或 closed #123 #456
类型定义
IssueStateMap
Enum<String>: open | close
UpdateLabel
- add
- type:
Array<String>|String - required:
false
- type:
要添加的标签列表,标签不存在时,会自动创建。
- remove
- type:
Array<String>|String - required:
false
- type:
要移除的标签列表
UpdateAssignee
- add
- type:
Array<String>|String - required:
false
- type:
要添加的处理人列表。
- remove
- type:
Array<String>|String - required:
false
- type:
要移除的处理人列表
IssueUpdateStatus
- label
- type:
Array<String>|String - required:
false
- type:
标签,多个值之间是 or 关系
输出结果
{
issues // issue 列表
}权限检查
若需要更新的 Issue 属于流水线所属仓库, 且当前事件不属于不可信事件, 则不会检查流水线触发者是否拥有修改 Issue 的权限。
配置样例
- 合并到 main 后,更新标签
main:
push:
- stages:
- name: update issue
type: git:issue-update
options:
# 移除 “开发中” 标签,添加 “预发布” 标签
label:
add: 预发布
remove: 开发中
# 当有 “feature” 或 “bug” 标签才进行上述标签操作
when:
label:
- feature
- bug- Tag push 时,关闭 Issue,更新标签
$:
tag_push:
- stages:
- name: 发布操作
script: echo "可用发布任务替代当前任务"
# 发布操作后执行 issue 更新操作
- name: update issue
type: git:issue-update
options:
# 关闭 issue
state: close
# 可选择指定需要关闭的 issue 前缀,
# 如果设置了,则包含 close #123 或
# closed #123 这种才会被关闭
# prefix:
# - close
# - closed
# 移除 “预发布” 标签,添加 “已发布” 标签
label:
add: 已发布
remove: 预发布
# 当有 “feature” 或 “bug” 标签才进行上述操作
when:
label:
- feature
- bug- Tag push 时,根据当前 tag 和前一个 tag 的变更内容, 找到变更内容中包含的
IssueId,并添加标签
$:
tag_push:
- stages:
- name: changelog
image: cnbcool/changelog
settings:
latestChangeLogTarget: LATEST_CHANGELOG.md
- name: update issue
type: git:issue-update
options:
fromFile: LATEST_CHANGELOG.md
label:
add: 需求已接收
when:
label: feature