条件执行与任务依赖
在 GitHub Actions 工作流中使用 if 条件、needs 关键字、表达式和状态检查函数,控制步骤和任务的运行时机
条件执行与任务依赖 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。
为什么条件很重要
不是每个步骤都应在每次运行时执行。您可能希望部署步骤仅在 main 分支上运行,或者通知步骤仅在发生故障时运行。
GitHub Actions 允许您为任何步骤或作业附加if 条件,以控制其是否执行。
if 键
向步骤添加 if: 键。只有当表达式计算结果为 true 时,该步骤才会运行。
if 中的表达式不需要使用 ${{ }} 包装器,但使用它也可以。
steps:
- name: Deploy
if: github.ref == 'refs/heads/main'
run: ./deploy.sh上下文对象
条件会读取描述此次运行的上下文对象中的信息:
github— 事件、引用、执行者、提交 SHAenv— 环境变量job和steps— 之前工作的状态runner— OS 和架构
例如,github.event_name 会告诉您是推送还是拉取请求触发了此次运行。
状态检查函数
默认情况下,如果前一个步骤失败,就会跳过当前步骤。要覆盖此行为,请使用状态函数:
success()— 如果之前没有步骤失败,则为 true(默认值)failure()— 如果之前有任何步骤失败,则为 truealways()— 无论发生什么都会运行cancelled()— 如果此次运行已取消,则为 true
- name: Notify on failure
if: failure()
run: echo 'Build failed, sending alert'始终运行清理
一种常见模式是设置一个清理步骤,即使之前的步骤失败,该步骤也必须运行。请使用 if: always()。
这样可以确保无论结果如何,临时资源、容器或测试报告都会得到处理。
- name: Upload logs
if: always()
uses: actions/upload-artifact@v4
with:
name: logs
path: ./logs使用 needs 的作业依赖
needs 关键字会让一个作业等待其他作业完成。没有它时,各作业会并行运行。
在 needs 中列出的作业必须成功完成,依赖它的作业才能开始。
jobs:
test:
runs-on: ubuntu-latest
steps:
- run: npm test
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- run: ./deploy.sh多个依赖项
通过向 needs 传入列表,一个作业可以依赖多个作业。它会等待所有依赖项完成。
这就是构建扇入模式的方式:只有并行作业全部成功后,最终作业才会运行。
release:
needs: [lint, test, build]
runs-on: ubuntu-latest
steps:
- run: echo 'all checks passed'条件作业
if 键同样适用于作业,而不仅仅是步骤。作业级条件会决定整个作业是否运行。
这里的部署作业仅在向 main 推送时运行,同时仍然依赖测试。
deploy:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- run: ./deploy.sh使用作业输出
作业可以通过 outputs 向下游传递数据。依赖作业可以通过 needs 上下文读取这些数据。
这样,条件就可以依赖之前计算出的值,例如版本是否发生了变化。
check:
runs-on: ubuntu-latest
outputs:
changed: ${{ steps.diff.outputs.changed }}
steps:
- id: diff
run: echo 'changed=true' >> $GITHUB_OUTPUT组合条件
您可以使用 &&(与)、||(或)和 !(非)组合表达式。
此示例仅在向 main 成功推送且不是来自派生仓库时运行。
if: success() && github.ref == 'refs/heads/main' && github.event_name == 'push'使用 needs 时始终执行 if
请注意:包含 needs 的作业会在某个依赖项失败时被跳过。若要让最终报告作业无论如何都运行,请将 needs 与 if: always() 结合使用。
在其中,您可以检查 needs.<job>.result,以决定要报告的内容。
report:
needs: [test, build]
if: always()
runs-on: ubuntu-latest
steps:
- run: echo ${{ needs.test.result }}快速检查
请检验您对条件执行的理解。
回顾
您已经学会使用条件和依赖项控制工作流流程。
if根据表达式控制步骤和作业failure()和always()等状态函数可以覆盖失败时跳过的行为needs可以创建执行顺序和扇入模式- 作业的
outputs可以将值传入后续条件
借助这些基础机制,您可以构建精确而高效的流水线。
常见问题解答
「条件执行与任务依赖」课时是免费的吗?
是的 — 「条件执行与任务依赖」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。
「条件执行与任务依赖」这节课中我会学到什么?
在 GitHub Actions 工作流中使用 if 条件、needs 关键字、表达式和状态检查函数,控制步骤和任务的运行时机 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 DevOps Bootcamp 需要有经验吗?
无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「条件执行与任务依赖」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 DevOps Bootcamp 课中编写并运行代码吗?
能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 适用于多环境的矩阵构建
- 缓存依赖项以提升速度
- 可复用工作流与操作
- 条件执行与任务依赖