Commit Graph
123 Commits
Author SHA1 Message Date
mhoennigandClaude Fable 5 74bc4c2d73 Mention the utilization highlighting in the 0.9.6 release notes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 19:09:21 +02:00
mhoennigandClaude Fable 5 f2d4dbfda0 Highlight critical utilization on the system page (v0.9.6)
The Current cell of CPU/RAM/disk used turns orange from 80% of the
total and red from 90%. UiFormats.utilizationClass and the mirrored
utilizationClass in gittally.js apply the same thresholds; unavailable
metrics (n/a) are never highlighted.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 19:08:23 +02:00
mhoennigandClaude Fable 5 428d1a06cb Add a release-notes page linked from the footer version (v0.9.6)
Reconstructed from the commit history since the first production
deployment; the initial entry is the 0.9.0 port of the legacy bash
script to Kotlin/Spring Boot.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 18:02:30 +02:00
mhoennigandClaude Fable 5 d2b39c56d3 Collapse the live indicator to a state dot on small screens
On mobile widths the "live" badge squeezed the view-toggle menu into
unreadable widths; the dot keeps the state color (green/red/grey) and
the row may wrap as a last resort.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 17:57:35 +02:00
mhoennigandClaude Fable 5 bfe9010485 Bump version to 0.9.5 for the shutdown-interruption deployment
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 17:31:36 +02:00
mhoennigandClaude Fable 5 8b87fbeb7d Merge branch 'claude/amazing-khayyam-38cad4': interrupt builds on server shutdown
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 17:31:11 +02:00
mhoennigandClaude Fable 5 40f54a1298 Record builds interrupted by a server shutdown as INTERRUPTED, not FAILED
A systemd stop killed the running build process and BuildExecutor
classified the death as FAILED, posting a red Gitea status; FAILED is
not restartable, so the startup recovery never re-enqueued the build.

A ContextClosedEvent listener now sets a shuttingDown flag, terminates
the process trees of executing builds, and drains until their
INTERRUPTED results are persisted. Queued builds stay PENDING without
starting a process; recovery re-enqueues both after the restart.
INTERRUPTED publishes as Gitea state "pending" instead of "failure",
since the build is going to be re-run.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 17:26:10 +02:00
mhoennigandClaude Fable 5 355d8ae90f Record the vm2176 retirement and redirect setup in plan step 15
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 16:56:22 +02:00
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 fbdc6f54b7 Bump version to 0.9.3 for the report-badge deployment
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 16:44:12 +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 4ca077da80 Document the initial build burst after the first server start
Investigating six near-simultaneous builds on vm4006 showed no duplicate
enqueue: they were six distinct recently-active origin branches, each built
once by the documented new-origin-branch rule (in a fresh clone every origin
branch counts as new). The watcher already guards against duplicates per
branch and per commit, with test coverage; only the first-start behavior was
undocumented.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 16:33:04 +02:00
mhoennigandClaude Fable 5 421d51063b Bump version to 0.9.2 for the UI/cancel fixes deployment
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 16:14:48 +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 76321a6f5c Bump version to 0.9.1 and note the bump-per-deployment convention
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 16:03:52 +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 9e7982ce34 Add self-contained runtime bundle distribution (jlink) for hosts without Java
./gradlew runtimeBundle packs a jlink-trimmed JRE, gittally.jar, and a
launcher script into one tarball, unpacked to ~/opt/gittally on the target
host; init --systemd works from the bundle unchanged because java.home and
the running-jar path resolve into it. Chosen over a GraalVM native image
(Spring AOT evaluates bean conditions at build time, which cannot represent
the dual-context CLI/server wiring) and over a containerized runtime — see
ADR 0006 and docs/plan/15-runtime-bundle-distribution.md, which also records
the full vm2176-to-vm4006 migration walkthrough.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-10 15:35:35 +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
mhoennig 66183f9765 Add build-phase timing and overhead optimization plan to docs 2026-08-10 13:32:17 +02:00
mhoennig 32bf25978b Update .idea config: add templates folder configuration 2026-08-10 13:31:32 +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 095e6fa44f PR-doc: split config precendence and hosisting TODO 9 2026-07-09 07:08:10 +02:00
Michael Hoennig b21b8b8a28 Security Report 2026-07-09 06:32:49 +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 fdbbd0516a added setup-gittally-instance script: migrates legacy .gitTally configurations to YAML, sets up a GitTally instance on a Docker host, and prompts for Gitea secrets 2026-07-08 20:42:03 +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 83e70e73c3 added .claude/skills: introduced on-demand skill guides for architecture, PR documentation, and testing conventions; updated AGENTS.md to reference new skills 2026-07-08 15:20:37 +02:00
Michael Hoennig 39fb4e3492 added PR documentation guidelines and template: introduced docs/prs/README.md and TEAMPLATE.md 2026-07-08 07:03:17 +02:00
Michael Hoennig 0b17537b7c ads PR-triggered builds 2026-07-08 06:32:40 +02:00
Michael Hoennig 0e3f97db62 enhanced setup-gittally-testserver.sh: added a second origin branch (feature/demo) to improve Branches view during UI/API smoke tests; updated documentation accordingly 2026-07-07 15:40:07 +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 f1f5946ac4 added setup-gittally-testserver.sh: example script for running a test server with a fake build, including configuration for manual UI/API smoke tests, and updated documentation 2026-07-07 14:47:34 +02:00
Michael Hoennig 142bc87604 added ADR 0005 and step 13: reintroduce managed nginx+certbot as an opt-in feature for hosts without a reverse proxy (e.g. Hostsharing); partially supersedes ADR 0004; updated plans, documentation, and migration guides 2026-07-07 14:40:11 +02:00
Michael Hoennig f6a876b29b updated setup-gittally-selfhost.sh: clarified config generation behavior, added systemd setup instructions, and refined comments for improved usability 2026-07-07 14:18:55 +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 67c9f0ade9 added setup-gittally-selfhost.sh: example script for setting up a self-hosted GitTally instance 2026-07-07 12:23:30 +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