Write secure, optimized GitHub Actions workflows. Security-first approach with performance optimization. Use when: "GitHub Actions", "CI/CD pipeline", "workflow YAML", "deploy pipeline", "automate deployment", "debug workflow", "Actions security", "generate a workflow", "optimize this workflow", "troubleshoot the failing workflow", or any former /wicked-garden:platform:actions invocation.
Resources
2Install
npx skillscat add mikeparcewski/wicked-garden/wicked-garden-platform-github-actions Install via the SkillsCat registry.
Skill-local scripts (scripts/workflow_gen.py) are stdlib-only and run base-directory-relative with python3 (py -3 on Windows).
GitHub Actions Workflow Writing
Write production-ready GitHub Actions workflows with security and performance built in.
When to Use
- Creating new CI/CD workflows
- Optimizing slow or expensive workflows
- Adding deployment pipelines
- Security scanning and compliance
- Debugging workflow issues
Run modes
Invoked as <generate|optimize|troubleshoot> [workflow file]. For the full
rubric per mode, read refs/actions-rubric.md (relative to this skill's base directory)
— security/performance checklists, stack detection, and output format. Then
apply it directly:
- generate: detect the project stack first
(ls package.json pyproject.toml Cargo.toml go.mod pom.xml 2>/dev/null),
then produce complete workflow YAML. - optimize: read the target workflow file, apply the optimization
checklist, return annotated diff. - troubleshoot: run
gh run list --status failure --limit 1, fetch logs
(gh run view {id} --log-failed), diagnose root cause inline.
Security-First Principles
Every workflow should follow these rules:
1. Explicit Permissions
# ALWAYS declare permissions explicitly
permissions:
contents: read # Minimum needed
# NEVER use write-all or leave permissions implicit2. Pin Action Versions
# Good - pinned to SHA
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608 # v4.1.0
# Acceptable - pinned to major version
uses: actions/checkout@v4
# Bad - unpinned
uses: actions/checkout@main3. Sanitize Inputs
# NEVER interpolate untrusted input directly
run: echo "${{ github.event.issue.title }}" # DANGEROUS
# Use environment variables instead
env:
TITLE: ${{ github.event.issue.title }}
run: echo "$TITLE" # SafeCore Patterns
Full copy-paste templates live in refs/templates.md. Quick reference:
| Template | Key shape | See |
|---|---|---|
| Minimal CI | permissions: contents: read + concurrency + actions/setup-node@v4 cache |
refs/templates.md § Node.js CI |
| Multi-Environment Deploy | Deploy job with environment: approval gates + OIDC-based AWS auth |
refs/templates.md § Deploy to AWS (OIDC) |
| OIDC for Cloud (No Secrets) | permissions: id-token: write + aws-actions/configure-aws-credentials@v4 |
refs/templates.md § Deploy to AWS (OIDC) |
| Docker build/push | docker/setup-buildx-action + docker/build-push-action with GHA cache |
refs/templates.md § Docker Build and Push |
| Security scanning | CodeQL on schedule + push, security-events: write permission |
refs/templates.md § Security Scanning |
Performance Optimization
1. Caching
# Node.js (built into setup-node)
- uses: actions/setup-node@v4
with:
cache: 'npm'
# Python
- uses: actions/setup-python@v5
with:
cache: 'pip'
# Custom cache
- uses: actions/cache@v4
with:
path: ~/.cache/my-tool
key: ${{ runner.os }}-my-tool-${{ hashFiles('**/lockfile') }}2. Concurrency Control
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true # Cancel stale runs3. Path Filtering
on:
push:
paths:
- 'src/**'
- 'package.json'
paths-ignore:
- '**.md'
- 'docs/**'4. Matrix Strategy
strategy:
matrix:
node: [18, 20, 22]
os: [ubuntu-latest, windows-latest]
fail-fast: false # Don't cancel others on failureCommon Mistakes
| Mistake | Fix |
|---|---|
| No timeout | Add timeout-minutes: 15 |
| No concurrency | Add concurrency group |
| Implicit permissions | Declare explicitly |
pull_request_target misuse |
Use pull_request unless you need write access |
| Unpinned actions | Pin to SHA or major version |
| Direct input interpolation | Use env vars |
Workflow Generation
When generating workflows, follow this checklist:
- Detect stack - Check for package.json, requirements.txt, Cargo.toml, etc.
- Set permissions - Start with
contents: read, add only what's needed - Add caching - Use built-in cache options when available
- Set timeout - Default 10-15 min for CI, 30 for deploys
- Add concurrency - Cancel stale runs
- Document secrets - Comment required secrets at top
References
refs/actions-rubric.md- Generate/optimize/troubleshoot rubric with checklistsrefs/security.md- Detailed security practicesrefs/templates.md- Copy-paste templatesrefs/troubleshooting.md- Common errors and fixes