如何在GitHub Actions工作流的不同Job间共享PR_NUMBER变量?
跨Job传递变量的正确方法
你的问题出在**$GITHUB_ENV设置的环境变量仅能在当前Job内部共享,无法跨Job传递**。要实现跨Job变量共享,必须使用GitHub Actions的Job Outputs机制,具体修改如下:
1. 修改check-pr Job,配置输出变量
在check-pr Job中添加outputs字段声明要传递的变量,同时将原来写入$GITHUB_ENV的逻辑改为写入$GITHUB_OUTPUT(GitHub官方推荐的最新方式,替代旧的set-output命令):
jobs: check-pr: runs-on: ubuntu-latest # 声明该Job的输出变量 outputs: pr_number: ${{ steps.check-prs.outputs.pr_number }} steps: - name: Check PRs id: check-prs run: | branch_name=${GITHUB_REF#refs/heads/} # 优化:只调用一次API,避免重复请求 pr_data=$(curl --header "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ --header "Accept: application/vnd.github.v3+json" \ "https://api.github.com/repos/${{ github.repository }}/pulls?state=open&head=${{ github.repository_owner }}:${branch_name}") pr_count=$(echo "$pr_data" | jq length) if [ $pr_count -eq 1 ]; then pr_number=$(echo "$pr_data" | jq -r '.[0].number') # 将PR编号写入Job输出 echo "pr_number=$pr_number" >> $GITHUB_OUTPUT else echo "PR count is not equal to 1. Exiting workflow." exit 1 fi
2. 修改publish Job,引用跨Job输出
在publish Job中,通过needs.check-pr.outputs.pr_number直接引用check-pr Job的输出变量,同时修正Job名称的变量引用方式(Job名称在初始化阶段解析,需直接用表达式,不能依赖env变量):
publish: needs: [check-pr] runs-on: ubuntu-latest # 直接引用输出变量定义Job名称 name: publish v0.0.1.dev${{ needs.check-pr.outputs.pr_number }} env: # 可选:如果后续步骤需要用环境变量,可以在这里赋值 PR_NUMBER: ${{ needs.check-pr.outputs.pr_number }} steps: # 示例步骤:验证变量是否获取成功 - name: Print PR number run: echo "PR Number is $PR_NUMBER" # ... 其他步骤
关键说明
$GITHUB_ENV的作用域是当前Job内的后续步骤,无法跨Job访问;而$GITHUB_OUTPUT结合Job的outputs字段,可以将变量提升为Job级别的输出,供依赖它的Job使用。- Job的
name字段属于静态配置(在Workflow初始化时解析),因此不能直接使用$PR_NUMBER这种运行时环境变量,必须直接用${{ needs.check-pr.outputs.pr_number }}表达式引用。 - 优化API调用:原来的代码两次调用GitHub API,修改后只调用一次并缓存结果,既提升效率又避免触发API限流。
内容的提问来源于stack exchange,提问作者Mehdi Ben Hamida
相关产品推荐
相关产品推荐

