表达式是什么
在 ${{ }} 中做条件与取值: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 打印上下文定位取值,再删掉调试步骤