mcpField
G
github-actions

github-actions

github.com/claude-dev-suiteCloud & DevOps4657 installsUpdated 3d ago
Repository

About github-actions

A GitHub Actions reference skill for developers creating CI, test, and deployment workflows. It provides workflow patterns and guidance on security, caching, artifacts, and troubleshooting.

Key features

  1. 01CI and test workflow examples
  2. 02Database-backed job configuration
  3. 03Deployment and matrix patterns
  4. 04Reusable workflow guidance
  5. 05Security and troubleshooting advice

Use cases

  1. 01Setting up CI for a repository
  2. 02Running tests across versions and operating systems
  3. 03Reviewing workflow permissions and secrets handling
  4. 04Diagnosing workflow triggers or cache issues

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/claude-dev-suite/claude-dev-suite --skill github-actions

After installing, type/github-actionsin Claude Code to confirm it loaded.

Bundled filesquick-ref/actions.mdquick-ref/workflows.md

Details

From the project README

GitHub Actions Core Knowledge

Deep Knowledge: Use mcp__documentation__fetch_docs with technology: github-actions for comprehensive documentation.

Basic CI Workflow

# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run linter
        run: npm run lint

      - name: Run tests
        run: npm test

      - name: Build
        run: npm run build

With Database

jobs:
  test:
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:16
        env:
          POSTGRES_USER: test
          POSTGRES_PASSWORD: test
          POSTGRES_DB: testdb
        ports:
          - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    env:
      DATABASE_URL: postgresql://test:test@localhost:5432/testdb

    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npx prisma migrate deploy
      - run: npm test

Deploy Workflow

name: Deploy

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Deploy to Vercel
        uses: amondnet/vercel-action@v25
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          vercel-args: '--prod'

Matrix Strategy

jobs:
  test:
    strategy:
      matrix:
        node: [18, 20, 22]
        os: [ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}

Reusable Workflows

# .github/workflows/test.yml
on:
  workflow_call:

jobs:
  test:
    runs-on: ubuntu-latest
    steps: [...]

# Usage in another workflow
jobs:
  call-tests:
    uses: ./.github/workflows/test.yml

When NOT to Use This Skill

Skip this skill when:

  • Using GitLab CI/CD (.gitlab-ci.yml) - different syntax
  • Using Jenkins, CircleCI, Travis CI - different platforms
  • Setting up local development environments - use docker-compose skill
  • Building Docker images only (no CI needed) - use docker skill
  • Working with Bitbucket Pipelines - different platform

Anti-Patterns

Anti-PatternProblemSolution
No permission restrictionsSecurity risk, excessive accessSet minimal permissions: per job
Using action tags like @v1Breaking changes on updatesPin to SHA: @60edb5dd545a775178f52524783378180af0d1f8
Secrets in logsCredential exposureNever echo secrets, use env: only
No timeout setRunaway jobs consuming minutesSet timeout-minutes: 15 on jobs
Caching nothingSlow builds, wasted timeCache dependencies with actions/cache
Running on every commitWasted CI minutesUse paths: filters or pull_request: only
Hardcoded versionsInconsistent environmentsUse matrix strategy or env vars
No artifact retention limitHigh storage costsSet retention-days: 7 on artifacts
Storing secrets in codeSecurity breachUse GitHub Secrets, never commit
No branch protectionBypassing CI checksRequire status checks in branch rules

Quick Troubleshooting

IssueDiagnosisFix
Workflow doesn't triggerWrong event, branch filterCheck on: triggers and branch names
Job fails silentlyScript errors ignoredDon't use `
Cache never hitsCache key changingUse stable keys: hashFiles('**/package-lock.json')
"Resource not accessible"Wrong permissionsAdd required permissions: to job
Secrets not available in PRForks don't have accessUse pull_request_target (carefully) or skip secret steps
Artifact upload failsPath doesn't existCheck build output path, use if: always()
Matrix job failuresOne config fails allUse fail-fast: false to continue other jobs
Workflow takes too longNo caching, sequential jobsAdd caching, parallelize with needs:
"Context access might be invalid"Wrong context syntaxUse ${{ }} syntax, check context availability
Can't trigger another workflowNo token permissionUse PAT or GITHUB_TOKEN with write permissions

Production Readiness

Security Best Practices
# Secure workflow
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

permissions:
  contents: read
  pull-requests: write

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      # Pin actions to SHA for security
      - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          node-version: '20'

      # Use environment secrets
      - name: Deploy
        env:
          API_KEY: ${{ secrets.API_KEY }}
        run: |
          # Never echo secrets
          ./deploy.sh
Caching Strategy
jobs:
  build:
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      # Custom caching
      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.npm
            node_modules
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      # Turbo cache for monorepos
      - name: Cache Turbo
        uses: actions/cache@v4
        with:
          path: .turbo
          key: ${{ runner.os }}-turbo-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-turbo-
Artifact Management
jobs:
  build:
    steps:
      - name: Build
        run: npm run build

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build-${{ github.sha }}
          path: dist/
          retention-days: 7

  deploy:
    needs: build
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: build-${{ github.sha }}
          path: dist/
Environment Protection
jobs:
  deploy-staging:
    runs-on: ubuntu-latest
    environment: staging

  deploy-production:
    runs-on: ubuntu-latest
    needs: deploy-staging
    environment:
      name: production
      url: https://example.com
    concurrency:
      group: production-deploy
      cancel-in-progress: false
Error Handling
jobs:
  build:
    steps:
      - name: Run tests
        id: tests
        continue-on-error: true
        run: npm test

      - name: Upload test results
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-results
          path: coverage/

      - name: Check test status
        if: steps.tests.outcome == 'failure'
        run: |
          echo "Tests failed"
          exit 1

      - name: Notify on failure
        if: failure()
        uses: slackapi/slack-github-action@v1
        with:
          payload: |
            {"text": "Build failed: ${{ github.repository }}"}
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
Dependabot Configuration
# .github/dependabot.yml
version: 2
updates:
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      development-dependencies:
        patterns:
          - "@types/*"
          - "eslint*"
          - "prettier*"

  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
Release Workflow
name: Release

on:
  push:
    tags:
      - 'v*'

jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
      - uses: actions/checkout@v4

      - name: Build
        run: npm run build

      - name: Create Release
        uses: softprops/action-gh-release@v2
        with:
          files: dist/*
          generate_release_notes: true
Monitoring Metrics
MetricTarget
Build success rate> 95%
Build duration< 10min
Cache hit rate> 80%
Deployment frequencyAs needed
Checklist
  • Minimal permissions declared
  • Actions pinned to SHA
  • Secrets not exposed in logs
  • Caching configured
  • Timeouts set
  • Error notifications
  • Environment protection rules
  • Dependabot enabled
  • Branch protection rules
  • Concurrency controls

Reference Documentation

Comments

Markdown supported