# Ephemeral Hetzner Cloud CI: a fresh ccx53 VM is created per run, the full # build + e2e suites run on it, then it is destroyed. No persistent infra. # # Lifecycle (Cyclenerd/hcloud-github-runner): create-runner spins up a Hetzner # VM registered as an ephemeral self-hosted runner -> build-and-test runs on it # -> delete-runner tears it down (always, even on failure -> no lingering cost). # # Required repo secrets (emergence-engineering/pcbjam -> Settings -> Secrets): # HCLOUD_TOKEN Hetzner Cloud API token, Read & Write # HETZNER_RUNNER_PAT GitHub PAT with Administration: read & write (registers # and unregisters the self-hosted runner) # # Submodules: kicad/wxwidgets use SSH URLs (.gitmodules) but point at PUBLIC repos, # so actions/checkout rewrites them to HTTPS and the default GITHUB_TOKEN reads them. name: CI (Hetzner) # Manual-only (workflow_dispatch): every run costs a paid ephemeral Hetzner VM. # Main-branch CI is ci-full-build.yml. on: workflow_dispatch: inputs: binaryen_cores: description: "BINARYEN_CORES for the wasm-opt/asyncify step (blank = all cores / nproc). Use to A/B core counts." required: false default: "" concurrency: group: ci-hetzner-${{ github.ref }} cancel-in-progress: true jobs: create-runner: name: Create Hetzner runner runs-on: ubuntu-latest # or ubicloud-standard-2 if GitHub-hosted is disabled outputs: label: ${{ steps.create.outputs.label }} server_id: ${{ steps.create.outputs.server_id }} steps: - name: Create ephemeral ccx53 runner id: create uses: Cyclenerd/hcloud-github-runner@v1 with: mode: create github_token: ${{ secrets.HETZNER_RUNNER_PAT }} hcloud_token: ${{ secrets.HCLOUD_TOKEN }} server_type: ccx53 location: nbg1 image: ubuntu-24.04 build-and-test: name: Build & test (Hetzner ccx53) needs: create-runner runs-on: ${{ needs.create-runner.outputs.label }} timeout-minutes: 160 # cold --build-deps dominates; + wx build + both suites env: # Stream build-script output straight to the Actions log instead of # redirecting it to logs/