如何实现PR关联Issue时自动将其移至项目看板的In Review列?
实现Pull Request关联Issue自动移至“In Review”列的方案
你提到的环境变量中没有关联Issue信息是正常的——GitHub Actions的pull_request事件不会把关联Issue直接放入环境变量,但可以通过事件payload(上下文)或GitHub API提取相关信息,结合Actions完成自动移卡操作,以下是具体实现步骤:
核心逻辑
- 从Pull Request的标题/描述中提取关联的Issue编号(支持
#123或Fixes #123这类标准关联格式) - 通过GitHub API找到该Issue在项目看板中对应的卡片
- 调用API将卡片移动到“In Review”列
具体实现(GitHub Actions)
创建仓库下的.github/workflows/auto-move-issue.yml文件,内容如下:
name: Auto Move Linked Issue to In Review on: pull_request: types: [opened, synchronize] # 触发时机:PR创建或更新时 jobs: move-issue: runs-on: ubuntu-latest steps: - name: Process linked issues uses: actions/github-script@v6 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | // 1. 从PR标题和描述中提取所有关联的Issue编号(去重) const prContent = `${context.payload.pull_request.title}\n${context.payload.pull_request.body || ''}`; const issueNumbers = [...new Set(prContent.match(/#(\d+)/g)?.map(match => parseInt(match[1], 10)) || [])]; if (issueNumbers.length === 0) { console.log("No linked issues found in this PR."); return; } // 2. 替换为你的"In Review"列ID(获取方式见下文) const targetColumnId = "YOUR_IN_REVIEW_COLUMN_ID"; // 3. 遍历所有关联Issue,执行移卡操作 for (const issueNum of issueNumbers) { try { // 通过GraphQL查询Issue关联的项目卡片(比REST API更高效) const queryResult = await github.graphql(` query($owner: String!, $repo: String!, $issueNum: Int!) { repository(owner: $owner, name: $repo) { issue(number: $issueNum) { projectItems(first: 10) { nodes { id } } } } } `, { owner: context.repo.owner, repo: context.repo.repo, issueNum: issueNum }); const projectItems = queryResult.repository.issue.projectItems.nodes; if (projectItems.length === 0) { console.log(`Issue #${issueNum} is not added to any project board.`); continue; } // 移动卡片到目标列 for (const item of projectItems) { await github.rest.projects.moveCard({ card_id: item.id, column_id: targetColumnId, position: "top" }); console.log(`Successfully moved Issue #${issueNum} to "In Review" column.`); } } catch (error) { console.error(`Failed to move Issue #${issueNum}:`, error.message); } }
关键配置说明
获取“In Review”列ID:
打开你的项目看板,点击“In Review”列右上角的三个点,选择「复制列链接」,链接末尾的数字就是targetColumnId(例如链接https://github.com/orgs/xxx/projects/1/columns/1234567中的1234567)权限配置:
默认的GITHUB_TOKEN可能没有项目看板的操作权限,需要在仓库设置中:- 进入「Settings」→「Actions」→「General」
- 找到「Workflow permissions」,勾选「Read and write permissions」
- 如果是组织级项目,可能需要额外在组织设置中赋予Actions访问项目的权限
关联格式优化:
如果你只想识别带标准关键词(如Fixes/Closes/Resolves)的关联Issue,可以把提取编号的正则改为:const issueNumbers = [...new Set(prContent.match(/(Fixes|Closes|Resolves)\s+#(\d+)/g)?.map(match => parseInt(match.split('#')[1], 10)) || [])];
内容的提问来源于stack exchange,提问作者Lavínia Beghini
相关产品推荐
相关产品推荐

