如何在GitHub Actions手动触发工作流间自动共享制品?
解决方案:跨手动触发工作流自动获取制品Run ID
GitHub Actions没有原生的跨工作流持久化共享环境变量或输出的机制,但可以通过以下几种方案实现自动获取workflowA的run-id,无需手动输入:
方案1:将run-id写入仓库文件持久化
在workflowA执行末尾添加步骤,把当前run-id写入仓库的一个专用文件,提交并推送到仓库。workflowB触发时拉取最新代码,读取该文件即可获取目标run-id。
workflowA示例步骤:
- name: 保存workflowA的run-id到文件 run: echo "${{ github.run_id }}" > .workflowA_latest_run_id - name: 提交并推送文件到仓库 uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "Update workflowA latest run-id" file_pattern: .workflowA_latest_run_id
workflowB示例步骤:
- name: 读取workflowA的run-id run: | RUN_ID=$(cat .workflowA_latest_run_id) echo "WORKFLOW_A_RUN_ID=$RUN_ID" >> $GITHUB_ENV - name: 下载workflowA生成的制品 uses: actions/download-artifact@v4 with: name: 你的制品名称 run-id: ${{ env.WORKFLOW_A_RUN_ID }} repo: ${{ github.repository }}
方案2:利用仓库自定义环境变量存储run-id
在workflowA中通过GitHub API更新仓库的自定义环境变量,将run-id存入其中。workflowB触发时直接读取该变量即可。
workflowA示例步骤(需确保GITHUB_TOKEN拥有repo权限):
- name: 更新仓库环境变量保存run-id run: | curl -L \ -X PATCH \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/${{ github.repository }}/actions/variables/WORKFLOW_A_LATEST_RUN_ID \ -d '{"value":"${{ github.run_id }}"}'
workflowB示例步骤:
- name: 下载workflowA生成的制品 uses: actions/download-artifact@v4 with: name: 你的制品名称 run-id: ${{ vars.WORKFLOW_A_LATEST_RUN_ID }} repo: ${{ github.repository }}
方案3:通过GitHub Releases关联run-id
在workflowA完成后,创建或更新一个固定标签的Release,将run-id写入Release描述。workflowB触发时通过API获取该Release信息,提取出目标run-id。
workflowA示例步骤:
- name: 创建/更新Release存储run-id uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: workflowA-latest release_name: workflowA 最新制品运行记录 body: | 最新run-id: ${{ github.run_id }} draft: false prerelease: false
workflowB示例步骤:
- name: 获取workflowA的run-id run: | RUN_ID=$(curl -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ https://api.github.com/repos/${{ github.repository }}/releases/tags/workflowA-latest | \ jq -r '.body | split("最新run-id: ")[1]') echo "WORKFLOW_A_RUN_ID=$RUN_ID" >> $GITHUB_ENV - name: 下载workflowA生成的制品 uses: actions/download-artifact@v4 with: name: 你的制品名称 run-id: ${{ env.WORKFLOW_A_RUN_ID }} repo: ${{ github.repository }}
注意事项
- 所有方案都需要确保workflowA拥有足够权限(比如
GITHUB_TOKEN需包含repo范围权限) - 若需保留workflowA的历史run-id,可调整方案(比如方案1用带时间戳的文件名,方案3创建多个Release)
- 方案1会产生额外的仓库提交,若介意提交记录,优先选择方案2或3
内容的提问来源于stack exchange,提问作者Nir
相关产品推荐
相关产品推荐

