首页/开发/CI/CD 与发布速查/GitHub Actions needs 作业依赖
工具链要点63 条

GitHub Actions needs 作业依赖

声明作业之间的依赖:上游失败默认阻断下游;用 if: always() / failure() 调整分支逻辑,同时 needs 是读取上游 outputs 的入口。

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

needs 作业依赖是什么

GitHub Actions 中用 needs 声明作业之间的依赖关系:默认语义是上游失败或跳过则下游跳过;需要无论结果都执行(如清理、通知、汇总)时用 always(),只在失败时执行用 failure()。needs 同时是读取上游 outputs 的入口:没有声明依赖,就无法跨作业取值,表达式会静默拿到空值。作业输出只传字符串:对象或复杂结构要序列化后再传,或改用制品上传传递文件。

基本信息

写法needs 列出上游作业名,可多个
默认语义上游失败或跳过则下游跳过
条件函数always 无论结果都运行,failure 仅失败时运行
数据传递needs 加作业名加 outputs 读取上游输出
执行顺序上游全部完成后评估下游执行条件
跳过语义上游被跳过时下游默认也跳过
结果读取needs 加作业名加 result 可获得上游结论
使用边界needs 只在单个工作流内生效

输出传递与依赖

输出传递与依赖
jobs:
  build:
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.v.outputs.version }}
    steps:
      - id: v
        run: echo "version=1.9.0" >> "$GITHUB_OUTPUT"
  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - run: echo "deploying ${{ needs.build.outputs.version }}"
  notify:
    # 汇总作业:无论成败都要通知
    needs: [build, deploy]
    if: always()
    runs-on: ubuntu-latest
    steps:
      - run: echo "pipeline finished"

条件函数速记

写法语义常见用途
needs 默认上游失败即跳过顺序串联
always()无视上游结果执行清理与通知
failure()仅上游失败时执行诊断信息收集
success()全部成功才执行严格放行门禁

典型使用场景

  • 构建与部署串联:构建成功才进入部署,失败自动阻断后续
  • 产物传递:构建作业导出版本号或镜像地址,后续作业按需读取
  • 清理与通知:用 always 保证失败时也回收资源、发送结果
  • 失败诊断:用 failure 只在出错时上传诊断包或保留现场
  • 并行加速:多个无依赖作业并行执行,汇总作业等待全部完成
  • 汇总报告:等待全部上游作业后统一统计通过、失败与跳过数量
清理与通知类作业常写 if: always():默认语义会让它们在失败时被跳过。
作业输出必须显式写入运行环境文件;仅在日志里打印的变量不会自动成为 outputs,跨作业读取会得到空值。

易错点

  • 步骤未写入运行环境文件:outputs 为空且难以定位
  • 条件函数与跳过语义嵌套:依赖被跳过时判断结果与直觉不符
  • 清理作业依赖默认语义:失败路径不被执行,资源残留堆积
  • 失败路径误判流水线结论:汇总作业条件写错会把失败标成通过

数据来源与参考

  • GitHub Docs《Using jobs in a workflow》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌