Workflow Usage Guide
July 9, 2026 · View on GitHub
Detailed setup, configuration, and best practices for each workflow template.
For centrally maintained callable workflows, see Reusable Workflows.
For shared step-level building blocks, see Composite Actions.
Table of Contents
- Node.js Test & Coverage
- npm Release & GitHub Release
- CodeQL Analysis
- Auto-Label Pull Requests
- Mark Stale Issues & PRs
- Gitleaks Secret Scan
- Dependency Review
- Dependabot Auto-Merge
- Trufflehog Secret Scan
- OpenSSF Scorecard
- Deploy Docusaurus to GitHub Pages
- Submit IndexNow Notification
- Git-Cliff Release Notes Validation
- Automatic Pull Request Rebase
- Ps Secret Scanner Secret Scan
- Ai Issue And Pull Request Summary
- First Interaction Greeting
- Clean Old GitHub Releases
- Node Dependency Validation
- Virus Total Release Asset Scan
- Upload Release Assets To Internet Archive
- Codacy Coverage Upload
- Mega Linter
- Playwright End-To-End Tests
- GitHub Release Stats
- Sonar Cloud Analysis
- Update Changelogs
- Deploy Jekyll To GitHub Pages
- Actionlint
- Dev Skim Security Analysis
- Ossar Security Analysis
- Prettier Check
- Lychee Link Check
- JSCPD Copy/Paste Detection
- Repository Metrics
- Microsoft Security DevOps
- Generate XML Sitemap
- Spellcheck
- Deploy Static Content To GitHub Pages
- Stylelint Check
- Super Linter
- Typos Spell Check
- General Troubleshooting
- Resources
Node.js Test & Coverage
File: node-test-matrix.yml
Purpose: Run tests across Linux, Windows, and macOS with coverage upload to Codecov.
Node.js Test & Coverage Getting Started
-
Ensure your project has:
package.jsonwith test script- Test framework (Vitest, Jest, Mocha, etc.)
.node-versionfile (optional; workflow auto-detects)
-
(Optional) Add Codecov:
npm install --save-dev @vitest/coverage-v8 -
(Optional) Enable Codecov:
- Visit https://codecov.io and sign in with GitHub
- Activate your repository
- For private repos, add secret:
CODECOV_TOKEN
Node.js Test & Coverage Configuration Options
Adjust Node versions:
strategy:
matrix:
node-version: [20.x, 21.x, 22.x]
os: [ubuntu-latest, windows-latest, macos-latest]
Reduce test matrix (save costs):
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
node-version: 20.x
- os: ubuntu-latest
node-version: 22.x
Custom test script:
- name: Run tests
run: npm run test:ci
Node.js Test & Coverage Best Practices
- Keep
npm testdeterministic and CI-safe; put coverage flags in the test script if your runner needs them. - Reduce the OS matrix before removing checks entirely if hosted-runner cost becomes an issue.
- Keep Codecov upload on one OS unless you intentionally need per-OS coverage flags.
- Use
.node-versionas the source of truth for the Node runtime used byactions/setup-node.
npm Release & GitHub Release
File: npm-release.yml
Purpose: Publish to npm and create GitHub release on version tags.
npm Release Getting Started
-
Choose a publishing model:
- Trusted publishing: preferred after npm trusted publishing is configured for the repository.
- Token-based publishing: supported by the template through
NPM_TOKEN.
-
For token-based publishing, create npm token:
- Visit https://npmjs.com/settings/~/tokens
- Create "Automation" token (no expiration if possible)
-
Store in GitHub Secrets:
- Settings → Secrets and variables → Actions
- Create
NPM_TOKENwith your token value
-
Configure
package.json:{ "name": "@your-org/your-package", "version": "1.0.0", "repository": "https://github.com/your-org/your-repo" } -
Create and push a version tag:
npm version minor git push origin main --tags
npm Release Configuration Options
Custom release notes:
- name: Create GitHub Release
uses: actions/create-release@v1
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
body: My custom release notes
Pre-publish checks:
- name: Lint and test
run: npm run lint && npm run test
npm Release Best Practices
- Run package validation before publishing. If your repository has scripts such as
release:check,publint, orattw, keep them in the release workflow. - Prefer npm trusted publishing with provenance for long-term maintenance.
- If you are bootstrapping trusted publishing for the first time, npm may require an initial manual publish outside the normal provenance flow.
- Keep
contents: writeandid-token: writescoped to the release workflow, not general CI.
CodeQL Analysis
File: codeql-analysis-advanced.yml
Purpose: Security scanning for JavaScript/TypeScript code and GitHub Actions workflows.
CodeQL Analysis Getting Started
CodeQL runs automatically on push/PR. No special setup required!
-
(Optional) Create custom config:
# .github/codeql-config.yml name: "CodeQL config" queries: - uses: security-and-quality paths: - src paths-ignore: - test -
Review alerts:
- Go to Settings → Code security and analysis
- Check "Code scanning" is enabled
CodeQL Analysis Configuration Options
Set no-build CodeQL languages when using the reusable workflow:
jobs:
codeql:
uses: Nick2bad4u/workflow-templates/.github/workflows/reusable-codeql-analysis-advanced.yml@main
with:
languages: '["javascript-typescript","actions"]'
Use the manual-build reusable workflow for compiled or custom-build repositories:
jobs:
codeql:
uses: Nick2bad4u/workflow-templates/.github/workflows/reusable-codeql-analysis-build.yml@main
with:
languages: '["java-kotlin"]'
build-command: "./gradlew clean build"
Schedule weekly scans:
on:
schedule:
- cron: "0 2 * * 0"
CodeQL Analysis Best Practices
- Keep the default scheduled scan; PR-only CodeQL misses issues introduced by dependency or query updates.
- Use a CodeQL config file only when you need path filtering or custom query suites.
- Avoid excluding tests unless CodeQL noise is proven; tests often contain workflow and helper patterns worth scanning.
Auto-Label Pull Requests
File: labeler.yml
Purpose: Automatically apply labels to PRs based on changed files.
Auto-Label Pull Requests Getting Started
-
Create
.github/labeler.yml:documentation: - changed-files: - any-glob-to-any-file: "docs/**" ci: - changed-files: - any-glob-to-any-file: - ".github/**" - ".eslintrc*" - "package.json" backend: - changed-files: - any-glob-to-any-file: "src/api/**" frontend: - changed-files: - any-glob-to-any-file: "src/components/**" -
Create labels in your repo:
- Issues → Labels
- Add labels: documentation, ci, backend, frontend, etc.
Auto-Label Pull Requests Configuration Options
Multiple conditions (AND logic):
bug-fix:
- changed-files:
- any-glob-to-any-file: "src/**"
- changed-files:
- all-globs-to-any-file:
- "**/bug-fix-*.md"
Exclude certain paths:
tests-only:
- changed-files:
- any-glob-to-any-file: "test/**"
- all-globs-to-any-file:
- "!README.md"
Auto-Label Pull Requests Best Practices
- Create labels before enabling the workflow, so early PRs do not fail or silently skip expected labels.
- Keep label rules path-based and predictable; avoid labels that imply review status or merge approval.
- Review the labeler config when directories are renamed.
Mark Stale Issues & PRs
File: stale-management.yml
Purpose: Automatically label and close stale issues/PRs after inactivity.
Stale Issues & PRs Getting Started
No setup required! Workflow runs on a daily schedule by default.
Stale Issues & PRs Configuration Options
Adjust inactivity thresholds:
- uses: actions/stale@v9
with:
days-before-stale: 30
days-before-close: 14
stale-issue-label: "stale"
close-issue-label: "closed"
Exempt certain labels:
- uses: actions/stale@v9
with:
exempt-issue-labels: "pinned,security"
exempt-pr-labels: "pinned,critical"
Custom messages:
- uses: actions/stale@v9
with:
stale-issue-message: "This issue is stale; closing soon."
close-issue-message: "Closed due to inactivity."
stale-pr-message: "This PR is stale; closing soon."
close-pr-message: "Closed due to inactivity."
Stale Issues & PRs Best Practices
- Exempt security, pinned, roadmap, and actively maintained labels.
- Start with conservative close windows; aggressive stale automation creates maintenance noise.
- Use
workflow_dispatchfor manual dry runs after changing thresholds.
Gitleaks Secret Scan
File: gitleaks-scan-enhanced.yml
Purpose: Detect leaked secrets (API keys, passwords, tokens) in code.
Gitleaks Secret Scan Getting Started
Gitleaks runs automatically on every push/PR. No setup required!
-
(Optional) Create custom rules:
# .gitleaks.toml [allowlist] regexes = [ '''test-pattern''' ] paths = [ '''test/fixtures/.*''' ]
Gitleaks Secret Scan Configuration Options
Use custom config:
- name: Run Gitleaks
uses: gitleaks/gitleaks-action@v2.2.0
with:
config-path: .gitleaks.toml
report-path: gitleaks-report.json
Only fail on main branch:
- name: Run Gitleaks
uses: gitleaks/gitleaks-action@v2.2.0
with:
fail: ${{ github.ref == 'refs/heads/main' }}
Gitleaks Secret Scan Best Practices
- Keep test fixtures and fake credentials in
.gitleaksignoreor a narrow allowlist. - Review every allowlist entry during code review; broad regex allowlists defeat the scanner.
- Use Gitleaks alongside GitHub secret scanning rather than treating it as a replacement.
Dependency Review
File: dependency-review-enhanced.yml
Purpose: Scan PR dependencies for vulnerabilities and license compliance.
Dependency Review Getting Started
Dependency Review runs automatically on every PR. No setup required!
Dependency Review Configuration Options
Set allowed licenses:
- name: Dependency Review
uses: actions/dependency-review-action@v4
with:
allow-licenses: "Apache-2.0,MIT,ISC,BSD-2-Clause,BSD-3-Clause"
deny-licenses: "GPL-3.0-only,AGPL-3.0-only"
Custom severity threshold:
- name: Dependency Review
uses: actions/dependency-review-action@v4
with:
fail-on-severity: "high"
Dependency Review Best Practices and Recommendations
- Keep license policy explicit if the organization has approved and denied license lists.
- Set the severity threshold to match the repository's risk tolerance; most projects use
highor stricter. - Keep Dependabot or another dependency-update workflow enabled, so findings have a repair path.
Dependabot Auto-Merge
File: auto-merge-dependabot.yml
Purpose: Enable GitHub auto-merge for Dependabot patch and minor pull requests after required checks pass.
This workflow is intended for repositories that already use Dependabot and have branch protection or rulesets that
require the checks you trust before merging. It defaults to patch and minor updates, and repositories can opt into
major updates with the DEPENDABOT_AUTO_MERGE_SEMVER Actions variable.
Dependabot Auto-Merge Getting Started
- Enable repository auto-merge in Settings → General → Pull Requests → Allow auto-merge.
- Add or confirm
.github/dependabot.ymlis configured for the ecosystems you want Dependabot to update. - Add the workflow to
.github/workflows/auto-merge-dependabot.yml. - Confirm branch protection or repository rulesets require the checks that must pass before auto-merge completes.
Dependabot Auto-Merge Configuration Options
Configure allowed update levels with a repository or organization Actions variable:
DEPENDABOT_AUTO_MERGE_SEMVER=patch,minor
Allow major updates only after you are comfortable with the repository's required checks and review policy:
DEPENDABOT_AUTO_MERGE_SEMVER=patch,minor,major
Change the merge method if your repository does not use squash merges:
gh pr merge --auto --merge "${PR_URL}"
Dependabot Auto-Merge Best Practices
- Keep SemVer-major updates out of the default auto-merge path unless human review is required by branch protection.
- Require the same CI and security checks that a maintainer would wait for before merging manually.
- Keep repository auto-merge enabled; the workflow fails early with the evaluated GitHub API value when it is disabled.
- Use merge queue support only as a status path. Auto-merge enablement happens on Dependabot pull request events.
- See Dependabot Auto-Merge for setup examples.
Trufflehog Secret Scan
File: trufflehog-scan.yml
Purpose: Alternative secret scanner (verified credentials, fewer false positives).
Trufflehog Secret Scan Getting Started
Trufflehog runs automatically on every push/PR. No setup required!
Trufflehog Secret Scan Configuration Options
Use verification (reduce noise):
- name: Run Trufflehog
uses: trufflesecurity/trufflehog@v3.63.0
with:
extra_args: --verify
Scan specific files:
- name: Run Trufflehog
uses: trufflesecurity/trufflehog@v3.63.0
with:
extra_args: --only-verified src/ app/
Trufflehog Secret Scan Best Practices
- Use Trufflehog as a second scanner when verified-secret checks are useful.
- Keep scan scope broad for scheduled runs and narrower for PR-only performance if needed.
- Treat verified findings as incidents, not routine lint failures.
OpenSSF Scorecard
File: ossf-scorecard.yml
Purpose: Audit your repository's supply chain security posture.
OpenSSF Scorecard Getting Started
Scorecard runs on a schedule and can be triggered manually. No setup required!
- (Optional) Review results:
- Go to Security → Code scanning
- View detailed scorecard recommendations
OpenSSF Scorecard Configuration Options
Change scan schedule:
on:
schedule:
- cron: "0 0 * * 0"
Publish results:
- name: Publish Scorecard Results
uses: ossf/scorecard-action@v2.3.0
with:
results-file: results.sarif
results-format: sarif
publish-results: true
Scorecard Checks
The workflow evaluates:
- Branch Protection — Require reviews/status checks?
- Code Review — Are changes reviewed before merge?
- CII Best Practices — Follow CII guidelines?
- Dependency Updates — Dependencies kept up-to-date?
- Code Signing — Commits/releases signed?
- CODEOWNERS — Define codeowners?
- Security Policy — Have SECURITY.md?
- Vulnerability Disclosure — Report vulnerabilities?
OpenSSF Scorecard Best Practices
- Upload SARIF results to code scanning, so findings are visible in the Security tab.
- Fix low-effort repository hygiene findings first: branch protection, pinned actions,
SECURITY.md, and Dependabot. - Review score changes after workflow or release-process changes.
Deploy Docusaurus to GitHub Pages
File: docusaurus-deploy.yml
Purpose: Build and deploy Docusaurus documentation to GitHub Pages.
Deploy Docusaurus Getting Started
-
Ensure your project has:
docusaurus.config.jsordocusaurus.config.tsdocs/folder with Markdown files
-
Enable GitHub Pages:
- Settings → Pages
- Source: GitHub Actions
-
Initialize Docusaurus (if needed):
npx create-docusaurus@latest my-website npm run build
Deploy Docusaurus Configuration Options
Deploy on specific paths:
on:
push:
branches: [main]
paths:
- "docs/**"
- "docusaurus.config.js"
Deploy to custom domain:
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./build
cname: docs.example.com
Custom build parameters:
- name: Build site
run: npm run build
env:
BASE_URL: /my-site/
Directory Structure
docs/
├── intro.md
├── guides/
│ ├── getting-started.md
│ └── advanced.md
└── api/
└── reference.md
docusaurus.config.js
Deploy Docusaurus Best Practices
- Use the GitHub Actions Pages source, not branch deployment, when using
actions/deploy-pages. - Keep docs build scripts deterministic and avoid writing generated docs output back to the repository from this workflow.
- Add path filters for docs, Docusaurus config, package manifests, and any shared theme files that affect the build.
Submit IndexNow Notification
File: indexnow-submit.yml
Purpose: Notify search engines when you update your website (SEO boost).
IndexNow Notifications Getting Started
-
Get your IndexNow API key:
- Sign in at https://www.indexnow.org/
- Generate API key for your domain
-
Store in GitHub Secrets:
- Settings → Secrets and variables → Actions
- Create
INDEXNOW_KEY
-
(Optional) Create sitemap:
<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>https://example.com/page1</loc> <lastmod>2025-01-15</lastmod> </url> </urlset>
IndexNow Notifications Configuration Options
Submit changed URLs (delta):
env:
INDEXNOW_MODE: delta
INDEXNOW_URLS: |
https://example.com/page1
https://example.com/page2
Submit full sitemap:
env:
INDEXNOW_MODE: sitemap
INDEXNOW_SITEMAP: https://example.com/sitemap.xml
IndexNow Notifications Best Practices
- Store the key in
INDEXNOW_KEYand do not hardcode it in workflow YAML. - Prefer delta submissions for routine content updates and sitemap submissions for large rebuilds.
- Keep submitted URLs canonical and public; IndexNow should not receive preview or localhost URLs.
Git-Cliff Release Notes Validation
File: git-cliff-release-notes-validation.yml
Purpose: Validate that a published GitHub release body starts with git-cliff notes for the same release tag.
This workflow is intended for repositories whose release notes use headings like ## [1.2.3] - 2026-05-29.
It flags release bodies that are empty, contain placeholder text, start with ## [Unreleased], or start with a
different version heading than the published tag.
Git-Cliff Release Notes Validation Getting Started
- Add the workflow to
.github/workflows/validate-release-notes.yml. - Confirm the repository uses git-cliff-style release notes with version headings.
- Publish or edit a release to run the validator.
If your release is created by a workflow using the default GITHUB_TOKEN, GitHub does not normally trigger another
workflow from that release event. In that setup, keep this validator's workflow_dispatch trigger and call it after
the release step. The release workflow needs actions: write permission for the dispatch call:
permissions:
actions: write
contents: write
jobs:
publish:
steps:
- name: Validate published release notes
env:
GH_TOKEN: ${{ github.token }}
TAG: ${{ steps.version.outputs.tag }}
run: gh workflow run validate-release-notes.yml -f tag="$TAG"
Git-Cliff Release Notes Validation Configuration Options
on:
release:
types:
- published
- edited
workflow_dispatch:
inputs:
tag:
required: true
type: string
Use the release trigger for releases created manually, by a personal access token, or by a GitHub App token. Use
workflow_dispatch as the fallback when another workflow creates the release with GITHUB_TOKEN.
Git-Cliff Release Notes Validation Best Practices
- Use it only on repositories where release notes are expected to start with
## [version]. - Keep it non-blocking by running it after the release is already published.
- Pair it with a
changelog:release-notesscript that usesgit-cliff --current --strip allfor tag releases. - Leave custom GitHub-generated notes such as
## What's Changedon repos that do not use git-cliff.
Automatic Pull Request Rebase
File: automatic-rebase.yml
Purpose: Allow trusted collaborators to request a pull request rebase from an issue comment.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-automatic-rebase.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/automatic-rebase-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Ps Secret Scanner Secret Scan
File: pssecret-scanner.yml
Purpose: Scan a repository with the PowerShell PSSecretScanner module.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-pssecret-scanner.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/pssecret-scanner-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Ai Issue And Pull Request Summary
File: ai-issue-pr-summary.yml
Purpose: Summarize newly opened or edited issues and pull requests with GitHub Models.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-ai-issue-pr-summary.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/ai-issue-pr-summary-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
First Interaction Greeting
File: first-interaction-greeting.yml
Purpose: Welcome first-time issue and pull request authors.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-first-interaction-greeting.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/first-interaction-greeting-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Clean Old GitHub Releases
File: release-cleanup.yml
Purpose: Delete older GitHub releases and optionally their matching tags.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-release-cleanup.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/release-cleanup-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Node Dependency Validation
File: dependency-validation.yml
Purpose: Install dependencies, run a validation command, and upload diagnostics on failure.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-dependency-validation.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/dependency-validation-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Virus Total Release Asset Scan
File: virustotal-release-scan.yml
Purpose: Download release assets and scan them with VirusTotal.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-virustotal-release-scan.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/virustotal-release-scan-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Upload Release Assets To Internet Archive
File: internet-archive-upload.yml
Purpose: Download matching GitHub release assets and upload them to archive.org.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-internet-archive-upload.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/internet-archive-upload-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Codacy Coverage Upload
File: codacy-coverage.yml
Purpose: Run Node.js coverage and upload LCOV reports to Codacy.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-codacy-coverage.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/codacy-coverage-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Mega Linter
File: mega-linter.yml
Purpose: Run Mega Linter and upload lint reports.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-mega-linter.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/mega-linter-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Playwright End-To-End Tests
File: playwright-e2e.yml
Purpose: Install Node dependencies and run Playwright end-to-end tests.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-playwright-e2e.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/playwright-e2e-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
GitHub Release Stats
File: release-stats.yml
Purpose: Summarize latest and aggregate GitHub release asset statistics.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-release-stats.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/release-stats-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Sonar Cloud Analysis
File: sonarcloud-analysis.yml
Purpose: Build, test, and run SonarCloud analysis for a Node.js project.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-sonarcloud-analysis.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/sonarcloud-analysis-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Update Changelogs
File: changelog-update.yml
Purpose: Generate changelogs with git-cliff and open a pull request.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-changelog-update.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/changelog-update-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Deploy Jekyll To GitHub Pages
File: jekyll-pages-deploy.yml
Purpose: Build a Jekyll site and deploy it to GitHub Pages.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-jekyll-pages-deploy.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/jekyll-pages-deploy-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Actionlint
File: actionlint.yml
Purpose: Lint GitHub Actions workflows with actionlint.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-actionlint.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/actionlint-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Dev Skim Security Analysis
File: devskim-analysis.yml
Purpose: Run Microsoft DevSkim and upload SARIF results.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-devskim-analysis.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/devskim-analysis-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Ossar Security Analysis
File: ossar-analysis.yml
Purpose: Run OSSAR and upload SARIF results.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-ossar-analysis.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/ossar-analysis-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Prettier Check
File: prettier-check.yml
Purpose: Run Prettier in check mode for common web project files.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-prettier-check.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/prettier-check-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Lychee Link Check
File: lychee-link-check.yml
Purpose: Check repository links with Lychee and the shared lychee-config-nick2bad4u package.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-lychee-link-check.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/lychee-link-check-caller.yml.
The consumer repository should install lychee-config-nick2bad4u. The workflow runs Lychee through the pinned lycheeverse/lychee-action, while optional lint:lychee and lint:lychee:smoke package scripts provide local parity when the Lychee CLI is available on PATH. The workflow restores and saves .lycheecache with weekly restore keys so the GitHub Actions cache aligns with the shared config's seven-day max_cache_age.
JSCPD Copy/Paste Detection
File: jscpd-copy-paste-detection.yml
Purpose: Detect copied and pasted code with JSCPD and the shared jscpd-config-nick2bad4u package.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-jscpd-copy-paste-detection.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/jscpd-copy-paste-detection-caller.yml.
The consumer repository should install jscpd-config-nick2bad4u and expose a lint:jscpd package script that runs jscpd --config node_modules/jscpd-config-nick2bad4u/jscpd.json.
Repository Metrics
File: repository-metrics.yml
Purpose: Generate repository metrics SVG output with lowlighter/metrics.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-repository-metrics.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/repository-metrics-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Microsoft Security DevOps
File: microsoft-security-devops.yml
Purpose: Run Microsoft Security DevOps scanning and upload SARIF results.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-microsoft-security-devops.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/microsoft-security-devops-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Generate XML Sitemap
File: sitemap-generator.yml
Purpose: Generate an XML sitemap and open a pull request with updates.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-sitemap-generator.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/sitemap-generator-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Spellcheck
File: spellcheck.yml
Purpose: Run spellcheck-github-actions and upload the spellcheck output.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-spellcheck.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/spellcheck-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Deploy Static Content To GitHub Pages
File: static-pages-deploy.yml
Purpose: Upload static repository content and deploy it to GitHub Pages.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-static-pages-deploy.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/static-pages-deploy-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Stylelint Check
File: stylelint-check.yml
Purpose: Install dependencies and run Stylelint.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-stylelint-check.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/stylelint-check-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Super Linter
File: super-linter.yml
Purpose: Run GitHub Super Linter against the repository.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-super-linter.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/super-linter-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
Typos Spell Check
File: typos-spellcheck.yml
Purpose: Run crate-ci typos spell checker.
Use the workflow template for a copied starter workflow, or call .github/workflows/reusable-typos-spellcheck.yml from a consumer workflow. The reusable caller example is docs/examples/reusable-workflows/typos-spellcheck-caller.yml.
Review the template inputs, required secrets, and permissions before enabling it in a consumer repository.
General Troubleshooting
Workflow Doesn't Trigger
- ✅ Check
onsection matches your trigger (push, PR, schedule, etc.) - ✅ Verify branch/path conditions are met
- ✅ Check Actions tab for manual trigger options
- ✅ Ensure
.github/workflows/folder exists
Secret Not Available
- ✅ Verify secret exists in Settings → Secrets and variables → Actions
- ✅ Secret name must match exactly (case-sensitive)
- ✅ For org secrets, verify repo has access
- ✅ Check secret hasn't expired
Action Version Issues
- ✅ Use
@v3,@v2.1.0, or commit SHAs — avoid@latestor@main - ✅ Pin to major version for stability with minor updates
- ✅ Pin to patch for complete reproducibility
Permissions Denied
- ✅ Check
permissionsblock in workflow - ✅ Ensure
GITHUB_TOKENhas needed scopes - ✅ For private repos, verify token access
- ✅ Review GitHub Actions audit log
Performance Issues
- ✅ Reduce matrix dimensions
- ✅ Cache dependencies (
.npm,.gradle, etc.) - ✅ Use
concurrencyto cancel older runs - ✅ Split into smaller workflows
Resources
- Using Workflow Templates
- Maintaining Workflow Templates
- GitHub Actions Documentation
- Security Hardening for Actions
- CodeQL
- Gitleaks
- Trufflehog
- OpenSSF Scorecard
- Docusaurus
- IndexNow
Questions? Open an issue or start a discussion on GitHub.