All news

Factory

The delivery kit: one pipeline and deploy instead of two hand-kept copies

· Toolkit · 2 min read

Terminal: Leadgener's first restore test on delivery kit 1.0.0 checks the backup's checksums, restores it into a throwaway container, finds 25 tables with equal row counts and 3,391 files with matching SHA-256, and ends OK.

Reputo and Leadgener, our two products in development, were built, tested and deployed with copies of one pipeline and one set of deploy scripts, kept by hand. By 15 October the copies had drifted. The two deploy scripts (116 and 111 lines) differed in 47 lines, and the two scripts that start the stack on the server (64 and 82 lines) in 66. Part of that is product names and comments; part is behaviour: the two products took their backups in two different ways. A fix in one copy did not reach the other, and Leadgener's first pipeline had already lost a build flag in the copying.

Six components and an ops image

On 15 October 2026 we released delivery kit 1.0.0. It does for build and deploy what the NuGet packages did for the backend and the Keycloak kit for identity: six GitLab CI/CD components (backend tests, a frontend gate, sharded frontend tests, image builds, the deploy and a restore test) and an ops image that runs the deploy and the restore test. A product includes every component at @delivery-v1.0.0. There is no latest, and the changelog flags each change by what it touches: [contract], [behaviour] or [pipeline].

Version 1.0 is a faithful port of the two pipelines; the design lists each change in behaviour with its reason. The backup follows Leadgener's design: a dump with checksums and the row count of every table in the application database. One thing changes: the kit takes those counts inside the dump's snapshot. A product keeps its inputs, its compose files and hooks for what only it needs, such as provisioning its Keycloak realm.

Proven on both products the same day

Before the release, Reputo adopted the kit at a pinned toolkit commit. A report compared its merged pipeline before and after, job by job, and the merge request explains every difference. Test totals were unchanged: 2,298 backend and 2,591 frontend tests. On main, the kit's deploy backed up both databases, provisioned Keycloak through Reputo's own hook and passed the health gate, and the restore test restored that backup into a throwaway container: 33 tables, every row count equal.

Reputo then pinned 1.0.0, and Leadgener moved the same evening. Its first restore test on the kit checked 25 tables and, through its own hook, that the 3,391 files its database points to are present with matching checksums. Both products deleted their deploy scripts, and Reputo's .gitlab-ci.yml went from 290 lines to 172.

A change to the shared jobs, the deploy, the backup or the restore test is now made once, in the kit; what only one product needs stays in that product's inputs and hooks.