Actionlint 工作流检查
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/lint-github-actions-workflows-before-ci-runs-with-actionlint 到当前 AI 助手。
技能介绍
先说清楚要解决的问题
GitHub Actions 的 YAML 有一个很危险的特性:语法正确不代表语义正确。run: 里的命令写错了、with: 传了 action 根本没定义的 input、steps.<id>.outputs 引用了不存在的输出,这些错误不会在本地暴露,只有真正 push 之后 CI 才会告诉你,而代价是已经浪费了一轮流水线。
更麻烦的是表达式层面。${{ matrix.platform }}-node-${{ hashFiles('**/package-lock.json') }} 这类写法在文件里看起来完全正常,但 matrix 没有定义对应 key、或 actions/setup-node@v4 已经改名了 input,问题要等到 runner 解析时才出现。
这个技能做了什么
核心思路是把校验左移到 CI 之前:拿到 actionlint 二进制和仓库里的工作流文件,直接在本地跑静态检查,让问题在 commit 阶段就被拦住。
能力集中在三类检查上:
- Workflow 语法校验:YAML 结构、
on/jobs/steps的层级是否符合 schema - Actions 用法检查:核对
with:传入的 input 是否在 action 声明的可用列表里,以及steps.<id>.outputs的引用是否真实存在 - 脚本静态分析:对
run:里的内容做集成检查,借助shellcheck和pyflakes覆盖 shell 与 Python 脚本的常见错误
一个真实报错的例子可以说明这类检查的价值:
test.yaml:17:11: input "node_version" is not defined in action "actions/setup-node@v4".
available inputs are "always-auth", "architecture", "cache", ...
也就是说,有人把 node-version 写成了 node_version,actionlint 直接给出了期望的 input 列表,而不是等 CI 阶段拿到一个含糊的运行失败。
适用边界与注意点
这个技能的定位是静态检查,不是运行时验证。它能保证你写的工作流在语法和 schema 层面自洽,但无法保证 action 的实际行为、权限配置是否够用、或者某个 job 在真实环境里能否成功。
几个实际使用时需要留意的点:
- 检查质量取决于
actionlint的版本,上游更新后建议定期重新跑一遍,避免漏掉新 action 的 input 变更 - 对第三方 action 的 input 校验依赖其元数据,如果 action 本身声明不规范,检查结果也不可靠
shellcheck/pyflakes集成只覆盖脚本层面,不会模拟环境变量或 runner 行为- 它不替代 CI 里的
--actionlint集成步骤,更适合作为提交前的本地预检
总的来说,这是一个在 push 之前给工作流做一次"快速体检"的工具,把本该花在排队等 CI 上的时间提前消化在本地。
使用场景
- 本地提交前检查 GitHub Actions 工作流语法、表达式和 shell 脚本,确认未破坏 CI 配置后再 push。
- 修改 YAML 结构或表达式后,验证 jobs、steps、with、outputs 引用是否正确,避免 CI 阶段报错。
- 对第三方 action 的 input 参数、cache 配置和 script 行为进行静态核对,排查 input 未定义或输出不匹配。
- 排查 run 脚本中 shell 语法和 Python 语法错误,减少因 shellcheck、pyflakes 类问题导致的 CI 失败。
适合人员
- 后端或 DevOps 工程师,经常编写 GitHub Actions CI 流程,希望提交前确认语法和引用正确。
- 前端工程师,需要维护 Node.js 构建或发布工作流,担心 matrix、cache 或 setup-node 参数配置出错。
- 开源贡献者或企业内部项目 PR 提交者,修改 workflow 后希望本地快速自检,减少 CI 排队后的失败成本。
- 自动化工具或 CI 模板维护者,希望批量校验仓库中的 workflow 文件,保持多项目 CI 配置一致。