Commit Graph
35 Commits
Author SHA1 Message Date
mhoennigandClaude Fable 5 eb49387c97 Redirect legacy page names to the new routes (v0.9.4)
The retired legacy instance now blanket-redirects its old host to the new
one, so pre-rewrite deep links like /index.html or /branches.html arrive
here — they answer 301 to the new routes instead of 404; about/license had
no successor pages and land on the start page.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 16:55:11 +02:00
mhoennigandClaude Fable 5 b351ab33c5 Show a failed-badge behind report links on the artifact index
Each listed report link now carries the failures counter parsed from the
report's Gradle-style index.html (id="failures" info box); reports with
failures get a red "N failed" badge, so a red build reveals which report to
open without clicking through all of them. Pages without such a counter
(Jacoco, profile, documentation) stay unmarked. A full-text FAILED scan was
deliberately not used: even green hsadmin-ng builds contain the word in
embedded test output.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 16:44:12 +02:00
mhoennigandClaude Fable 5 ed9562d1a7 Let cancel terminate auxiliary build phases instead of blocking the slot
Cancelling a build only killed the running build process; the synchronous
preparation phases — most notably a multi-minute Docker image build, but also
the Gradle-volume preparation — ran to completion and kept the concurrency
slot occupied, so the next queued build stayed PENDING for a long time.
Build runners now report every auxiliary process through an onAuxProcess sink
(GitCommandRunner gained an onProcess hook), and the executor registers them
like the build process, so cancellation terminates whatever is currently
running. Measured on vm4006: cancel to next-build-running is ~3s in the
normal case; the unit test covers the aux-phase case.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 16:14:38 +02:00
mhoennigandClaude Fable 5 56aa306481 Separate queue wait from build duration
BuildResult gains runningSince, set when a build leaves the queue; the
recorded duration now measures pure build time from that point, so build
runtimes can be tracked without queue wait. A build cancelled while still
queued records neither. The UI shows the live wait time in italics while
pending and switches to the real build time once the build runs; the Gitea
"after mm:ss" descriptions now also report pure build time.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 15:55:36 +02:00
mhoennigandClaude Fable 5 a03f85bc17 Show a log-only artifact icon while a build is running or pending
An in-progress build's artifact page only offers the build command and log —
the table now shows an hourglass instead of the document icon (server-rendered
rows and the JS-rendered rows alike) until the build finishes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 15:48:30 +02:00
mhoennigandClaude Fable 5 2cb6b1598a Render live durations immediately instead of leaving them to the ticker
The 10s table poll rebuilt the rows with an empty duration cell for
running/pending builds (durationSeconds is null until a build finishes),
which the once-per-second ticker then filled back in — a visible flicker.
Rows and current-build cards now compute the elapsed time at render time.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 15:45:33 +02:00
mhoennigandClaude Fable 5 8b71d0db8e Fix Docker builds under rootless daemons and expose git metadata to build containers
Two fixes from the vm4006 rollout (docs/plan/16-git-in-docker-builds.md):

Rootless daemons map the host user to container root, so running the build
container as --user <host-uid> put it into the subuid range and it could not
even create .gradle in a fresh worktree (legacy only worked because its
ownership-repair chown had accidentally moved build/ and .gradle/ into subuid
ownership in its reused primary checkout). The container now always runs as
--user 0: the unprivileged host user under rootless, real root under rootful
where the ownership repair still applies; under rootless it degenerates to 0:0.

Git now works inside build containers: the primary .git is mounted read-only
with .git/gittally/ masked by an empty tmpfs (git.token and the control token
stay unreachable, the workspace bind resurfaces only the build's own worktree)
and the worktree admin dir mounted read-write for index-refreshing commands.
Verified on vm4006: git log/status succeed, the machine config is invisible,
ref writes fail on the read-only mount.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 15:34:39 +02:00
mhoennigandClaude Fable 5 800fcae2f7 Bundle certbot's DH parameters as a resource instead of downloading them
certbot removed ssl-dhparams.pem from its repository, so the managed-nginx
startup failed with HTTP 404 on fresh installations (the legacy script only
kept working through its year-old state-dir cache). The RFC 7919 ffdhe2048
parameters are now a classpath resource; the download seam and
NginxConfigFiles.DH_PARAMS_URL are gone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 15:34:20 +02:00
Michael Hoennig fb6d4501b9 Added worktree-layered build config: resolves .gittally.yml from the worktree for per-branch build settings, with precedence worktree > .git > project; pinned secrets, server-side keys, and sandbox policy to .git. 2026-07-09 09:20:34 +02:00
Michael Hoennig 347efc16c5 standardized JAR naming to gittally.jar (version-free); updated scripts, docs, and build config to align; added --version support via BuildProperties 2026-07-08 22:45:23 +02:00
Michael HoennigandClaude Fable 5 d0b38c557a added age-based build retention: artifacts.retentionMaxAge (e.g. 30d, empty = no limit) drops builds older than the given age; combines with retentionPerBranch as independent caps — a build is kept only while it satisfies both limits; a branch's newest build is never age-pruned and keepLatestGreen now shields the latest green build from both limits, keeping the permanent /branches/... links valid
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 22:35:31 +02:00
Michael HoennigandClaude Fable 5 b104eeee05 added opt-in managed nginx/TLS container (ADR 0005, plan step 13): server.nginx.* config serves GitTally over HTTPS on hosts without a reverse proxy — two-phase startup (ACME webroot via certbot container, then full HTTPS config), daily certificate renewal with nginx reload, labelled container removed on shutdown; all failures are non-fatal, the plain HTTP server keeps running
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 21:51:33 +02:00
Michael Hoennig 3fe44135cc Merge branch 'feature/permanent-artifact-links' 2026-07-08 15:51:02 +02:00
Michael HoennigandClaude Fable 5 fd326f03fc made the pull-request gate configurable: added watcher.pullRequestGate (default true); set false for plain-git origins without pull-request refs, so requirePullRequest gates are ignored and gated branches build on new commits; added the PR-doc
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 15:50:45 +02:00
Michael HoennigandClaude Fable 5 bb06c8b731 added permanent artifact links for latest green builds: /branches/<branch-key>/... serves the latest green build's artifacts (green-only, resolved per request), keepLatestGreen retention protection, permanent artifact-index page, and latestGreenUrl links in the branches view
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 15:35:16 +02:00
Michael Hoennig 0b17537b7c ads PR-triggered builds 2026-07-08 06:32:40 +02:00
Michael Hoennig d3a69a151a updated artifact links: added target="_blank" and rel="noopener noreferrer" to ensure external logs and reports open in a new tab; updated docs and tests accordingly 2026-07-07 15:39:59 +02:00
Michael Hoennig a659cd6764 reintroduced legacy Branches view: added /branches endpoint for listing origin branches and their latest builds (or unknown for never-built branches), updated UI with reload button and navigation, and enhanced API and tests 2026-07-07 15:16:01 +02:00
Michael Hoennig 60ff595a9d implemented 12-deployment.md: added systemd service generation (init --systemd) and migration guide from legacy script; introduced JSON-file persistence, server-rendered UI with polling, and reverse-proxy-based deployment; updated documentation 2026-07-07 14:18:41 +02:00
Michael Hoennig e869b46cbf implemented 11-docker-build-runtime.md: added optional Docker-based build execution with configuration, per-branch runtime selection, image rebuild on input changes, Gradle cache volume, and ownership repair; updated docs and configuration 2026-07-07 13:49:08 +02:00
Michael Hoennig 73221a8b8b implemented 10-cli-commands.md: added CLI commands for branch name resolution, one-shot builds, failed build retries, and build status reports; includes tests for functionality and edge cases 2026-07-07 13:19:29 +02:00
Michael Hoennig a6a2c9de0b implemented 09-system-metrics.md: added system metrics: introduced system monitoring with a metrics collector, REST API endpoint, Thymeleaf UI rendering, and lifecycle management 2026-07-07 12:55:11 +02:00
Michael Hoennig 25a0742a58 implemented 08-web-ui.md: added Thymeleaf-based web UI: templates for builds, artifacts, current builds, and fragments; static assets for favicon, CSS, and JavaScript 2026-07-07 12:23:12 +02:00
Michael Hoennig 490914de0b implemented 07-server-mode.md: added server profile with REST API for builds, artifacts, live logs, and control tokens; lifecycle management for watcher; controller and service tests 2026-07-07 11:27:27 +02:00
Michael HoennigandClaude Fable 5 a1db450bdb implemented 06-watcher.md: non-blocking poll cycle enqueueing changed/new/auto-build branches via the async executor, startup recovery, retention/worktree pruning, JSON auto-build slot state, watcher.pollInterval config, and watcher health state
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 10:28:28 +02:00
Michael HoennigandClaude Fable 5 3c9eeda5da implemented 05-artifact-store.md: filesystem artifact store with legacy-compatible naming, atomic persist from concurrent builds, retention pruning, and artifacts.rootDir config
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 10:08:40 +02:00
Michael HoennigandClaude Fable 5 b379bc0a6b implemented 04-build-executor.md incl. concurrency amendment: async builds in per-branch worktrees, builds.maxConcurrent, cancellation, live logs; fix .gitignore build/ rule that silently excluded the de.hoennig.gittally.build package (also recovers the step-01 domain files)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 08:43:28 +02:00
Michael Hoennig ae3ae7aa04 implemented 03-gitea-client.md: added Gitea API client for commit statuses, status mapping, and extensive tests 2026-07-07 07:34:18 +02:00
Michael Hoennig a427665ce8 implemented 02-git-gateway.md: added Git access layer with credentials bridge, duration parser, and extensive tests 2026-07-07 07:10:38 +02:00
Michael Hoennig 8b6c6de1ea add bootstrapping.md 2026-06-10 17:27:06 +02:00
Michael Hoennig 02b08306e1 added configuration.md 2026-06-09 17:04:07 +02:00
Michael Hoennig 117caf12a9 upgrade to Spring Boot 4.2.1 2026-06-09 16:05:12 +02:00
Michael Hoennig a030f7abb6 add ADRs for gradle and spring boot version and version smoke-tests 2026-06-09 15:20:21 +02:00
Michael Hoennig 923048781b add test-library and ktlint 2026-06-09 13:24:05 +02:00
Michael Hoennig b47489ab2b initial Spring app 2026-06-09 11:55:23 +02:00