自动化与脚本
编写或审查 GitHub Actions 工作流 YAML…
编辑、新增或审查 .github/workflows/ 下的工作流文件时,确保 YAML 在 GitHub Actions 层面也能被正确加载和运行。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
编写或审查 GitHub Actions通用
解决思路
- 用 `git diff --name-only origin/main... -- .github/workflows/` 找出本次改动或新增的工作流文件,然后逐行扫描所有同时包含 `${{` 与 `#`、冒号加空格或前导特殊字符的行。
- 当 `name`、`run-name`、`if`、`env`、`with`、`run` 的值内嵌 `${{ }}` 表达式且含有 `#` 或其他特殊字符时,用双引号把整个标量包起来;若内层表达式用单引号,则外层用双引号,反之亦然;不要转义 `${{ }}` 花括号,只给标量加引号即可。
- 对以下字符或模式强制加引号:空格后跟 `#`(会开启 YAML 注释并截断值)、前导 `*`、`&`、`!`、`?`、`|`、`>`、`@`、反引号(会被当作锚点/别名/标签/块标量)、前导 `{` 或 `[`(会被解析为流式映射/序列)、值内出现冒号加空格(会被解析为嵌套映射键)、有意义的前导/尾随空格(普通标量会剥离)、以及必须保持字符串的 `true`/`false`/`yes`/`no`/`on`/`off`/数字(避免 YAML 类型强制转换)。
- 用 actionlint 做权威校验:下载固定版本并校验校验和,例如 `ACTIONLINT_VERSION=1.7.7`、`ACTIONLINT_SHA256=023070a287cd8cccd71515fedc843f1985bf96c436b7effaecce67290e7e0757`,用 `curl -fsSLo actionlint.tar.gz "https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz"` 下载,用 `echo "${ACTIONLINT_SHA256} actionlint.tar.gz" | sha256sum -c -` 校验,再 `tar -xzf actionlint.tar.gz actionlint` 解压。
- 运行 `./actionlint -shellcheck= -pyflakes= -color .github/workflows/*.yml`,聚焦工作流/表达式正确性并屏蔽 shell/py 风格噪音;在 Windows PowerShell 上改用 `actionlint_<ver>_windows_amd64.zip` 资源并用 `Expand-Archive` 解压。
- 不要依赖 `yaml.safe_load`、`yamllint` 或“能解析”作为通过依据,它们会接受被注释截断的形式;只有 actionlint(或推送后观察 GitHub Actions 解析)才能校验 Actions 层。
- 确保改动通过仓库中自动运行的 actionlint CI 门禁(见 `.github/workflows/actionlint.yml`,任何触及 `.github/workflows/` 的 PR 都会触发),新增工作流也会被自动覆盖。
- 提交前按检查清单核对:所有含 `#`、冒号加空格或前导特殊字符的 `${{ }}` 值都已加引号;`actionlint -shellcheck= -pyflakes= .github/workflows/*.yml` 退出码为 0;没有工作流运行报出 “This run likely failed because of a workflow file issue”;PR 上 actionlint CI 检查为绿色。
- 避免常见坑:不要用转义 `${{` 花括号来“修复”(应给标量加引号,转义会破坏表达式);不要用单引号包裹含单引号的值(外层改用双引号);不要开启 shellcheck 后被既有 shell 风格警告淹没(用 `-shellcheck= -pyflakes=`);不要假设 YAML lint 通过就意味着工作流能运行(推送并确认作业真正启动,或依赖 actionlint 门禁)。
适用边界 · 注意事项
- 编写与 GitHub Actions 无关的 YAML(应用配置、Kubernetes、Compose、Azure Pipelines、GitLab CI)。
- 在已经合法的 `run:` 块内编写纯 shell/脚本逻辑(那是脚本任务,不是工作流语法任务)。