Developer Documentation
Version 1.6.9-option-2 | Updated: August 07, 2026
Developer Documentation
For Developers
Documentation
This repository automatically maintains Antora-formatted documentation alongside the Markdown README.
Automatic Conversion
When you commit changes to README.md, a pre-commit hook automatically converts it to AsciiDoc format for Antora documentation. The converted file is placed in docs/modules/ROOT/pages/index.adoc and staged for the commit.
Setting Up Git Hooks
After cloning this repository, install the Git hooks:
./misc/install-hooks.sh
This installs a pre-commit hook that:
-
Detects when
README.mdis staged for commit -
Converts it to AsciiDoc using
pandoc -
Stages the converted
index.adocfile automatically
Requirements:
-
pandocmust be installed:
# macOS brew install pandoc # Ubuntu/Debian sudo apt-get install pandoc # CentOS/RHEL sudo yum install pandoc
Continuous Integration
Six workflows live in .github/workflows/:
-
Sandbox tests (
sandbox-tests.yml) — runs the installer test suite in a container on every push to a1.*branch and on every pull request. -
Generate PDF Documentation (
docs-pdf.yml) — rebuilds the PDF handouts. -
Trigger Docs Portal Rebuild (
trigger-docs-portal.yml) — notifies the portal repository whenREADME.md,docs/*orVERSIONchanges. Note the portal builds only from1.branches and tags, so a docs fix onmainchanges nothing. -
Build SNMP Catcher / Build Alertmanager Config UI — publish those two images to Harbor, tagged by branch.
latestis pushed only frommain. -
Fixture Drift (
fixture-drift.yml) — weekly comparison of the sandbox fixtures against the reference host, so the mocks cannot go on replaying a world that has moved. Two jobs:recordruns on a self-hosted runner on the reference host, because its ufw admits inbound ssh from an allowlist that hosted runners are not on, and a runner long-polls outbound instead;analyseruns hosted, because the secret scan and the sandbox suite need Docker and that runner’s account deliberately has none. It opens one rolling issue rather than committing, because a fixture change alters what every sandbox case believes about reality. Setup inmisc/testing/sandbox/README.md.
Two things about triggers are worth knowing before adding a workflow here.
schedule runs on the default branch only. GitHub takes the workflow from
the latest commit on main regardless of where it was developed, so a weekly
job that lives only on a version branch never fires. That is why
fixture-drift.yml is on main as well as on the development line.
workflow_dispatch is not limited to the default branch — it dispatches
against any ref, and the version that runs is the one on that ref. Measured
05.08.2026: gh workflow run fixture-drift.yml --ref 1.6.9 ran seven hours
before the file existed on main at all.
What does trip people up is registration, which is a different thing: GitHub
does not know a workflow exists until some event has caused it to read the
file. A workflow whose only triggers are schedule and workflow_dispatch
gives it no such event on a version branch, so the API reports it as
non-existent and there is nothing to dispatch. Push the file with any trigger
that fires once — a temporary push: is enough — and dispatch works from then
on, on any branch.
Development & Releases
The project uses version branches for development and releases.
Workflow:
1. Work on version branch (e.g., 1.6.5) 2. When ready: ./misc/release.sh [patch|minor|major] → Clears the prerelease marker in docs/antora.yml → Merges to main, tags, creates the GitHub Release with a changelog → DELETES the version branch, locally and on the remote → Creates the next version branch (e.g., 1.6.6) with the marker back 3. Continue development on new branch
Two steps in there surprise people, so they are spelled out rather than left in the script:
-
The version branch is deleted, both locally and on the remote. It has been merged and tagged by then, so nothing is lost — but anything still unpushed on it is, and a colleague tracking that branch will find it gone.
-
The
prerelease:marker is stripped before the merge. Every new development branch carriesprerelease: -devindocs/antora.yml, and nothing used to remove it, so a released line kept publishing itself to the docs portal asX.Y.Z-dev, sorted below an older clean version and never becoming latest. If a release ever shows up on the portal with a-devsuffix, this is the step that did not run.
Version branch naming:
-
Branches:
1.6.5(withoutvprefix) -
Tags:
1.6.5(withoutvprefix) -
Releases:
1.6.5(withoutvprefix)
Using specific versions:
# List available versions
curl -fsSL https://hub.friendly-tech.com/bootstrap/install.sh | sudo bash -s -- --version-list
# Install specific version
curl -fsSL https://hub.friendly-tech.com/bootstrap/install.sh | sudo bash -s -- stack --branch 1.6.4