修复YouTrack-GitHub集成action报错及实现PR合并自动移卡
问题
我正在做YouTrack和GitHub的集成,需求是PR合并后,把对应的YouTrack卡片从「In Review」列移到「Done」列。现在用action-youtrack-move工具实现,已经配置了Workflow,但运行时出现Cannot read property 'matchAll' of null错误。我已经重新连接集成、验证了令牌有效性、确认了链接和列名正确,想知道怎么修复这个报错,还有更简洁高效的实现方法。
我的Workflow代码
name: youtrack on: pull_request: types: [closed] jobs: sync: runs-on: ubuntu-latest steps: - uses: bloobirds-it/action-youtrack-move@v1.0.0 with: github-token: ${{ secrets.GITHUB_TOKEN }} yt-url: ${{ secrets.YOUTRACK_URL }} yt-token: ${{ secrets.YOUTRACK_TOKEN }} yt-project-id: "JSSAPI" yt-column-target: "Done" yt-column-triggers: "In Review"
报错信息
Run bloobirds-it/action-youtrack-move@v1.0.0 with: github-token: *** yt-url: *** yt-token: *** yt-project-id: JSSAPI yt-column-target: Done yt-column-triggers: In Review yt-column-field: Stage Checking /JSSAPI-[0-9]+/g against the PR description TypeError: Cannot read property 'matchAll' of null at getMatchingTickets (/home/runner/work/_actions/bloobirds-it/action-youtrack-move/v1.0.0/dist/index.js:1003:35) at processTicksAndRejections (internal/process/task_queues.js:97:5) at async run (/home/runner/work/_actions/bloobirds-it/action-youtrack-move/v1.0.0/dist/index.js:933:21) Error: Cannot read property 'matchAll' of null
解决方案
一、修复当前action-youtrack-move的报错
这个错误的核心是PR标题或描述中未找到匹配格式的YouTrack工单编号(比如JSSAPI-123),action内置的正则/JSSAPI-[0-9]+/g匹配结果为null,导致调用matchAll时触发异常。
具体修复步骤:
- 所有需要同步的PR,必须在标题或描述中包含格式正确的YouTrack工单编号(例如
JSSAPI-456) - 如果你的工单编号格式不是默认的
[项目ID]-数字,可通过yt-ticket-regex参数自定义匹配规则,比如编号是JSSAPI_123,就在Workflow中添加一行:yt-ticket-regex: "JSSAPI_[0-9]+" - 升级action到最新版本(比如
v1.2.0),新版本修复了null值处理的问题:uses: bloobirds-it/action-youtrack-move@v1.2.0
二、更简洁高效的实现方案
不依赖第三方action,直接用YouTrack官方API配合GitHub Actions的curl命令实现,灵活性和可控性更强:
Workflow代码示例
name: Sync YouTrack on PR Merge on: pull_request: types: [closed] branches: [main] # 仅监听主分支的合并操作 jobs: sync-youtrack: runs-on: ubuntu-latest if: github.event.pull_request.merged == true # 仅PR合并时执行,关闭但未合并不触发 steps: - name: Extract YouTrack ticket number from PR id: extract-ticket run: | # 从PR标题和描述中提取工单编号,适配JSSAPI-数字格式 TICKET=$(echo "${{ github.event.pull_request.title }} ${{ github.event.pull_request.body }}" | grep -oE 'JSSAPI-[0-9]+' | head -n1) echo "ticket=$TICKET" >> $GITHUB_OUTPUT - name: Move ticket to Done column if: steps.extract-ticket.outputs.ticket != '' # 确认找到工单编号才执行 run: | # 获取「Done」列的ID(需确保自定义字段「Stage」的名称和项目ID正确) COLUMN_ID=$(curl -s -H "Authorization: Bearer ${{ secrets.YOUTRACK_TOKEN }}" \ "${{ secrets.YOUTRACK_URL }}/api/admin/projects/JSSAPI/customFields/Stage/options" \ | jq -r '.[] | select(.name == "Done") | .id') # 调用API更新工单状态到Done列 curl -X POST -H "Authorization: Bearer ${{ secrets.YOUTRACK_TOKEN }}" \ -H "Content-Type: application/json" \ "${{ secrets.YOUTRACK_URL }}/api/issues/${{ steps.extract-ticket.outputs.ticket }}/commands" \ -d '{ "commands": [ { "name": "set", "target": "Stage", "value": "'"$COLUMN_ID"'" } ] }'
方案优势
- 完全可控,不依赖第三方工具的维护进度
- 可灵活扩展逻辑(比如仅合并到指定分支才触发、批量处理多个工单编号等)
- 官方API稳定性更高,版本更新有保障
内容的提问来源于stack exchange,提问作者wilfordaf
相关产品推荐
相关产品推荐

