如何在非经典GitHub项目中通过卡片移动触发Action关闭Issue?
临时解决方案:基于Project V2事件实现自动关闭Issue
针对GitHub非经典项目无法使用project_card触发器的问题,你可以改用project_v2_item事件来实现「Issue移至Done列自动关闭」的需求,具体操作如下:
- 创建Workflow配置文件:在仓库的
.github/workflows/目录下新建close-issue-on-done.yml文件 - 配置触发器:监听
project_v2_item的edited事件(Issue在项目列间移动时会触发该事件) - 添加检测与关闭逻辑:通过脚本获取项目项关联的Issue及当前所在列,判断是否为「Done」列后执行关闭操作
以下是完整的Workflow示例:
name: Close Issue when moved to Done on: project_v2_item: types: [edited] jobs: close-issue: runs-on: ubuntu-latest steps: - name: Check if item is in Done column id: check-status uses: actions/github-script@v7 with: script: | // 获取项目项详情 const item = await github.rest.projects.getProjectV2Item({ project_id: context.payload.project_v2_item.project_id, item_id: context.payload.project_v2_item.id }); // 过滤非Issue类型的项目项 if (item.data.content_type !== 'Issue') { console.log('Not an Issue, skip'); return; } // 找到状态字段(替换成你项目中状态字段的名称,比如"Status") const statusField = item.data.field_values.nodes.find(f => f.name === 'Status'); if (!statusField) { console.log('No status field found, skip'); return; } // 替换为你Done列的选项ID const doneOptionId = 'YOUR_DONE_OPTION_ID'; if (statusField.value.id !== doneOptionId) { console.log('Not in Done column, skip'); return; } // 返回Issue编号供后续步骤使用 return item.data.content.number; - name: Close the Issue if: steps.check-status.outputs.result != '' uses: actions/github-script@v7 with: script: | await github.rest.issues.update({ owner: context.repo.owner, repo: context.repo.repo, issue_number: ${{ steps.check-status.outputs.result }}, state: 'closed' });
- 获取Done列的选项ID:用GitHub CLI执行
gh project field-value list --project 你的项目编号 --field "状态"(替换成你项目的实际编号和状态字段名),在输出结果中找到「Done」对应的ID,替换到示例中的doneOptionId - 权限配置:进入仓库「Settings」→「Actions」→「General」,将「Workflow permissions」设置为「Read and write permissions」,确保Workflow有权限修改Issue状态
内容的提问来源于stack exchange,提问作者zeepk
相关产品推荐
相关产品推荐

