github actions 中条件执行步骤的核心是使用 if 表达式控制单个 step 是否运行,支持上下文变量、逻辑运算符及预定义状态判断;需为前置步骤设 id 才能引用 outcome/conclusion;可结合 secrets、env 和 needs 实现跨步骤、跨 job 的安全条件控制。

GitHub Actions 中配置条件执行步骤,核心是使用 if 表达式控制单个步骤(step)是否运行,而不是整个作业(job)或工作流(workflow)。它基于上下文变量、表达式运算和预定义状态判断,灵活且实用。
用 if 控制单个步骤的执行
每个 step 可以独立添加 if 字段,值为布尔表达式。只有表达式求值为 true 时,该步骤才会执行;否则跳过,不报错也不中断后续步骤。
-
if表达式支持逻辑运算符(&&、||、!)、比较操作(==、!=、contains、startsWith等)以及 GitHub 提供的上下文对象(如github、matrix、env、needs) - 常见写法示例:
if: github.event_name == 'pull_request'if: startsWith(github.head_ref, 'feature/')if: env.NODE_ENV == 'production' - 注意:不能在
run命令里用 shell 的&&或if替代——那只是命令级控制,无法跳过步骤本身(比如不会跳过uses动作的下载和初始化)
根据上一步结果决定是否执行
可利用 steps.<id>.outcome</id> 或 steps.<id>.conclusion</id> 判断前置步骤的成功与否,实现链式条件控制。
-
outcome表示该步骤实际执行结果(success、failure、cancelled、skipped)conclusion表示最终结论(即使被跳过,也可能为success;失败后被继续执行则为failure) - 示例:仅当 lint 步骤成功才运行测试
- name: Run tests<br> if: steps.lint.outcome == 'success'<br> run: npm test
- 必须为前一步设置
id才能引用,例如:- name: Lint code<br> id: lint<br> run: npm run lint
结合环境变量与 secrets 实现安全分支逻辑
敏感操作(如生产部署)常需同时满足分支 + 权限 + 环境三重条件,避免误触发。
- 推荐组合写法:
if: github.repository_owner == 'myorg' && github.head_ref == 'main' && secrets.PROD_DEPLOY_KEY != '' - 注意:
secrets上下文在if中可用,但它的值始终为''(空字符串)或非空,不能直接比较原始值;用!= ''是最稳妥的非空判断方式 - 也可配合
env变量做开关:env:<br> DEPLOY_ENABLED: ${{ secrets.DEPLOY_ENABLED || 'false' }}<br>steps:<br>- name: Deploy to prod<br> if: env.DEPLOY_ENABLED == 'true' && github.head_ref == 'main'<br> run: ./deploy.sh
跨 job 依赖与条件执行
当某个步骤需要等待另一个 job 的结果时,可用 needs + if 实现跨作业条件判断。
- 先在上游 job 设置输出:
jobs:<br> build:<br> outputs:<br> built: ${{ steps.build-step.outputs.built }}<br> steps:<br> - id: build-step<br> run: echo "built=true" >> $GITHUB_OUTPUT - 下游 job 引用并判断:
deploy:<br> needs: [build]<br> if: needs.build.outputs.built == 'true'<br> steps:<br> - run: echo "Deploying..."
- 注意:
needs是 job 级依赖,if写在 job 层可控制整个 job 是否运行;写在 step 层则只控制该 step











