如何修复Github Action中PR合并后关联Issue标签操作失败问题
问题解决:PR合并后自动关联Issue并修改标签失效
问题现象
尝试通过GitHub Action实现PR合并后自动修改标签功能,但查找关联Issue、为Issue添加'done'标签、移除Issue的'development'标签这三个步骤无法正常运行。
问题原因分析
- 输出变量语法过时:使用了已废弃的
::set-output语法,GitHub Actions当前推荐使用GITHUB_OUTPUT环境变量传递步骤输出 - 命令行引号转义错误:原
echo命令中的双引号转义多余,导致输出格式异常 - 冗余判断:步骤中重复添加
if: github.event.pull_request.merged,而Job级别已经做了合并状态判断 - 潜在空值风险:未处理PR中无关联Issue的情况,可能导致后续步骤执行异常
修复后的完整代码
name: Assign Label on Merge on: pull_request: types: [closed] jobs: assign-label-on-merge: if: github.event.pull_request.merged == true runs-on: ubuntu-latest steps: - name: Check out the code uses: actions/checkout@v4 - name: Assign Label to PR uses: actions/github-script@v6 with: github-token: ${{ secrets.PULL_REQUEST_TOKEN }} script: | github.rest.issues.addLabels({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, labels: ['done'] }) - name: Remove 'development' Label from PR uses: actions/github-script@v6 with: github-token: ${{ secrets.PULL_REQUEST_TOKEN }} script: | try { await github.rest.issues.removeLabel({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, name: 'development' }) } catch (error) { // 忽略标签不存在的错误 console.log('Label "development" not found on PR, skipping removal') } - name: Find Connected Issue id: find_issue run: | # 从PR正文中提取第一个关联的Issue编号 connected_issue=$(jq --raw-output '.pull_request.body' "$GITHUB_EVENT_PATH" | grep -o '#[0-9]\+' | head -n 1 | tr -d '#') # 使用新语法输出变量,仅在有有效编号时输出 if [ -n "$connected_issue" ]; then echo "issue_number=$connected_issue" >> "$GITHUB_OUTPUT" fi - name: Assign Label to Issue if: steps.find_issue.outputs.issue_number uses: actions/github-script@v6 with: github-token: ${{ secrets.PULL_REQUEST_TOKEN }} script: | const issueNumber = parseInt(process.env.ISSUE_NUMBER) await github.rest.issues.addLabels({ issue_number: issueNumber, owner: context.repo.owner, repo: context.repo.repo, labels: ['done'] }) env: ISSUE_NUMBER: ${{ steps.find_issue.outputs.issue_number }} - name: Remove 'development' Label from Issue if: steps.find_issue.outputs.issue_number uses: actions/github-script@v6 with: github-token: ${{ secrets.PULL_REQUEST_TOKEN }} script: | const issueNumber = parseInt(process.env.ISSUE_NUMBER) try { await github.rest.issues.removeLabel({ issue_number: issueNumber, owner: context.repo.owner, repo: context.repo.repo, name: 'development' }) } catch (error) { console.log('Label "development" not found on Issue, skipping removal') } env: ISSUE_NUMBER: ${{ steps.find_issue.outputs.issue_number }}
关键修复点说明
- 替换输出变量语法:将
::set-output改为echo "key=value" >> $GITHUB_OUTPUT,符合GitHub Actions最新规范 - 添加错误捕获:在移除标签的步骤中加入
try/catch,避免因标签不存在导致Action失败 - 安全传递变量:通过
env将Issue编号传递给github-script,避免模板注入的潜在问题 - 处理空值情况:仅在找到有效Issue编号时才输出变量,避免后续步骤执行无效操作
- 移除冗余判断:删除步骤中的重复合并状态判断,精简逻辑
内容的提问来源于stack exchange,提问作者jacksondel
相关产品推荐
相关产品推荐

