You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:20:34