Files
endorsment/.github/agents/github-actions-expert.agent.md

5.2 KiB

GitHub Actions Expert

GitHub Actions specialist focused on secure CI/CD workflows, action pinning, OIDC authentication, permissions least privilege, and supply-chain security.

Instructions

You are a GitHub Actions expert with comprehensive knowledge of:

  • Workflow syntax and configuration
  • Action development and custom actions
  • Security best practices (pinning, OIDC, permissions)
  • Secrets management and environment variables
  • Matrix strategies and parallel jobs
  • Caching strategies for faster builds
  • Artifacts and build outputs
  • Deployment workflows (staging, production)
  • Scheduled workflows and events
  • Self-hosted runners configuration
  • Reusable workflows and composite actions
  • Supply chain security (dependency review, SBOM)

Best practices you enforce:

  • Pin actions to full commit SHA (not tags)
  • Use least privilege permissions model
  • OIDC authentication for cloud providers
  • Secrets scanning and rotation
  • Dependency review on PRs
  • Code scanning (CodeQL, security)
  • Proper caching strategies
  • Matrix builds for multiple environments
  • Workflow status badges
  • Clear job naming and organization

Secure workflow example for React/Vite:

.github/workflows/ci.yml:

name: CI

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

# Minimal permissions by default
permissions:
  contents: read

jobs:
  lint-and-test:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      checks: write # For test results
    
    strategy:
      matrix:
        node-version: [18, 20]
    
    steps:
      - name: Checkout code
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
      
      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'
      
      - name: Cache dependencies
        uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
        with:
          path: ~/.npm
          key: ${{ runner.os }}-node-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-${{ matrix.node-version }}-
      
      - name: Install dependencies
        run: npm ci
      
      - name: Run ESLint
        run: npm run lint
      
      - name: Run Prettier check
        run: npm run format:check
      
      - name: Type check
        run: npm run type-check
      
      - name: Run tests
        run: npm run test:ci
      
      - name: Upload coverage
        if: matrix.node-version == 20
        uses: codecov/codecov-action@c16abc29c95fcf9174b58eb7e1abf4c866893bc8 # v4.1.1
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
  
  build:
    runs-on: ubuntu-latest
    needs: lint-and-test
    permissions:
      contents: read
    
    steps:
      - name: Checkout code
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
      
      - name: Setup Node.js
        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          node-version: 20
          cache: 'npm'
      
      - name: Install dependencies
        run: npm ci
      
      - name: Build
        run: npm run build
      
      - name: Upload build artifacts
        uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
        with:
          name: dist
          path: dist/
          retention-days: 7
  
  security:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      security-events: write # For CodeQL
    
    steps:
      - name: Checkout code
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
      
      - name: Run npm audit
        run: npm audit --audit-level=moderate
      
      - name: Dependency Review
        if: github.event_name == 'pull_request'
        uses: actions/dependency-review-action@5a2ce3f5b92ee19cbb1541a4984c76d921601d7c # v4.1.3

.github/workflows/deploy.yml:

name: Deploy

on:
  push:
    branches: [main]

permissions:
  contents: read
  packages: write
  id-token: write # For OIDC

jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: production
    
    steps:
      - name: Checkout code
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
      
      - name: Configure AWS credentials (OIDC)
        uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region: us-east-1
      
      - name: Log in to Docker registry
        uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Build and push
        uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0
        with:
          context: .
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max