Claude Code Skill
Github Actions CI
Use when setting up CI/CD with GitHub Actions, writing or fixing a workflow YAML, running tests or lint on pull requests, caching dependencies, deploying on push, or debugging a failing or slow GitHub Actions run.
Install
npx skills add WST2002/claude-code-skills --skill github-actions-ci
Or copy skills/github-actions-ci into ~/.claude/skills/.
Overview
A good pipeline runs the same checks a developer runs locally, fails fast with a clear message, and finishes in minutes. Build it from the project's real commands and keep it secure by default.
Method
- Discover the checks the project already has: install, lint, typecheck, test, build commands from
package.json,Makefile,pyproject.toml,pom.xml,go.mod. Note runtime versions and services the tests need (Postgres, Redis). - Write
.github/workflows/ci.ymlfrom the template below. Add a deploy workflow only if asked, and only onmainafter CI passes. - Validate with
actionlintif available. Push to a branch and watch the run:gh run watch. - Debugging a failing run:
gh run view <id> --log-failed, reproduce the failing command locally with the same runtime version, compare environment variables and service versions.
Template
name: CI
on:
pull_request:
push:
branches: [main]
permissions:
contents: read
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
check:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
cache: npm
- run: npm ci
- run: npm run lint
- run: npm run typecheck
- run: npm test
- run: npm run build
For other stacks swap the setup step: actions/setup-python@v5 (cache: pip), actions/setup-java@v4 (cache: maven), actions/setup-go@v5 (cache built in).
Services for integration tests:
services:
postgres:
image: postgres:16
env: { POSTGRES_PASSWORD: postgres }
ports: ["5432:5432"]
options: >-
--health-cmd pg_isready --health-interval 5s --health-retries 10
Rules
| Rule | Why |
|---|---|
Least privilege: top-level permissions: contents: read, widen per job only |
Limits damage from a compromised step |
Secrets via ${{ secrets.X }} only, never echoed; no secrets on pull_request from forks |
Prevents leaks |
Pin third-party actions to a full commit SHA; official actions/* to a major version |
Supply-chain safety |
| Cache dependencies through the setup action | Faster runs |
concurrency with cancel-in-progress |
No queue of outdated runs |
timeout-minutes on every job |
Hung jobs do not burn minutes |
| Matrix only where it matters (supported runtime versions, OSes) | Each entry costs time |
Common mistakes
- CI runs commands that do not exist locally, so failures cannot be reproduced.
- Using
npm installinstead ofnpm ci. pull_request_targetwith checkout of the PR code: gives untrusted code access to secrets.- Deploying from a workflow that does not depend on tests passing.
- Hiding failures with
continue-on-error: trueor|| true.