当前位置:首页 > 文章列表 > 文章 > 软件教程 > GitHub Actions workflow_run 怎么接收上一个工作流的构建产物

GitHub Actions workflow_run 怎么接收上一个工作流的构建产物

来源:17golang原创 2026-11-11 05:25:50 0浏览 收藏

把构建和发布拆成两个 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/
原创 CI 控制台界面说明图,展示 workflow_run、Build 和 completed 触发配置
图1:操作示意图,查看消费工作流的上游完成事件配置。

在同一仓库新建消费工作流时,菜单路径可以按 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 一致。若采用官方示例中的临时目录,后续步骤要继续使用同一个目录读取文件。

原创 CI 控制台界面说明图,展示成功的上游运行 ID 和 dist-package 下载结果
图2:结果示意图,查看上游运行 ID 与构建产物下载结果的对应关系。

页面上按三处信息快速排查

要核对的地方正确状态异常时先看什么
触发器workflow_run 监听 Build,类型为 completedBuild 的显示名称是否与 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 能不能连续串很多层?

官方事件说明限制了最多三层工作流串联。超过这个范围时,应把多个动作合并到较少的工作流中,或使用更直接的调度方式。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
GitHub Actions 为什么写入 GITHUB_OUTPUT 后下个步骤取不到多行值GitHub Actions 为什么写入 GITHUB_OUTPUT 后下个步骤取不到多行值
上一篇
GitHub Actions 为什么写入 GITHUB_OUTPUT 后下个步骤取不到多行值
GitHub Actions workflow_call 怎样给复用工作流定义类型化输入
下一篇
GitHub Actions workflow_call 怎样给复用工作流定义类型化输入
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    976次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    982次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    1098次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    1068次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    906次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码