ci-cd
Pipelines, builds and getting a change from a branch to a running system.
-
Documentation as a Repository: Publishing a Wiki.js Site from Reviewed Markdown
Documentation kept in a hosted wiki drifts silently, because nothing forces a reviewer to look at it when the code it describes changes. Treating docs as a repository, reviewed through the same pull requests as code, turns that silence into a diff someone has to look at. This covers what changes when documentation moves into git — as it does in the open-source OpenTaberna project — with a runnable Wiki.js setup and a CI check that fails a pull request when source changes without its docs.
-
Testing Infrastructure Code by Executing Its Real Expressions
A test that reimplements an Ansible expression's logic in Python proves two independent implementations agree today, not that the shipped expression is correct, and the two can drift apart while both keep passing. This article renders the actual expression through Ansible's own Templar and filters, using a recursive dict merge as a concrete case where a hand-written paraphrase gets it wrong.
-
Keeping Documentation Honest with an OpenAPI Snapshot Diff
Hand-written API documentation and the code behind it drift apart silently, because nothing runs the docs to notice. This article generates the real OpenAPI schema from a FastAPI app, commits a normalised snapshot, and fails CI the moment the two disagree, with the full app, test and workflow.
-
Verifying an Agent's Work Against Reality, Not Its Own Report
An agent process can exit cleanly and report success while having changed nothing, or while its tests silently didn't run. This article builds a separate verification step that checks git state and re-runs the real test command, and wires it into CI as an independent job the agent cannot influence.
-
A Deterministic Daemon That Turns a Labelled Issue Into a Pull Request
Letting a model call git directly makes every commit and push as unpredictable as the model's own reasoning, which is hard to audit and harder to trust. This walks through splitting an issue-to-PR pipeline so the model only ever produces a patch, while a small deterministic daemon performs every side effect, with a complete runnable example.
-
Pinning Image Tags to Git SHAs Because GitOps Diffs Manifests, Not Registries
A Deployment manifest that references an image by a floating tag such as latest never changes as text, so a GitOps controller comparing git to the cluster sees no diff and triggers no rollout even after CI pushes a new image. This shows why, and how baking the git SHA into the tag at build time, with a reproducible local-registry demo proving both the failure and the fix.
-
Running BuildKit as a Remote Builder Without a Docker Daemon
A CI runner scheduled on a containerd node has no Docker daemon to hand buildx, so the default docker-container driver cannot even start. This article sets up BuildKit as a standalone, always-on builder that buildx talks to over TLS instead, with a complete docker compose file, certificate generation and the exact buildx commands a pipeline needs.
-
Replacing pip, venv, flake8, black and isort with uv and Ruff
A requirements.txt file records no lockfile, so "pip install -r requirements.txt" can resolve a different dependency tree on two machines run a day apart, and four separate lint tools mean four configuration blocks that drift out of sync. This walks through replacing pip, venv, flake8, black and isort with uv and Ruff, with a project a reader can build and lint in a few minutes.