用 actionlint 在 CI 前拦截坏工作流
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/prevent-broken-github-actions-workflows-before-ci-runs-with-actionlint。
技能介绍
问题:坏工作流先烧 CI,再被发现
GitHub Actions 的 YAML 看起来门槛很低,真正跑起来却很容易翻车:with: 里写了动作并不存在的输入名,${{ }} 表达式引用了未定义的矩阵字段,cron 语法写错导致调度不生效,或者 runs-on 的标签和实际 runner 对不上。这类错误往往要到 push 触发 CI 之后才暴露,浪费了排队和执行时间,而修复成本本来在提交前就可以降到接近零。
这个技能做了什么
它在代码合入前调用 actionlint,把工作流文件当作需要静态检查的代码来审,重点包括:
- 语法与结构:解析 YAML,找出格式错误和无效字段。
- 表达式校验:检查
${{ }}里的上下文引用是否合法。 - Actions 用法核对:确认
with:传入的输入是该动作真实声明的输入,steps.{id}.outputs引用的输出名也存在。 - 运行器与调度:核对
runs-on标签、cron模式是否符合预期。 - 脚本内联检查:对
run:里的脚本做更深一层扫描时,可选接入shellcheck和pyflakes。
工作方式是让 agent 在 push 或 PR 落地之前运行检查,把失败结果直接返回给修改者,而不是等 CI 跑完再回头定位。
适用边界
- 它做的是静态检查,不会真正执行 workflow,因此无法验证动作运行时的副作用或网络依赖。
- 对 runner 标签和 cron 的判断基于你当前仓库和环境的上下文,跨仓库的标签约定需要自行对齐。
shellcheck/pyflakes是可选项,不装也能工作,只是脚本问题的覆盖会变窄。
使用场景
- 修改 `.github/workflows` 后,在 push 或 PR 落地前检查语法、表达式和 cron 是否合法
- 调整 action 调用后,核对 `with:` 传入的输入名是否真实存在于目标 action
- 为步骤配置 `runs-on` 标签时,确认标签与实际 runner 匹配,避免任务无法调度
- 编写 `run:` 内联脚本时,接入 `shellcheck` 和 `pyflakes` 检查 shell 与 Python 问题
适合人员
- 维护 GitHub 仓库的后端工程师,希望在 CI 触发前拦截工作流错误
- 负责 CI 配置的 DevOps 工程师,需要验证 action 输入和 runner 标签是否一致
- 提交 PR 的开源贡献者,希望提前发现 workflow 语法和表达式问题
- 编写 GitHub Actions 脚本的自动化工程师,需要检查内联脚本潜在缺陷