agentsclimarketplace

Github actions

Skill siva01c/claude-plugins/cicd-tools/skills/github-actions

Claude Code plugin marketplace: Drupal development, DDEV, Docker, CI/CD, git workflows, and OWASP ASVS security

Install
npx -y skills add siva01c/claude-plugins --skill github-actions

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 17 stars17 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Use this skill when authoring or debugging GitHub Actions workflows (.github/workflows/*.yml) — e.g. "add CI for this Drupal project on GitHub", "run phpcs/phpstan/phpunit on pull requests", "cache composer dependencies", "deploy over SSH when main is pushed", "why didn't my workflow trigger", or anything involving jobs, matrices, runners, secrets, or reusable workflows.

SKILL.md

5.1 KB, as published. Nobody here has run it

GitHub Actions Skill

GitHub Actions runs workflows from .github/workflows/*.yml. This skill covers workflow authoring with a Drupal project as the working example: linting, static analysis, PHPUnit with a database service, and SSH/drush deployment.


Workflow anatomy

name: CI

on:
  pull_request:
  push:
    branches: [main]

permissions:
  contents: read            # least privilege — grant more only per job

concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: true  # newer push cancels the outdated run

jobs:
  phpcs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
          tools: composer:v2
      - uses: actions/cache@v4
        with:
          path: ~/.composer/cache
          key: composer-${{ hashFiles('composer.lock') }}
          restore-keys: composer-
      - run: composer install --no-progress
      - run: vendor/bin/phpcs --standard=Drupal,DrupalPractice web/modules/custom

Key defaults to always set:

  • permissions: — the implicit token is powerful; start from contents: read and widen per job only when needed.
  • concurrency: — avoids burning runner minutes on superseded pushes.

PHPUnit with a database service

  phpunit:
    runs-on: ubuntu-latest
    services:
      db:
        image: mariadb:11.4
        env:
          MARIADB_DATABASE: drupal_test
          MARIADB_ROOT_PASSWORD: root
        ports: ['3306:3306']
        options: >-
          --health-cmd="healthcheck.sh --connect --innodb_initialized"
          --health-interval=10s --health-timeout=5s --health-retries=5
    env:
      SIMPLETEST_DB: mysql://root:[email protected]:3306/drupal_test
      SIMPLETEST_BASE_URL: http://localhost
    steps:
      - uses: actions/checkout@v4
      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'
          extensions: gd, pdo_mysql
      - run: composer install --no-progress
      - run: vendor/bin/phpunit -c web/core/phpunit.xml.dist web/modules/custom

services: containers get health-checked before steps run — no manual wait loops. From the runner they are reachable on 127.0.0.1:<mapped port>.

Matrix builds

    strategy:
      matrix:
        php: ['8.3', '8.4']
    steps:
      - uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}

Deployment job

  deploy:
    if: github.ref == 'refs/heads/main' && github.event_name == 'push'
    needs: [phpcs, phpunit]
    runs-on: ubuntu-latest
    environment:
      name: production
      url: https://www.example.com
    steps:
      - uses: webfactory/[email protected]
        with:
          ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
      - run: |
          ssh -o StrictHostKeyChecking=accept-new [email protected] \
            "cd /var/www/site && git pull --ff-only \
             && composer install --no-dev --optimize-autoloader \
             && vendor/bin/drush deploy -y"
  • needs: gates deployment on green checks.
  • environment: enables required reviewers and deployment history (Settings → Environments) — use it for production approval gates.
  • Secrets live in repo/environment settings, referenced via ${{ secrets.NAME }}. For cloud providers prefer OIDC (permissions: id-token: write + the provider's auth action) over long-lived keys.

Reuse

  • Reusable workflow — a whole workflow callable from others:

    # .github/workflows/drupal-tests.yml
    on:
      workflow_call:
        inputs:
          php-version: { type: string, default: '8.3' }
    
    # caller
    jobs:
      tests:
        uses: ./.github/workflows/drupal-tests.yml
        with:
          php-version: '8.4'
    
  • Composite action — a reusable step sequence in .github/actions/<name>/action.yml (e.g. "setup PHP + composer install with cache") to deduplicate job boilerplate.


Troubleshooting

SymptomFix
Workflow doesn't triggerCheck on: filters — branches:/paths: excluded the ref, or push was from a workflow using the default token (no recursive triggers)
Permission denied on push/comment from jobWiden permissions: for that job (e.g. pull-requests: write)
Composer cache never hitsKey on hashFiles('composer.lock') and add a restore-keys: prefix fallback
PHPUnit can't reach DBUse 127.0.0.1 with the mapped port, not the service name (service names only resolve in container jobs)
Deploy ran before tests finishedAdd the test jobs to needs: of the deploy job
Two runs per PR pushpush: + pull_request: both trigger — restrict push: to branches: [main]

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.