首页/开发/CI/CD 与发布速查/GitHub Actions 作业输出传递
工具链要点63 条

GitHub Actions 作业输出传递

作业之间通过 outputs 传值:步骤将值写入 GITHUB_OUTPUT 文件,作业级 outputs 引用步骤输出,下游用 needs 读取。

CI/CD 与发布速查开发更新于 2026-10-13

作业输出是什么

GitHub Actions 的作业之间通过 outputs 传值:步骤把键值写进 GITHUB_OUTPUT 文件,作业级 outputs 引用步骤输出,下游作业用 needs 读取。这个通道适合传版本号、制品名一类小标量;旧接口 set-output 已弃用。多行值要用定界符写法,且不要把它当可信数据直接拼进命令。

基本信息

步骤级echo "key=value" >> "$GITHUB_OUTPUT"
作业级outputs: tag: ${{ steps.x.outputs.tag }}
下游读取needs.<job>.outputs.<key>
多行值用定界符语法写入
旧接口set-output 已弃用,不要新写
限制不适合传大对象或秘密,敏感值会脱敏
调试打印 needs 上下文核对取值

输出与读取

输出与读取
jobs:
  meta:
    runs-on: ubuntu-latest
    outputs:
      tag: ${{ steps.t.outputs.tag }}  # 暴露给下游作业
    steps:
      - id: t  # 步骤 id 必须声明
        run: echo "tag=v1.9.0" >> "$GITHUB_OUTPUT"  # 写入输出文件
  use:
    needs: meta  # 声明依赖后才能读取
    runs-on: ubuntu-latest
    steps:
      - run: echo "deploy ${{ needs.meta.outputs.tag }}"  # 读取上游输出

典型使用场景

  • 版本串联:构建作业产出版本号,部署作业按版本拉取制品
  • 条件分流:上游输出决定下游是否执行
  • 制品命名:镜像标签、包名等元数据在作业间传递
  • 变更检测:输出「哪些模块变了」驱动后续矩阵
  • 结果汇总:多分片作业的结果汇总后再统一发布
  • 调试排查:打印输出链路排查传值断点
  • 多环境发布:环境名作为输出在部署链中传递

要素与写法

要素写法注意
写入>> "$GITHUB_OUTPUT"引号不能省,防空格截断
步骤输出steps.<id>.outputs.<key>id 不能漏写
作业输出outputs: key: ${{ steps... }}引用要写全
下游读取needs.<job>.outputs.<key>needs 声明依赖
多行值定界符语法普通 echo 会丢换行
典型错误needs 未声明就读取解析为空值
读取失败输出为空或未定义先查 id、needs 与写入格式
把上游输出当可信数据:来自不可信步骤的值要先校验再拼进命令,防注入。
输出通道超限会被丢弃:体积统计按作业累计,传大 JSON 前先换算。
多行值写入 GITHUB_OUTPUT 使用定界符语法;简单标量直接 key=value。
输出通道有体积上限(1 MB 级别),别用它传文件内容或大 JSON。
输出值在日志中会脱敏:含 secrets 的值被自动掩码,别靠在日志里查看输出内容。

易错点

  • 继续使用已弃用的 set-output:新运行器上出现弃用告警甚至失败,尽快迁移到 GITHUB_OUTPUT。
  • 忘记写步骤 id:作业级 outputs 引用解析失败,下游拿到空值。
  • 值含换行或特殊字符:未用定界符导致内容被截断或污染。
  • 把输出直接拼进 shell:注入风险,先校验再使用。
  • 用输出传大对象:超过限制后静默丢失。

数据来源与参考

  • GitHub Docs《Workflow commands for GitHub Actions》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌