summaryrefslogtreecommitdiff
path: root/deploy/buildbot/worker
AgeCommit message (Collapse)Author
2026-10-04Worker: back up uncommitted work before a build can discard itCharlie Root
master.cfg checks out with method='clean' and buildbot builds inside this same tree, so every build silently reverts uncommitted changes here. That cost a finished PieMenu edit, which had to be reconstructed by hand. Add a script that snapshots staged+unstaged diffs to /ROM/worker-cache/uncommitted-<stamp>.patch. Run it before gradlew, before pushing, and before any build not initiated here.
2026-10-04Worker: recover the build line on FreeBSD+Linuxulator podmanCharlie Root
The worker container could not start and, once started, could not reach the master. Two independent host-level causes, both measured rather than assumed: 1. pf was disabled, so podman refused to start the container at all ("The pf kernel module must be loaded to support ipMasq networks"). /etc/pf.conf already carries the matching NAT rule for podman's 10.88.0.0/16, and the ruleset has no block rules, so enabling it changes no filtering. 2. The CNI bridge path returns EACCES on every outbound connect, including to the container's own gateway -- verified from a fresh container with no volumes, against 10.88.0.1, 192.168.3.110, 8.8.8.8 and 1.1.1.1. The route table inside the container is correct, so this is ocijail refusing the connect. --network=host was measured to work for all four and costs nothing here: the worker only makes outbound connections. Also record, because both cost real time: - GRADLE_USER_HOME (6.3G) and .konan (1.7G) live in the container's writable layer with no named volume, so `podman rm` destroys them. - `podman commit` does not preserve them: buildah stages into /var/tmp on the root zfs pool, which has 1.5G free against a 6G layer (ENOSPC). Extracting the two directories with --tmpdir pointed at /ROM works. - Secrets exist in two locations and they DIFFER. /root/buildbot/secrets is the set the container mounts; /ROM/wiiu/secrets has a different worker_pass and an empty git_pass. - `master.cfg`'s TOKEN lines look corrupted when a tool redacts "Authorization:" in rendered output. They are intact. extract-caches.sh + recreate-worker-hostnet.sh make the recovery rerunnable; RECOVERY.txt documents the evidence and the traps. Named .txt because .gitignore excludes *.md as local-only. Verified after the change: master reports connected_to [{masterid: 1}], twistd logs "Connected to buildmaster; worker is ready", and the toolchain inside the container is intact (JDK 21.0.12, node 20.20.2, gradle 6.3G, konan prebuilt, Android build-tools 35/36).
2026-09-24Worker image: provision the Android SDK the project actually needs, drop the ↵Charlie Root
audio daemon, and pre-create Gradle output dirs Three fixes found by actually building the image and then running the pipeline against it, rather than by reading the Dockerfile: 1. Android SDK levels. apps/android, modules/orgflow-domain, modules/orgflow-ui and modules/zero-bridge-android all set compileSdk/targetSdk = 35, but the image only shipped platform 36 + build-tools 36. The first assemble died with "Failed to install the following SDK components: build-tools;35.0.0, platforms;android-35 / The SDK directory is not writable". Install 35 and 36 both, and chown /opt/android-sdk to the build user, since AGP writes into the SDK itself (it installs missing components and maintains .knownPackages). 2. No audio daemon. The pulseaudio *server* package pulls in systemd, and systemd's postinst blocks forever when the image is built under a runtime without systemd - observed under FreeBSD's podman + Linuxulator, where "systemd.postinst configure" hung the build indefinitely. Only the client libraries (libasound2, libpulse0) are needed so webrtc-java natives can link; the worker never plays media back. start-worker.sh no longer launches the daemon either. 3. prepare-build-dirs.sh (new). Gradle tasks create their output trees at execution time, and on Linuxulator a Gradle-internal directory creation can fail with "Failed to create parent directory X when creating directory X/Y" even though the same mkdir -p from a shell succeeds - and the created parents must be owned by the build user or the next run dies with "Unable to delete directory". Pre-creating the usual build/reports, build/outputs, build/tmp, build/intermediates, ... trees as the build user side-steps both. On a real Linux kernel this script is a harmless no-op. The apt cache-size bump (APT::Cache-Start) is retained from the earlier revision: the default 24MB mmap cache cannot parse the jammy package lists and fails with "Dynamic MMap ran out of room" on hosts where the apt cache is expanded.
2026-09-24Worker image becomes self-contained: replace FROM jenkins-kotlin:latest with ↵Charlie Root
eclipse-temurin:21-jdk plus an explicit toolchain WHY: the base image the worker used to inherit from (jenkins-kotlin:latest) was built interactively during the Jenkins era and its Dockerfile was never committed. It is now nowhere to be found - verified by searching this repo's full history on both main and backup/full-pre-reset (only *references* to the name appear, never a definition), the cgit server's repository list (no jenkins/docker repo; the name 404s), and the build host's filesystem. The worker therefore could not be rebuilt on any host, which is exactly what blocked rebuilding it here on FreeBSD. WHAT: the toolchain that image provided is now reproduced explicitly so the image builds from source anywhere. Parent is eclipse-temurin:21-jdk-jammy, and everything master.cfg's pipeline needs is installed on top: - JDK 21 (modules target Java 17 via jvmTarget=17, so 21 as the toolchain is correct and matches the master's own comment) - Gradle 8.14.3 arrives through the committed wrapper (services.gradle.org), so no Gradle is baked in - node 20 (NodeSource) for wasmJsNodeTest and the web bundle - Android SDK fully provisioned non-interactively: cmdline-tools 13114758 (verified HTTP 200 before pinning), then sdkmanager installs platform-tools, platforms;android-36 and build-tools;36.0.0 - the same platform/build-tools pair found installed on the known-good Ubuntu host, and the ones AGP 8.13.2 needs - X11/xcb/xext/xrender/xi/xtst + ALSA + PulseAudio for the webrtc-java native library - python3 + buildbot-worker 4.1.0, git/curl/unzip for checkout and deploy Compatibility: the image still runs as user "jenkins" with HOME=/var/jenkins_home and GRADLE_USER_HOME=/var/jenkins_home/.gradle, so the existing run-worker.sh docker run line (including -v jenkins-data:/var/jenkins_home) works unchanged and the Gradle/Konan caches still persist across rebuilds. The one real regression is the loss of the old image's pre-warmed caches, so the first build after this change re-downloads dependencies; that is stated in the file's header comment.
2026-09-03ios: gradle/konan cache in Actions; buildbot waits for the ios run and ships ↵ketsuban
its artifact to lighttpd; run-worker.sh: mount git_pass+github_token
2026-09-03kukuri reset: welcome-only app shell + bridge/vendor modules + CI infraketsuban
Full pre-reset history preserved on branch backup/full-pre-reset (2ccab79).