Background
promptlm-app's .github/workflows/acceptance.yml provisions an ephemeral cx33/fsn1 Hetzner VM (via Cyclenerd hcloud-github-runner@v1) using the snapshot identified by the org variable HETZNER_RUNNER_SNAPSHOT_ID, with a pre_runner_script fallback that installs JDK 17/21, Maven, Node 22, pnpm, yarn, jq, etc. on a fresh ubuntu-24.04 image.
The new native-app acceptance suite (see promptlm-app design notes — acceptance-tests plan) adds two requirements that the current snapshot doesn't yet meet:
- GraalVM CE 21 with
native-image — needed for mvn -B -Pnative -pl apps/promptlm-cli,apps/promptlm-webapp -am -DskipTests package. Installing GraalVM + native-image from cold on cx33 adds ~5 min to every acceptance run.
- Playwright browsers pre-installed —
npx playwright install --with-deps chromium adds ~90s on cold start and pulls ~250 MB of fonts/libs each time.
Both are paid once per snapshot bake instead of once per acceptance run.
Asks
Update the snapshot-bake job in this repo so the snapshot referenced by HETZNER_RUNNER_SNAPSHOT_ID includes:
Acceptance criteria
- A fresh acceptance run on
promptlm-app (main, full profile) that previously took the cold-install time completes ≥ 5 min faster when consuming the new snapshot.
native-image --version, mvn -Pnative package on a tiny sample, and npx playwright --version all succeed in a runner spawned from the new snapshot without running pre_runner_script.
- The existing
cx33/fsn1 allocation still works (no SKU drift).
Notes
- Same snapshot is also useful for any future repo that wants Playwright + native-image; the bake should be repo-agnostic.
- Snapshot size will grow (~1.5 GB for GraalVM, ~0.4 GB for Playwright).
cx33's 80 GB disk has plenty of headroom.
- Downstream PR in
promptlm-app will set PLAYWRIGHT_BROWSERS_PATH and remove the inline playwright install --with-deps from acceptance-tests/pom.xml's exec-maven-plugin once the snapshot is rolled.
Context links
promptlm-app/.github/workflows/acceptance.yml — current provisioning pattern (lines 102–155)
promptlm-app/acceptance-tests/pom.xml — current Playwright install step (generate-test-resources phase)
Background
promptlm-app's.github/workflows/acceptance.ymlprovisions an ephemeralcx33/fsn1Hetzner VM (via Cyclenerdhcloud-github-runner@v1) using the snapshot identified by the org variableHETZNER_RUNNER_SNAPSHOT_ID, with apre_runner_scriptfallback that installs JDK 17/21, Maven, Node 22, pnpm, yarn, jq, etc. on a freshubuntu-24.04image.The new native-app acceptance suite (see promptlm-app design notes — acceptance-tests plan) adds two requirements that the current snapshot doesn't yet meet:
native-image— needed formvn -B -Pnative -pl apps/promptlm-cli,apps/promptlm-webapp -am -DskipTests package. Installing GraalVM +native-imagefrom cold oncx33adds ~5 min to every acceptance run.npx playwright install --with-deps chromiumadds ~90s on cold start and pulls ~250 MB of fonts/libs each time.Both are paid once per snapshot bake instead of once per acceptance run.
Asks
Update the snapshot-bake job in this repo so the snapshot referenced by
HETZNER_RUNNER_SNAPSHOT_IDincludes:native-imageavailable onPATH(verify withnative-image --version)JAVA_HOMEmust be selectable so existing workflows that pin Temurin viasetup-javacontinue to work; recommend leaving Temurin as the defaultJAVA_HOMEand addingGRAALVM_HOMEseparatelynpx playwright install --with-deps chromiumrun as the runner user, or root-cached and symlinkedPLAYWRIGHT_BROWSERS_PATHcan point at it in the consuming workflowsdocs/hetzner-runners.mdto list both additions, the disk-size impact, and the verification commandspre_runner_scriptfallback inpromptlm-app/.github/workflows/acceptance.ymlworking for snapshot-less runs (the fallback should detect their absence and install them on the fly, so the snapshot bake is a perf optimisation, not a hard dep)Acceptance criteria
promptlm-app(main, full profile) that previously took the cold-install time completes ≥ 5 min faster when consuming the new snapshot.native-image --version,mvn -Pnative packageon a tiny sample, andnpx playwright --versionall succeed in a runner spawned from the new snapshot without runningpre_runner_script.cx33/fsn1allocation still works (no SKU drift).Notes
cx33's 80 GB disk has plenty of headroom.promptlm-appwill setPLAYWRIGHT_BROWSERS_PATHand remove the inlineplaywright install --with-depsfromacceptance-tests/pom.xml'sexec-maven-pluginonce the snapshot is rolled.Context links
promptlm-app/.github/workflows/acceptance.yml— current provisioning pattern (lines 102–155)promptlm-app/acceptance-tests/pom.xml— current Playwright install step (generate-test-resourcesphase)