Most repos use GitHub Actions for CI. But there are Actions that automate the tedious stuff youβre still doing by hand.
1. Dependabot β Auto-update dependencies
Built into GitHub. Enable it with a config file and it opens PRs for outdated dependencies automatically.
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
No more manually running npm outdated and updating one by one.
2. auto-approve β Auto-approve safe PRs
Pair with Dependabot to auto-approve patch updates. Saves the βLGTMβ click on low-risk PRs.
- uses: hmarr/auto-approve-action@v4
if: github.actor == 'dependabot[bot]'
3. release-please β Automated releases
Reads your commit messages (Conventional Commits), generates changelogs, bumps versions, and creates GitHub releases. No more manual release notes.
- uses: googleapis/release-please-action@v4
with:
release-type: node
4. lighthouse-ci β Performance checks on every PR
Runs Lighthouse on your deployed preview and fails the PR if performance drops below your threshold.
- uses: treosh/lighthouse-ci-action@v12
with:
urls: |
https://preview-${{ github.event.pull_request.number }}.example.com
budgetPath: ./budget.json
5. changed-files β Only run jobs for changed paths
Skip running your entire test suite when only docs changed. This Action tells you exactly which files were modified.
- uses: tj-actions/changed-files@v44
id: changes
with:
files: |
src/**
tests/**
- run: npm test
if: steps.changes.outputs.any_changed == 'true'
6. actions/cache β Cache dependencies between runs
Your CI installs node_modules on every run. Cache it and save 30-60 seconds per build.
- uses: actions/cache@v4
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
7. peter-evans/create-pull-request β Auto-generate PRs from scripts
Run a script that modifies files, then automatically create a PR with the changes. Perfect for code generation, formatting, or sync tasks.
- run: npm run generate-api-types
- uses: peter-evans/create-pull-request@v6
with:
title: "chore: regenerate API types"
branch: auto/api-types
8. dorny/paths-filter β Conditional job execution
Run different jobs based on which directories changed. Monorepo essential.
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
frontend:
- 'apps/web/**'
backend:
- 'apps/api/**'
9. github-script β Write Actions in JavaScript
No need to build a custom Action. Write inline JavaScript that uses the GitHub API directly.
- uses: actions/github-script@v7
with:
script: |
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: ['needs-review']
})
10. stale β Auto-close stale issues and PRs
Mark issues as stale after 30 days of inactivity, close them after 7 more days. Keeps your issue tracker clean without manual triage.
- uses: actions/stale@v9
with:
days-before-stale: 30
days-before-close: 7
stale-issue-message: "This issue has been inactive for 30 days."
Start with Dependabot + cache + changed-files. Those three alone will save you hours every week.
Related: Build a Reddit + Stack Overflow Monitor That Sends You Opportunities on Discord