Comprehensive toolkit for validating, linting, and testing GitHub Actions workflow files, custom local actions, and public actions. Use this skill when working with GitHub Actions YAML files (.github/workflows/*.yml), validating workflow syntax, testing workflow execution with act, or debugging workflow issues.
Overall
score
93%
Does it follow best practices?
Validation for skill structure
Actionlint is a static checker for GitHub Actions workflow files that catches errors before they cause CI failures.
# Download and install using the official script
bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
# Or use the skill's installation script
bash scripts/install_tools.shValidate a single workflow file:
actionlint .github/workflows/ci.ymlValidate all workflow files in a directory:
actionlint .github/workflows/*.ymlValidate all workflows in the default location:
actionlintactionlintOutput example:
.github/workflows/ci.yml:5:7: unexpected key "job" for "workflow" section [syntax-check]
.github/workflows/ci.yml:10:15: invalid CRON format "0 0 * * 8" in schedule event [events]actionlint -format '{{json .}}'Useful for programmatic processing and integration with other tools.
actionlint -format sarifFor integration with GitHub Code Scanning and other security tools.
Validates YAML syntax and GitHub Actions schema:
Validates GitHub Actions expressions ${{ }}:
Example caught errors:
# Error: Boolean expression expected
if: ${{ 'true' }} # String, not boolean
# Error: Unknown function
run: echo ${{ unknown() }}
# Error: Type mismatch
if: ${{ 42 }} # Number, not booleanValidates runner labels against known GitHub-hosted runners:
Ubuntu:
ubuntu-latest (currently ubuntu-24.04)ubuntu-24.04, ubuntu-22.04, ubuntu-20.04Windows:
windows-latest (currently windows-2022)windows-2025 (NEW - recently added)windows-2022, windows-2019macOS:
macos-latest (currently macos-15)macos-15 (Apple Silicon M1/M2/M3)macos-14 (Apple Silicon M1)macos-26 (preview)macos-13 (Intel - RETIRED November 14, 2025)macos-12 (Intel - RETIRED)Example:
runs-on: ubuntu-lastest # Error: Did you mean "ubuntu-latest"?Validates action references:
Example:
# Error: Missing required input "path"
- uses: actions/checkout@v5
# Error: Unknown input "invalid_input"
- uses: actions/checkout@v5
with:
invalid_input: valueValidates needs: dependencies:
Validates schedule event CRON expressions:
# Error: Day of week must be 0-6
schedule:
- cron: '0 0 * * 8'Integrates with shellcheck to validate shell scripts in run: steps:
# Warning: Quote to prevent word splitting
run: echo $VARIABLEValidates glob patterns in path filters:
on:
push:
paths:
- '**.js' # Error: Should be '**/*.js'Detects potential security issues:
Example:
# Warning: Potential script injection
run: echo ${{ github.event.issue.title }}Create .github/actionlint.yaml or .github/actionlint.yml:
# Configure shellcheck
shellcheck:
enable: true
shell: bash
# Configure pyflakes for Python
pyflakes:
enable: true
executable: pyflakes
# Ignore specific rules
ignore:
- 'SC2086' # Ignore shellcheck rule
- 'action-validation' # Ignore action validation
# Custom runner labels
self-hosted-runner:
labels:
- my-custom-runner
- gpu-runner0: Success - no errors found1: Validation errors found2: Fatal error (invalid file, config error, etc.)# .pre-commit-config.yaml
repos:
- repo: https://github.com/rhysd/actionlint
rev: v1.7.9 # Check https://github.com/rhysd/actionlint/releases for latest version
hooks:
- id: actionlintNote: Always use the latest version of actionlint. Check the releases page for the most recent version.
name: Lint GitHub Actions workflows
on: [push, pull_request]
jobs:
actionlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- name: Download actionlint
run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
- name: Run actionlint
run: ./actionlintInstall the "actionlint" extension for real-time validation in VS Code.
# Error
runs-on: ubuntu-lastest
# Fix
runs-on: ubuntu-latest# Error
schedule:
- cron: '0 0 * * 8' # Day of week 8 doesn't exist
# Fix
schedule:
- cron: '0 0 * * 0' # Sunday = 0# Error
- uses: actions/checkout@v4
# Fix (if repository input is required)
- uses: actions/checkout@v4
with:
repository: owner/repo# Error
if: ${{ success() && 'true' }} # Mixing boolean and string
# Fix
if: ${{ success() && true }}# Error
jobs:
deploy:
needs: biuld # Typo
# Fix
jobs:
deploy:
needs: buildInstall with Tessl CLI
npx tessl i pantheon-ai/github-actions-validator@0.1.0