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,跨作业读取会得到空值。