logo
0
0
WeChat Login
fix: 修正执行报错

CNB Issue Property Updater

一个用于CI/CD流水线的CNB Issue属性更新插件,使用CNB OpenAPI批量更新Issue的自定义属性。

特性

  • ✅ 支持单个或批量Issue属性更新
  • ✅ 通过环境变量配置,易于集成到CI/CD流水线
  • ✅ 自动重试机制(5xx错误重试1次)
  • ✅ 结构化JSON日志输出
  • ✅ 详细的错误处理和调试信息
  • ✅ 属性冲突自动解决(同一Issue+key使用最后一个值)
  • ✅ 幂等性支持(空数组立即返回成功)

CNB 流水线配置

.cnb.yml 中配置:

main: push: - stages: - name: issue-property-updater image: cnbcool/issue-property-updater:latest settings: # CNB API端点URL, 不填则取默认环境变量 CNB_API_ENDPOINT 的值 cnb_api_endpoint: https://api.cnb.cool # CNB API访问token, 不填则取默认环境变量 CNB_TOKEN 的值 token: your-api-token # 仓库slug, 不填则取默认环境变量 CNB_REPO_SLUG 的值 repo_slug: my_slug/my-repo # 属性更新配置(JSON数组) properties: '[["#123","status","done"]]'

参数说明

参数名描述示例
cnb_api_endpointCNB API端点URL, 不填则取默认环境变量 CNB_API_ENDPOINT 的值https://api.cnb.cool
tokenCNB API访问token, 不填则取默认环境变量 CNB_TOKEN 的值your-api-token-here
repo_slug仓库slug, 不填则取默认环境变量 CNB_REPO_SLUG 的值my-repo
properties属性更新配置(JSON数组)[["#123","status","done"]]

properties 格式

简化格式(推荐)

[["#123","status","done"],["repo#456","status","in_progress"]]
  • "#123" - 使用默认仓库
  • "repo#456" - 指定仓库

完整格式

[ { "repo": "my-group/my-repo", "issueNumber": 123, "key": "status", "value": "done" } ]

本地测试

基本用法

# 设置环境变量 export PLUGIN_CNB_API_ENDPOINT="https://api.cnb.cool" export PLUGIN_CNB_TOKEN="your-api-token" export PLUGIN_REPO_SLUG="my-repo" export PLUGIN_PROPERTIES='[["#123","status","done"]]' # 运行插件 bun src/cli/index.ts

批量更新

export PLUGIN_PROPERTIES='[ ["#123","status","done"], ["#124","status","in_progress"], ["#125","priority","high"] ]' bun src/cli/index.ts

多仓库更新

export PLUGIN_PROPERTIES='[ ["repo1#123","status","done"], ["repo2#456","status","in_progress"], ["my-default-repo#789","priority","high"] ]' bun src/cli/index.ts

调试模式

bun src/cli/index.ts --verbose --debug

命令行选项

选项描述
-h, --help显示帮助信息
--version显示版本信息
-v, --verbose启用详细日志输出
-d, --debug启用调试模式

输出

成功输出(stdout)

{ "status": "success", "updated": 3, "failed": 0, "issues": [ { "issue": "#123", "key": "status", "success": true } ], "totalTime": 1250 }

错误输出(stderr)

{ "timestamp": "2026-01-27T10:30:00.000Z", "level": "error", "message": "API请求失败", "statusCode": 404, "retryAttempted": 1, "issue": "#456", "key": "status" }

退出码

退出码含义
0成功(所有属性更新成功)
1失败(至少一个属性更新失败)
2配置错误
3API错误
4网络错误

错误处理

5xx服务器错误

  • 自动重试1次
  • 重试后仍失败则记录错误并继续处理下一个操作

4xx客户端错误

  • 401: 认证失败,立即退出
  • 404: Issue未找到,记录错误并继续
  • 429: 速率限制,记录警告并继续(不重试)

属性值验证

  • 空key或value: 记录警告,继续处理
  • value长度超过1000字符: 记录警告,继续处理

冲突解决

  • 同一Issue+key指定多个值时,使用最后一个值
  • 示例: [["#123","status","A"],["#123","status","B"]] → 最终值为"B"

本地开发

# 安装依赖 bun install # 运行类型检查 bun run typecheck # 运行linter bun run lint # 格式化代码 bun run format # 构建项目 bun run build

本地开发

docker build -t cnbcool/issue-property-updater:dev .

2. 运行容器

方式一:命令行传递环境变量

docker run --rm \ -e PLUGIN_CNB_API_ENDPOINT="https://api.cnb.cool" \ -e PLUGIN_CNB_TOKEN="your-api-token" \ -e PLUGIN_REPO_SLUG="my-org/my-repo" \ -e PLUGIN_PROPERTIES='[["#123","status","done"]]' \ -v "$(pwd):/workspace" \ -w /workspace \ cnbcool/issue-property-updater:dev

许可证

MIT