CI/CD workflows and automation for Plik. For system-wide overview, see the root ARCHITECTURE.md.
.github/
├── workflows/
│ ├── tests.yaml ← CI: lint, test, docs build on PR
│ ├── pages.yml ← Deploy docs to gh-pages
│ ├── release.yaml ← Build release archives, Docker images, Helm chart on release
│ ├── master.yaml ← Post-merge actions on master
│ ├── docker-build-pr.yaml ← Build Docker image on PR (triggered by comment)
│ ├── docker-build-reusable.yaml ← Reusable Docker build job (called by build/deploy)
│ └── docker-deploy-pr.yaml ← Deploy PR image to staging (triggered by comment)
└── ARCHITECTURE.md ← this file
Runs on every pull request. Contains 7 parallel jobs:
| Job | What it does |
|---|---|
test |
Go lint + unit tests (make lint, make test) + uncommitted changes check + govulncheck |
test-frontend |
Webapp unit tests (make test-frontend — vitest) |
test-frontend-e2e |
Webapp E2E tests (make test-frontend-e2e — Playwright + Chromium) |
test-backends |
Docker-based backend integration tests (make test-backends) |
release |
Release build dry-run (make release — Docker buildx) |
docs |
VitePress docs build (make docs — builds client, injects --help + .plikrc into docs, fails if out of date) |
helm-docs |
Helm chart README regeneration check (make helm-docs — fails if out of date) |
Runs on push to master when docs/**, any ARCHITECTURE.md, or the workflow itself changes. Deploys VitePress documentation to the gh-pages branch via peaceiris/actions-gh-pages.
Note
The keep_files: true flag preserves the Helm index.yaml and APT repository (apt/) on gh-pages (updated by the release workflow).
Triggered when a GitHub release is created (tag push). Runs the full release pipeline:
- Builds multi-arch Docker images
- Builds release archives and client binaries
- Packages the Helm chart and updates
index.yamlongh-pages(viareleaser/helm_release.sh) - Builds
.debpackages and updates the APT repository ongh-pages(viareleaser/apt_release.sh) - Uploads all artifacts (including
.tgz,.debfiles) to the GitHub release
See releaser/ARCHITECTURE.md for the build details.
Runs on every push to master (only in the root-gg org). Builds multi-arch Docker images and pushes rootgg/plik:dev to Docker Hub via make release-and-push-to-docker-hub. This ensures the dev tag always reflects the latest master state.
Triggered by a docker build comment on a PR. Builds a Docker image tagged rootgg/plik:pr-{number} and pushes it to Docker Hub. Reports back with a comment.
Triggered by a docker deploy comment on a PR. Conditionally builds the Docker image via the reusable workflow (if not already built), then deploys it to the staging instance at plik.root.gg. Reports back with a deployment confirmation comment.
graph LR
Release["GitHub Release created"] --> ReleaseWF["release.yaml workflow"]
ReleaseWF --> Build["Build archives + Docker"]
ReleaseWF --> HelmScript["releaser/helm_release.sh"]
HelmScript --> Package["Package plik-helm-VERSION.tgz"]
Package --> Assets["GitHub Release assets"]
HelmScript --> UpdateIndex["Update index.yaml"]
UpdateIndex --> GHPages["gh-pages branch"]
GHPages --> HelmRepo["helm repo add plik<br/>https://root-gg.github.io/plik"]
The Helm chart version is unified with the app version — Chart.yaml version and appVersion are dynamically set to the release tag by helm_release.sh at release time.
Users install the chart via:
helm repo add plik https://root-gg.github.io/plik
helm install plik plik/plikThe chart source lives in charts/plik/. See the chart's README for all configuration options.
graph LR
Release["GitHub Release created"] --> ReleaseWF["release.yaml workflow"]
ReleaseWF --> AptScript["releaser/apt_release.sh"]
AptScript --> Nfpm["nfpm builds .deb packages"]
Nfpm --> Assets["GitHub Release assets"]
AptScript --> AptRepo["Update apt/ on gh-pages"]
AptRepo --> Sign["GPG sign Release"]
Sign --> GHPages["gh-pages branch"]
GHPages --> AptInstall["apt install plik-server<br/>https://root-gg.github.io/plik/apt"]
Two packages are built per architecture (amd64, i386, arm64, armhf):
plik-server— server binary, config, systemd service, webapp, clientsplik-client— CLI binary
Users install via:
curl -fsSL https://root-gg.github.io/plik/apt/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/plik.gpg
echo "deb [signed-by=/etc/apt/keyrings/plik.gpg] https://root-gg.github.io/plik/apt stable main" | sudo tee /etc/apt/sources.list.d/plik.list
sudo apt update && sudo apt install plik-serverBefore creating a GitHub release:
- Update the version badge and install snippets in
README.mdto reference the new tag - Move
charts/plik/CHANGELOG.mdentries from[Unreleased]to the new version heading (e.g.[1.4-RC4] - 2026-02-21) - Ensure
GPG_PRIVATE_KEYsecret is configured for APT repository signing - Ensure all
ARCHITECTURE.mdfiles reflect any structural changes