10 Actually Useful GitHub Actions Workflows (2026)
Generic GitHub Actions tutorials show you how to run npm test on push. This list covers the workflow patterns that real projects need: matrix builds across Node versions, semantic releases, Docker builds with caching, automated labeling, and stale issue management. Each workflow is production-ready — copy, adjust the trigger paths, and deploy.
CI & Build
CI with Matrix Build — Tests across multiple Node versions and operating systems in parallel.
name: CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node: [18, 20, 22]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node }}
cache: 'npm'
- run: npm ci
- run: npm testAuto-deploy to GitHub Pages — Builds and deploys a static site to GitHub Pages on pushes to main.
name: Deploy to Pages
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 22, cache: 'npm' }
- run: npm ci && npm run build
- uses: actions/configure-pages@v4
- uses: actions/upload-pages-artifact@v3
with: { path: './dist' }
- uses: actions/deploy-pages@v4Publish npm Package — Publishes to npm when a release is created, with provenance for supply chain security.
name: Publish to npm
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 22, registry-url: 'https://registry.npmjs.org' }
- run: npm ci
- run: npm publish --provenance --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}Automation & Management
Auto-label PRs — Applies labels based on file paths changed, branch names, or PR title patterns.
name: Auto-label PRs
on: pull_request_target
jobs:
label:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/labeler@v5
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}Add a .github/labeler.yml config:
'frontend': ['src/client/**/*']
'backend': ['src/server/**/*']
'documentation': ['docs/**/*', '*.md']
'dependencies': ['package.json', 'yarn.lock']Stale Issue/PR Management — Closes inactive issues and PRs after a period of no activity.
name: Stale management
on:
schedule:
- cron: '30 1 * * *'
jobs:
stale:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v9
with:
stale-issue-message: 'This issue is stale. Remove label or comment to keep it open.'
stale-pr-message: 'This PR is stale. Update or comment to keep it active.'
days-before-stale: 60
days-before-close: 14Dependency Updates with Dependabot — Automated pull requests for outdated dependencies.
version: 2
updates:
- package-ecosystem: 'npm'
directory: '/'
schedule: { interval: 'weekly' }
open-pull-requests-limit: 10
labels: ['dependencies']
versioning-strategy: increase
- package-ecosystem: 'github-actions'
directory: '/'
schedule: { interval: 'monthly' }Save as .github/dependabot.yml, not a workflow file.
Code Coverage Reporting — Uploads coverage data to a reporting service after tests pass.
name: Coverage
on: [push]
jobs:
coverage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 22, cache: 'npm' }
- run: npm ci
- run: npm run test:coverage
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: trueReleases & Docker
Automated Releases with semantic-release — Determines the next version, generates changelog, and publishes based on commit messages.
name: Release
on:
push:
branches: [main]
permissions:
contents: write
issues: write
pull-requests: write
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- uses: actions/setup-node@v4
with: { node-version: 22, cache: 'npm' }
- run: npm ci
- run: npx semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}Docker Build and Push — Builds a Docker image with layer caching and pushes to a registry.
name: Docker
on:
push:
branches: [main]
tags: ['v*']
jobs:
docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ghcr.io/${{ github.repository }}:${{ github.ref_name }}
cache-from: type=gha
cache-to: type=gha,mode=maxAuto-assign Reviewers — Automatically assigns PR reviewers based on a YAML config.
name: Auto-assign reviewers
on: pull_request_target
jobs:
assign:
runs-on: ubuntu-latest
permissions:
pull-requests: write
steps:
- uses: kentaro-m/auto-assign-action@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
configuration-path: '.github/auto-assign.yml'Config in .github/auto-assign.yml:
addAssignees: author
reviewers:
- team-frontend
- team-backend
numberOfReviewers: 2Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro