GitHub Actions workflow_run 怎么接收上一个工作流的构建产物
把构建和发布拆成两个 GitHub Actions 工作流后,最容易踩的坑不是上传产物,而是下游工作流不知道该下载哪一次运行的产物。解决方法是:上游用 actions/upload-artifact 固定产物名,下游用 workflow_run 监听上游完成事件,再把 github.event.workflow_run.id 传给 actions/download-artifact。
官方文档:https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows
下面以构建工作流名为 Build、产物名为 dist-package 为例,只处理事件、运行记录和产物下载,不展开部署权限策略。
先把两个工作流的职责拆开
先在仓库的 .github/workflows 目录打开现有的构建工作流。在 GitHub 页面中进入 Actions → Build → 最近一次运行 → Artifacts,确认构建确实会上传一个稳定名称的产物。这里的名称就是下游下载时的匹配条件,不要每次用提交 SHA 临时拼出不同名称。
name: Build
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v6
- name: Build package
run: |
# 把项目构建结果集中放到 dist,便于下游按一个产物下载。
mkdir -p dist
echo "build output" > dist/build.txt
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
# 这个名称必须与下游 download-artifact 的 name 完全一致。
name: dist-package
path: dist/

在同一仓库新建消费工作流时,菜单路径可以按 Actions → New workflow → set up a workflow yourself 进入编辑器,文件名例如 release-package.yml。这一步只准备入口,不要把构建步骤复制到第二个工作流。
让下游只监听 Build 的完成事件
消费工作流的触发器写成 workflow_run,并在 workflows 中写上游工作流的显示名称。types: [completed] 表示只在上游完成时触发;GitHub 官方说明还要求该工作流文件存在于默认分支,并且连续串联层级不能超过三层。
name: Release package
on:
workflow_run:
# 只接收名为 Build 的上游工作流,不按文件名猜测。
workflows: [Build]
types: [completed]
permissions:
# 下载上游运行的 artifact 至少需要 Actions 读取权限。
actions: read
jobs:
consume:
# 上游失败也会触发 completed,所以成功条件放到 job 上。
if: ${{ github.event.workflow_run.conclusion == 'success' }}
runs-on: ubuntu-latest
steps:
- name: Download upstream artifact
uses: actions/download-artifact@v5
with:
# name 锁定上游上传的产物,run-id 锁定具体一次运行。
name: dist-package
run-id: ${{ github.event.workflow_run.id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
path: ${{ runner.temp }}/dist-package
- name: Show downloaded files
run: |
# 只列出下载目录,避免把整个 runner 工作区当成输入。
find "${{ runner.temp }}/dist-package" -maxdepth 2 -type f -print
注意 workflow_run 的触发并不只针对成功:上游失败、取消等完成结论也会触发事件。因此把 conclusion == 'success' 放在 job 或 step 的条件中,能避免消费失败构建。
用上游运行 ID 下载同一份产物
这里的关键字段是 github.event.workflow_run.id,不是当前消费工作流自己的 github.run_id。前者指向刚刚完成的 Build 运行,后者指向 Release package 当前这一次运行。两者混用时,最常见的表现就是找不到产物,或者下载到了另一条运行记录的文件。
在 GitHub 页面中进入 Actions → Release package → 某次运行 → Summary → Artifacts,展开任务日志可以看到下载步骤;下载目录字段应与 YAML 中的 path 一致。若采用官方示例中的临时目录,后续步骤要继续使用同一个目录读取文件。

页面上按三处信息快速排查
| 要核对的地方 | 正确状态 | 异常时先看什么 |
|---|---|---|
| 触发器 | workflow_run 监听 Build,类型为 completed | Build 的显示名称是否与 workflows 完全一致 |
| 条件 | 上游 conclusion 为 success | 是否把成功条件写在了 job 或下载步骤上 |
| 下载 | name=dist-package,run-id 使用 workflow_run.id | 产物是否过期、名称是否一致、权限是否为 actions: read |
如果只是同一个工作流里的上下游 job,优先用 needs 和普通的 download-artifact;只有跨工作流传递,才需要补上 workflow_run 的运行 ID。这样能减少事件链和排查范围。
常见问题
为什么下游工作流会触发,但下载不到文件?
先看上游运行是否真的成功,再确认产物名称完全一致,最后检查 run-id 是否来自 github.event.workflow_run.id。只写 name 而不写 run-id 时,跨工作流下载无法准确定位上游运行。
workflow_run 能不能连续串很多层?
官方事件说明限制了最多三层工作流串联。超过这个范围时,应把多个动作合并到较少的工作流中,或使用更直接的调度方式。
GitHub Actions 为什么写入 GITHUB_OUTPUT 后下个步骤取不到多行值
- 上一篇
- GitHub Actions 为什么写入 GITHUB_OUTPUT 后下个步骤取不到多行值
- 下一篇
- GitHub Actions workflow_call 怎样给复用工作流定义类型化输入
-
- 文章 · 软件教程 | 22分钟前 |
- GitHub Actions 怎么用 add-mask 隐藏脚本输出中的临时值
- 113浏览 收藏
-
- 文章 · 软件教程 | 23分钟前 | 自动化 · gitHub actions · 软件教程 · CI/CD GitHub Actions workflow commands stop-commands Actions日志
- GitHub Actions 怎么暂时停止日志里的命令解析
- 238浏览 收藏
-
- 文章 · 软件教程 | 26分钟前 |
- GitHub Actions workflow_call 怎样给复用工作流定义类型化输入
- 457浏览 收藏
-
- 文章 · 软件教程 | 32分钟前 | 自动化 · CI/CD · gitHub actions · GitHub Actions workflow commands GITHUB_OUTPUT 多行输出 步骤输出
- GitHub Actions 为什么写入 GITHUB_OUTPUT 后下个步骤取不到多行值
- 253浏览 收藏
-
- 文章 · 软件教程 | 35分钟前 | 并发控制 · gitHub actions · 软件教程 · 持续集成 · Concurrency workflow GitHub Actions cancel-in-progress 分支运行
- GitHub Actions concurrency 怎么取消同分支的旧运行
- 370浏览 收藏
-
- 文章 · 软件教程 | 45分钟前 |
- 7-Zip 命令行怎么排除目录并生成可复现压缩包
- 174浏览 收藏
-
- 文章 · 软件教程 | 50分钟前 |
- 7-Zip 测试压缩包时怎么用退出码让 CI 判断失败
- 181浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 976次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 982次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1098次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1068次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 906次使用
-
- VS Code Markdown 预览怎样同步定位当前标题
- 2026-11-04 501浏览
-
- VS Code 怎么给 Go 项目配置测试任务:tasks.json 运行与结果验收
- 2026-07-09 501浏览
-
- Windows 11 如何开启 HEIF 图片支持
- 2026-05-31 501浏览
-
- TikTok用户画像与付费订阅变现方法
- 2026-05-27 501浏览
-
- 学信网学历翻译件申请方法
- 2026-05-27 501浏览

