GitHub Actions Validator
概述
使用行业标准工具(actionlint 和 act)验证和测试 GitHub Actions 工作流、自定义操作和公共操作。这项技能提供全面的验证,包括语法检查、静态分析、本地工作流执行测试和具有版本感知的文档查找的动作验证。
何时使用这项技能
当:
- 验证工作流文件:检查
.github/workflows/*.yml的语法错误和最佳实践 - 本地测试工作流:在推送到 GitHub 之前使用
act运行工作流 - 调试工作流失败:识别工作流配置中的问题
- 验证自定义操作:检查复合、Docker 或 JavaScript 操作
- 验证公共操作:验证来自 GitHub Marketplace 的操作的使用
- 预提交验证:确保在提交之前工作流是有效的
CRITICAL: 助手工作流(必须遵循)
每次验证都必须遵循以下步骤。跳过任何步骤都是不符合规定的。
第 1 步:运行验证脚本
cd .claude/skills/github-actions-validator
bash scripts/validate_workflow.sh <workflow-file-or-directory>
第 2 步:对于每个错误 - 参考参考文件
当 actionlint 或 act 报告任何错误时,您必须:
- 阅读适当的参考文件(见下面的映射)
- 找到匹配的错误模式
- 提取修复/解决方案
第 3 步:向用户引用修复
对于每个错误,提供:
- 错误消息(来自脚本输出)
- 解释(来自参考文件)
- 修复代码(引用自参考文件)
- 修正后的代码(应用于用户的工作流)
第 4 步:验证公共操作(如果存在)
对于任何公共操作(例如 uses: owner/action@version):
- 首先检查
references/action_versions.md以了解已知操作和版本 - 使用网络搜索 以查找未知操作:
"[action-name] [version] github action documentation" - 验证所需的输入是否匹配
- 检查弃用警告
第 5 步:提供完整的摘要
在解决所有错误之后:
- 列出所有应用的修复
- 注意任何警告
- 从
references/推荐最佳实践
错误类型到参考文件映射
| 输出中的错误模式 | 要阅读的参考文件 | 引用部分 |
|---|---|---|
runs-on:, runner, ubuntu, macos, windows |
references/runners.md |
运行器标签 |
cron, schedule |
references/common_errors.md |
计划错误 |
${{, expression, if: |
references/common_errors.md |
表达式错误 |
needs:, job, dependency |
references/common_errors.md |
作业配置错误 |
uses:, action, input |
references/common_errors.md |
动作错误 |
untrusted, injection, security |
references/common_errors.md |
脚本注入部分 |
syntax, yaml, unexpected |
references/common_errors.md |
语法错误 |
docker, container |
references/act_usage.md |
故障排除 |
@v3, @v4, deprecated, outdated |
references/action_versions.md |
版本表 |
workflow_call, reusable, oidc |
references/modern_features.md |
相关部分 |
glob, path, paths:, pattern |
references/common_errors.md |
路径过滤器错误 |
示例:完整的错误处理工作流
用户的工作流有这个错误:
runs-on: ubuntu-lastest
第 1 步 - 脚本输出:
label "ubuntu-lastest" is unknown
第 2 步 - 阅读 references/runners.md 或 references/common_errors.md:
找到 “Invalid Runner Label” 部分。
第 3 步 - 向用户引用修复:
错误:
label "ubuntu-lastest" is unknown原因: 运行器标签中的拼写错误(来自
references/common_errors.md):# 坏 runs-on: ubuntu-lastest # 拼写错误修复(来自
references/common_errors.md):# 好 runs-on: ubuntu-latest有效的运行器标签(来自
references/runners.md):
ubuntu-latest,ubuntu-24.04,ubuntu-22.04windows-latest,windows-2025,windows-2022macos-latest,macos-15,macos-14
第 4 步 - 提供修正后的代码:
runs-on: ubuntu-latest
快速开始
初始设置
cd .claude/skills/github-actions-validator
bash scripts/install_tools.sh
这将安装 act(本地工作流执行)和 actionlint(静态分析)到 scripts/.tools/。
基本验证
# 验证单个工作流
bash scripts/validate_workflow.sh .github/workflows/ci.yml
# 验证所有工作流
bash scripts/validate_workflow.sh .github/workflows/
# 仅 lint(最快)
bash scripts/validate_workflow.sh --lint-only .github/workflows/ci.yml
# 仅测试使用 act(需要 Docker)
bash scripts/validate_workflow.sh --test-only .github/workflows/
核心验证工作流
1. 使用 actionlint 进行静态分析
从静态分析开始,以捕获语法错误和常见问题:
bash scripts/validate_workflow.sh --lint-only .github/workflows/ci.yml
actionlint 检查的内容: YAML 语法、模式合规性、表达式语法、运行器标签、动作输入/输出、作业依赖关系、CRON 语法、全局模式、shell 脚本、安全漏洞。
2. 使用 act 进行本地测试
在通过静态分析后,测试工作流执行:
bash scripts/validate_workflow.sh --test-only .github/workflows/
注意: act 有限制 - 见 references/act_usage.md。
3. 完整验证
bash scripts/validate_workflow.sh .github/workflows/ci.yml
验证资源类型
工作流
# 单个工作流
bash scripts/validate_workflow.sh .github/workflows/ci.yml
# 所有工作流
bash scripts/validate_workflow.sh .github/workflows/
关键验证点: 触发器、作业配置、运行器标签、环境变量、机密、条件、矩阵策略。
自定义本地操作
创建一个测试工作流,该工作流使用自定义操作,然后进行验证:
bash scripts/validate_workflow.sh .github/workflows/test-custom-action.yml
公共操作
当工作流使用公共操作(例如 actions/checkout@v6)时:
- 使用网络搜索查找操作文档
- 验证所需的输入和版本
- 检查弃用警告
- 运行验证脚本
搜索格式: "[action-name] [version] github action documentation"
参考文件咨询指南
强制性参考咨询
| 情况 | 参考文件 | 操作 |
|---|---|---|
| actionlint 报告任何错误 | references/common_errors.md |
查找匹配的错误,引用解决方案 |
| act 出现 Docker 错误 | references/act_usage.md |
检查故障排除部分 |
| act 失败但工作流在 GitHub 上工作 | references/act_usage.md |
阅读限制部分 |
| 用户询问关于 actionlint 配置 | references/actionlint_usage.md |
提供示例 |
| 用户询问关于 act 选项 | references/act_usage.md |
阅读高级选项 |
| 检测到安全漏洞 | references/common_errors.md |
引用修复 |
| 验证操作版本 | references/action_versions.md |
检查版本表 |
| 使用现代功能 | references/modern_features.md |
检查语法示例 |
| 运行器问题/错误 | references/runners.md |
检查标签和可用性 |
脚本输出到参考映射
| 输出类别 | 参考文件 |
|---|---|
[SYNTAX] |
common_errors.md - 语法错误 |
[EXPRESSION] |
common_errors.md - 表达式错误 |
[ACTION] |
common_errors.md - 动作错误 |
[SCHEDULE] |
common_errors.md - 计划错误 |
[SECURITY] |
common_errors.md - 安全部分 |
[DOCKER] |
act_usage.md - 故障排除 |
[ACT-LIMIT] |
act_usage.md - 限制 |
参考文件摘要
| 文件 | 内容 |
|---|---|
references/act_usage.md |
Act 工具使用、命令、选项、限制、故障排除 |
references/actionlint_usage.md |
Actionlint 验证类别、配置、集成 |
references/common_errors.md |
常见错误目录及修复 |
references/action_versions.md |
当前操作版本、弃用时间表、SHA 固定 |
references/modern_features.md |
可重用工作流、SBOM、OIDC、环境、容器 |
references/runners.md |
GitHub 托管运行器(ARM64、GPU、M2 Pro、弃用) |
故障排除
| 问题 | 解决方案 |
|---|---|
| “工具未找到” | 运行 bash scripts/install_tools.sh |
| “Docker 守护进程未运行” | 启动 Docker 或使用 --lint-only |
| “权限被拒绝” | 运行 chmod +x scripts/*.sh |
| act 失败但 GitHub 工作 | 见 references/act_usage.md 限制 |
调试模式
actionlint -verbose .github/workflows/ci.yml # 详细 actionlint
act -v # 详细 act
act -n # 干运行(不执行)
最佳实践
- 始终先在本地验证 - 在推送之前捕获错误
- 在 CI/CD 中使用 actionlint - 在管道中自动验证
- 固定操作版本 - 使用
@v6而不是@main以确保稳定性;SHA 固定以确保安全性 - 保持工具更新 - 定期更新 actionlint 和 act
- 使用网络搜索未知操作 - 使用文档验证使用情况
- 检查版本兼容性 - 见
references/action_versions.md - 启用 shellcheck - 及早捕获 shell 脚本问题
- 审查安全警告 - 解决脚本注入问题
限制
- act 限制:并非所有 GitHub Actions 功能在本地工作
- Docker 要求:act 需要 Docker 运行
- 网络操作:一些 GitHub API 操作可能在本地失败
- 私有操作:无法在没有访问权限的情况下验证
- 运行时行为:静态分析无法捕获所有问题
- 文件位置:act 只能验证
.github/workflows/目录中的工作流;外部文件(如examples/)只能使用 actionlint 验证
快速示例
示例 1:预提交验证
cd .claude/skills/github-actions-validator
bash scripts/validate_workflow.sh .github/workflows/
git add .github/workflows/ && git commit -m "Update workflows"
示例 2:调试失败的工作流
bash scripts/validate_workflow.sh --lint-only .github/workflows/failing.yml
# 修复问题
bash scripts/validate_workflow.sh .github/workflows/failing.yml
完整工作示例:多错误工作流
这个示例演示了 完整的助手工作流 用于处理多个错误。
用户的问题工作流
name: Broken CI
on:
schedule:
- cron: '0 0 * * 8' # ERROR 1
jobs:
build:
runs-on: ubuntu-lastest # ERROR 2
steps:
- uses: actions/checkout@v3 # ERROR 3 (outdated)
- run: echo ${{ github.event.issue.title }} # ERROR 4 (security)
deploy:
needs: biuld # ERROR 5 (typo)
runs-on: ubuntu-latest
steps:
- run: echo "Deploying"
第 1 步:运行验证
bash scripts/validate_workflow.sh --lint-only workflow.yml
输出:
[ERROR] invalid CRON format "0 0 * * 8"
[ERROR] label "ubuntu-lastest" is unknown
[WARN] "github.event.issue.title" is potentially untrusted
[ERROR] job "deploy" needs job "biuld" which does not exist
第 2-3 步:参考参考并引用修复
错误 1:无效 CRON 表达式
来自 references/common_errors.md - 计划错误:
原因: 一周中的第 8 天不存在(有效:0-6,其中 0 = 星期日)
# 坏 schedule: - cron: '0 0 * * 8' # 第 8 天不存在 # 好 schedule: - cron: '0 0 * * 0' # 星期日CRON 格式:
minute hour day month weekday
- 工作日:0-6(0 = 星期日)
修复: 将 8 更改为 0(星期日)或 1-6 表示星期一至星期六。
错误 2:无效运行器标签
来自 references/common_errors.md - 作业配置错误和 references/runners.md:
原因: 运行器标签中的拼写错误
# 坏 runs-on: ubuntu-lastest # 拼写错误 # 好 runs-on: ubuntu-latest有效的标签(来自
references/runners.md):
ubuntu-latest(Ubuntu 24.04)ubuntu-24.04,ubuntu-22.04macos-latest(macOS 15)windows-latest(Windows Server 2022)
修复: 将 ubuntu-lastest 更改为 ubuntu-latest。
错误 3:过时的操作版本
来自 references/action_versions.md:
操作 当前版本 最低支持 actions/checkoutv6 v4 SHA 固定最佳实践:
# 推荐:SHA 固定与版本注释 - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
修复: 从 @v3 更新到 @v6(或 SHA 固定版本)。
错误 4:安全漏洞(脚本注入)
来自 references/common_errors.md - 表达式错误:
警告: 通过不受信任的输入可能发生脚本注入
# 坏 - 容易受到注入攻击 run: echo ${{ github.event.issue.title }} # 好 - 使用环境变量 env: TITLE: ${{ github.event.issue.title }} run: echo "$TITLE"为什么: 不受信任的输入(问题标题、PR 正文、提交消息)可能包含恶意命令。使用环境变量可以对输入进行清理。
修复: 通过环境变量传递不受信任的输入。
错误 5:未定义的作业依赖关系
来自 references/common_errors.md - 作业配置错误:
错误: 作业 ‘deploy’ 依赖于不存在的作业 ‘biuld’
# 坏 jobs: build: runs-on: ubuntu-latest deploy: needs: biuld # 拼写错误 # 好 jobs: build: runs-on: ubuntu-latest deploy: needs: build
修复: 将 biuld 更改为 build。
第 4 步:提供修正后的工作流
name: Fixed CI
on:
schedule:
- cron: '0 0 * * 0' # 已修复:星期日(0-6 有效)
jobs:
build:
runs-on: ubuntu-latest # 已修复:拼写错误已更正
steps:
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 - 已修复:更新版本
- name: Process issue
env:
TITLE: ${{ github.event.issue.title }} # 已修复:使用环境变量
run: echo "$TITLE"
deploy:
needs: build # 已修复:拼写错误已更正
runs-on: ubuntu-latest
steps:
- run: echo "Deploying"
第 5 步:摘要
| 错误 | 类型 | 应用的修复 |
|---|---|---|
CRON 0 0 * * 8 |
计划 | 更改为 0 0 * * 0 |
ubuntu-lastest |
运行器 | 更改为 ubuntu-latest |
checkout@v3 |
过时操作 | 更新为 @v6.0.0(SHA 固定) |
直接 ${{ }} 在运行中 |
安全 | 包装在环境变量中 |
needs: biuld |
作业依赖关系 | 更改为 needs: build |
建议:
- 定期运行
bash scripts/validate_workflow.sh --check-versions - 在生产工作流中为所有操作使用 SHA 固定
- 始终通过环境变量传递不受信任的输入
摘要
- 设置:使用
install_tools.sh安装工具 - 验证:在工作流文件上运行
validate_workflow.sh - 修复:使用参考文档解决问题
- 测试:使用 act 在本地进行验证(如果可能)
- 搜索:使用网络搜索验证未知操作
- 提交:自信地推送经过验证的工作流
如需详细信息,请参考 references/ 中的适当参考文件。