OpenProject API 自动化:3 级进阶从手工登记任务到跨系统联动
2026/9/11 23:10:50 网站建设 项目流程

OpenProject API 自动化:3 级进阶从手工登记任务到跨系统联动

【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject

每次 push 都要手动去项目管理工具里补一条任务,状态变更还得靠人肉同步——这些动作其实都可以交给机器。OpenProject 是开源项目管理软件,它的 API 覆盖工作包、项目、用户三类资源。本文按 3 级递进讲 OpenProject API 自动化:先把手工点击变成一条命令,再让工作包事件通过 Webhook(事件发生时由服务端主动回调你提供的地址)推送到你的服务,最后打通代码仓库——push 自动建任务、每天定时出状态报告。所有命令均可直接复制运行。

第一级:把手工点击变成一条命令

打开 API 开关并签发密钥

开始前需要两处设置。管理员进入 Administration → API and webhooks,勾选允许用户创建个人 API 令牌,并设定 API 单次响应的最大分页大小;如果有跨域前端需要调用接口,再勾选 CORS 并填写允许的来源域名白名单。配置界面如下:

普通用户则在 Account settings 的 API 访问页面生成一枚 API 令牌,令牌只显示一次,先存好。后续所有请求都用 Basic 认证携带它,用户名填令牌、密码留空即可。

读取工作包列表

curl -s "https://<domain>/api/v3/projects/<project_id>/work_packages" \ -H "Authorization: Basic $(echo -n '<api_key>:' | base64)"

返回分页 JSON,包含每个工作包的 id、主题、状态。追加filters可按类型、优先级过滤,例如?filters=[{"type":{"values":[2]}}]。请求与响应的完整示例在 docs/api/apiv3/ 里都有。

创建与修改工作包

创建任务,类型和状态用 href 链接指定:

curl -s -X POST "https://<domain>/api/v3/work_packages" \ -H "Authorization: Basic $(echo -n '<api_key>:' | base64)" \ -H "Content-Type: application/json" \ -d '{"subject":"自动创建的任务","project":{"href":"/api/v3/projects/<project_id>"},"type":{"href":"/api/v3/types/<type_id>"},"status":{"href":"/api/v3/statuses/<status_id>"}}'

改状态只需一条 PATCH:

curl -s -X PATCH "https://<domain>/api/v3/work_packages/<work_package_id>" \ -H "Authorization: Basic $(echo -n '<api_key>:' | base64)" \ -H "Content-Type: application/json" \ -d '{"status":{"href":"/api/v3/statuses/<new_status_id>"}}'

✅ 验证方法:POST 响应里返回新工作包的self链接,把该 id 填进浏览器,工作包列表里能看到新任务,即说明链路已通。

第二级:别轮询 API,让事件自己推过来

定时任务一小时轮询一次"有没有新东西",既浪费请求又有延迟。OpenProject 内置 Webhook:工作包创建、更新,工时、评论、附件、项目事件发生时,服务端会主动 POST 一段 JSON 到你指定的地址。

配置一个 Webhook

管理员在同一 API and webhooks 页面点"+ Webhook"进入创建页,关键配置项如下:

配置项说明
名称区分用途的标识
Payload URL你方接收回调的 HTTP 端点
签名密钥共享密钥;配置后回调带X-OP-Signature头,用于验证请求确实来自 OpenProject
启用是否立即生效
事件勾选工作包创建/更新、评论、工时、附件、项目等
作用项目全部项目,或仅指定项目内的事件才触发

接收回调并校验签名

回调体统一形如{"action":"work_packages.created","work_package":{...},"actor":{...}}。签名是请求体的 HMAC-SHA1,接收端必须先验签再处理。一个最小的 Express 接收端:

const crypto = require('crypto'); app.post('/op-webhook', (req, res) => { const sig = 'sha1=' + crypto.createHmac('sha1', process.env.OP_WEBHOOK_SECRET) .update(JSON.stringify(req.body)).digest('hex'); if (req.get('X-OP-Signature') !== sig) return res.status(403).end(); if (req.body.action === 'work_packages.updated') { /* 同步逻辑 */ } res.status(200).end(); });

✅ 验证方法:先用本地临时端点接收,在 OpenProject 里建一个工作包,一分钟内收到带签名的回调即通过。回调由后台队列异步发出,实现见 modules/webhooks/。

第三级:与代码仓库和定时任务闭环

每次 push 自动建任务

把第一级的 curl 放进 GitHub Action,push 即登记任务:

# .github/workflows/openproject-sync.yml on: [push] jobs: sync: runs-on: ubuntu-latest steps: - run: | curl -s -X POST "https://<domain>/api/v3/work_packages" \ -H "Authorization: Basic ${{ secrets.OP_API_TOKEN_B64 }}" \ -H "Content-Type: application/json" \ -d "{\"subject\":\"${{ github.actor }} pushed ${{ github.sha }}\",\"project\":{\"href\":\"/api/v3/projects/<project_id>\"}}"

注意:把 base64 后的令牌放进 Secrets,不要明文写进仓库。

每日状态报告

cron 拉取未完结工作包,交给脚本生成报告并邮件发送:

# crontab -e,每天 09:00 执行 0 9 * * * curl -s "https://<domain>/api/v3/projects/<project_id>/work_packages?filters=[{\"status\":{\"values\":[1]}}]" \ -H "Authorization: Basic $(echo -n '<api_key>:' | base64)" \ | python3 daily_report.py | mail -s "OpenProject 每日报告" team@example.com

daily_report.py只做 JSON 转 Markdown,篇幅所限不展开。

上线前的三个工程实践

  • 重试:5xx 与网络超时应指数退避重试,连续失败后转告警:
def call(url, retries=3): for i in range(retries): try: r = requests.get(url, headers=H, timeout=10) r.raise_for_status() return r.json() except requests.RequestException: if i == retries - 1: raise time.sleep(2 ** i)
  • 缓存:项目列表、状态枚举这类较静态的数据用 ETag 条件请求,服务端实现可参考 lib/api/caching/cached_representer.rb。
  • 批量:大批量处理时用POST /api/v3/queries把筛选条件存成查询,再按?pageSize=调大分页反复拉取,避免每次调用都重新拼过滤串。

接下来可以做的三件事

  1. 把域名、令牌、Webhook 密钥收进团队的密钥管理,轮换时留审计记录;
  2. 在 Webhook 详情页核对投递日志,确认没有失败后,再把作用范围从单个项目扩大到全部项目;
  3. 想继续深入,从 docs/api/ 看用户、项目等其余资源,或直接访问任意 OpenProject 实例的/api/v3/spec.json获取最新 OpenAPI 规范。

三级走完,OpenProject 就从一个"被查看的工具"变成了自动化流水线里的一个节点。

【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询