首页/开发/CI/CD 与发布速查/GitHub Actions 表达式与状态函数
工具链要点63 条

GitHub Actions 表达式与状态函数

在 ${{ }} 中做条件与取值:success()/failure()/always()/cancelled() 控制运行与否,fromJSON、hashFiles 等函数做数据变换。

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

表达式是什么

在 ${{ }} 中做条件与取值:success()、failure()、always()、cancelled() 等状态函数控制步骤运行与否,fromJSON、toJSON、hashFiles 等函数做数据变换。默认语义是步骤仅在 success() 时运行——失败之后默认跳过后续步骤,所以失败收集与清理要显式写 if 条件,否则关键现场丢失。

基本信息

状态函数success、failure、always、cancelled
数据函数fromJSON、toJSON、hashFiles
默认语义步骤默认在 success() 时运行
典型失败时上传日志、条件化部署
限制表达式里不能直接引用 secrets,需先赋 env

典型使用场景

  • 失败收集:failure() 时上传日志与现场
  • 清理步骤:always() 保证执行
  • 中断处理:cancelled() 处理取消场景
  • 条件部署:按分支与变量控制部署步骤
  • 数据变换:JSON 字符串解析为对象使用
  • 缓存键:hashFiles 对锁文件计算摘要

失败时收集日志

失败时收集日志
steps:
  - run: make test          # 测试
  - if: failure()           # 仅失败时执行
    uses: actions/upload-artifact@v4
    with:
      name: logs
      path: logs/
  - if: always()            # 无论结果都执行
    run: ./cleanup.sh

函数速查

函数用途注意
success默认状态失败后不再满足
failure失败时执行收集现场
always总是执行清理与上报
cancelled取消场景中断处理
hashFiles文件摘要常做缓存键
清理步骤用 if: always():默认语义会在失败时跳过它们。
组合条件写清楚:与或非拼接时注意优先级,括号别省。
取消不同于失败:取消场景不触发 failure(),要覆盖就叠加 cancelled()。

补充场景

  • 层级判断:工作流、作业与步骤层都能用条件
  • 跳过识别:条件为假显示跳过而非失败,排查区分两种状态
没写条件默认成功才跑:想要失败也执行必须显式标注。
哈希按文件内容计算:锁文件一变缓存键就变,命中率自己控制。
含有特殊字符的字符串要加引号包裹,避免被当表达式解析。
条件顺序有讲究:把最关键的守卫放在最左,读起来先排除不该跑的情况。

排错技巧

  • 上下文打印:先用 toJSON 打印上下文定位取值,再删掉调试步骤

易错点

  • 关键风险步骤也用 always():失败后继续执行部署类动作
  • 表达式里直接引用 secrets:不支持,必须先赋 env
  • 把变量当字符串比较:类型不同导致恒真或恒假,注意数字与引号
  • 要用 failure() 收集但作业被取消:取消不触发 failure,取消失去现场,叠加 cancelled 或统一用 always
  • 调试表达式留在正式流程:把敏感上下文写进日志,排错完要清理

数据来源与参考

  • GitHub Docs《Evaluate expressions》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌