Organization-wide GitHub configurations, reusable workflows, and templates.
Full-featured CI pipeline for Node.js projects with lint, typecheck, build, test, and E2E support.
Basic usage:
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
ci:
uses: plac9/.github/.github/workflows/reusable-node-ci.yml@mainWith options:
jobs:
ci:
uses: plac9/.github/.github/workflows/reusable-node-ci.yml@main
with:
node-version: '20'
runs-on: '["self-hosted", "homelab"]'
enable-e2e: true
pre-build-command: 'npm run content:generate'
build-artifact-paths: |
.next
distAvailable inputs:
| Input | Default | Description |
|---|---|---|
node-version |
'20' |
Node.js version |
runs-on |
'["ubuntu-latest"]' |
Runner (JSON array) |
enable-lint |
true |
Run ESLint |
enable-typecheck |
true |
Run TypeScript check |
enable-test |
false |
Run unit tests |
enable-e2e |
false |
Run Playwright E2E |
lint-command |
'npm run lint' |
Lint command |
typecheck-command |
'npm run typecheck' |
Type check command |
build-command |
'npm run build' |
Build command |
pre-build-command |
'' |
Pre-build step |
build-artifact-paths |
'' |
Artifact paths |
timeout-minutes |
10 |
Job timeout |
Build and push Docker images to GHCR with caching.
Basic usage:
name: Docker
on:
push:
branches: [main]
tags: ['v*']
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
docker:
uses: plac9/.github/.github/workflows/reusable-docker-publish.yml@main
permissions:
contents: read
packages: writeWith options:
jobs:
docker:
uses: plac9/.github/.github/workflows/reusable-docker-publish.yml@main
permissions:
contents: read
packages: write
with:
runs-on: '["self-hosted", "homelab"]'
platforms: 'linux/amd64,linux/arm64'
build-args: |
NODE_ENV=production
VERSION=${{ github.sha }}Available inputs:
| Input | Default | Description |
|---|---|---|
runs-on |
'["ubuntu-latest"]' |
Runner (JSON array) |
registry |
'ghcr.io' |
Container registry |
image-name |
'' |
Image name (defaults to repo) |
platforms |
'linux/amd64' |
Target platforms |
context |
'.' |
Build context |
dockerfile |
'Dockerfile' |
Dockerfile path |
build-args |
'' |
Build arguments |
push |
true |
Push to registry |
timeout-minutes |
30 |
Job timeout |
Outputs:
image-digest- Image digestimage-tags- Image tags
For repos that use the homelab runner, use:
runs-on: '["self-hosted", "homelab"]'- All workflows use
GITHUB_TOKENfor auth (no PAT needed) - Concurrency control prevents duplicate runs
- All workflows generate job summaries