# Platform-native CI/CD — luxfi/node (the GitHub-Actions escape) # # Build is owned by platform.hanzo.ai (NOT GitHub Actions). On a tag push, # platform reads this file, schedules ONE build job per matrix entry onto the # self-hosted arcd long-poll fabric, and an arcd runner on the `lux-build-*` # pool builds + pushes the image to GHCR. There is NO GitHub-Actions build hop: # the legacy .github/workflows/docker.yml is retired (see RELEASE.md §retire). # # This ONE Dockerfile build produces BOTH lux release artifacts: # 1. the node image -> ghcr.io/luxfi/node: (luxd + all 12 VM plugins # baked at /luxd/build/plugins/) # 2. the plugin SET -> s3://lux-plugins-// (published in a # second, decoupled step from the image's baked plugins — see # scripts/publish_plugin_set.sh; consumed by the operator plugin-fetch # init container via the LuxNetwork CR pluginSource). # # Schema reference: ~/work/hanzo/platform/docs/PLATFORM_CI.md. # Release runbook (the ONE canonical way): ./RELEASE.md. # # Pool resolution: -build--. org=luxfi -> brand=lux, so this # repo's pools are `lux-build-linux-amd64` and `lux-build-linux-arm64`. These # MUST match the live arcd scale-set names exactly. # # Tagging: a release is a `v*` git-tag push. The webhook decoder maps the tag # ref to `branch=`, so `tag-pattern: "{{git.branch}}"` yields the # image tag `vX.Y.Z` (immutable, semver-only — no :latest, no floating tags). build: matrix: - { os: linux, arch: amd64 } - { os: linux, arch: arm64 } dockerfile: ./Dockerfile context: . image: ghcr.io/luxfi/node tag-pattern: "{{git.branch}}" push: true dispatch: native # No `deploy:` block. luxd rollout is owned by the lux operator (LuxNetwork CR, # ~/work/lux/operator) which the hanzo operator Service-CR rollout does not # model. Deploy is a separate, operator-driven step (RELEASE.md §deploy).