@@ -40,23 +40,17 @@ jobs:
4040 asset : sandd-darwin-arm64
4141 package : sandd
4242 bin : sandd
43- # The CONTROLLER. Linux-only, unlike the daemon: the daemon runs on
44- # whatever a provider's instance is (including a dev Mac), while the
45- # controller only ever runs as a container in a cluster. A darwin leg
46- # would be an asset nothing consumes.
43+ # THE DAEMON ONLY. There is deliberately no sandd-controller asset and no
44+ # controller image: the controller is not a deployed artifact any more. Its
45+ # only consumer, Nebula, compiles it INTO its manager process through the C
46+ # ABI (server/src/ffi.rs), because a daemon's connection is a live socket
47+ # owned by whichever process accepted it — so reaching back into a workload
48+ # from a separate controller process would mean relaying.
4749 #
48- # No --features python — the pyo3 layer is optional and must stay out or
49- # the bin cannot link at all (see server/Cargo.toml).
50- - runner : ubuntu-22.04
51- target : x86_64-unknown-linux-musl
52- asset : sandd-controller-linux-amd64
53- package : sandbox-server
54- bin : sandd-controller
55- - runner : ubuntu-22.04-arm
56- target : aarch64-unknown-linux-musl
57- asset : sandd-controller-linux-arm64
58- package : sandbox-server
59- bin : sandd-controller
50+ # `cargo build --bin sandd-controller` and `make docker-build-controller`
51+ # still work for anyone who wants to run it standalone. They are just not
52+ # release artifacts, and publishing them would imply a supported deployment
53+ # shape that nothing uses.
6054 steps :
6155 - uses : actions/checkout@v4
6256
@@ -113,9 +107,8 @@ jobs:
113107 - name : Generate checksums
114108 run : |
115109 cd artifacts
116- # `sandd-*` covers the controller assets too (sandd-controller-linux-*),
117- # so both binaries are checksummed by the one file consumers already read.
118- # Excluded explicitly so a re-run cannot hash a previous checksums file.
110+ # The checksums file is excluded from its own input, so a re-run of this
111+ # workflow cannot hash the file it is about to overwrite.
119112 sha256sum $(ls sandd-* | grep -v '^sandd-checksums.txt$') > sandd-checksums.txt
120113 cat sandd-checksums.txt
121114
@@ -139,70 +132,3 @@ jobs:
139132 --generate-notes \
140133 artifacts/*
141134 fi
142-
143- # The controller IMAGE — what Nebula actually pulls
144- # (DefaultSandDControllerImage = inftyai/sandd-controller:latest).
145- #
146- # A separate job, NOT `needs: build`: buildx compiles the binary itself inside the
147- # Dockerfile, so gating on the binary legs would serialize two independent builds
148- # and let a darwin-runner hiccup block the image. It also means a failed push does
149- # not hold back the GitHub release.
150- #
151- # REQUIRES SECRETS: DOCKERHUB_USERNAME and DOCKERHUB_TOKEN (a Docker Hub access
152- # token with write access to inftyai/sandd-controller). Until they exist this job
153- # fails at the login step — deliberately loud rather than silently skipped, since a
154- # tagged release with no matching image is exactly the state that is confusing to
155- # debug later.
156- controller-image :
157- name : Publish controller image
158- runs-on : ubuntu-latest
159- steps :
160- - uses : actions/checkout@v4
161-
162- # QEMU so the arm64 leg can be built on an amd64 runner. Slower than a native
163- # arm runner, but it keeps this a single job producing ONE manifest — a
164- # per-arch matrix would need a separate merge step to assemble it.
165- - name : Set up QEMU
166- uses : docker/setup-qemu-action@v3
167-
168- - name : Set up Docker Buildx
169- uses : docker/setup-buildx-action@v3
170-
171- - name : Log in to Docker Hub
172- uses : docker/login-action@v3
173- with :
174- username : ${{ secrets.DOCKERHUB_USERNAME }}
175- password : ${{ secrets.DOCKERHUB_TOKEN }}
176-
177- # Both arches as ONE manifest, so a node pulling the tag gets its own
178- # architecture. Same platforms the Makefile's docker-push-controller uses.
179- #
180- # `latest` moves with every tag because that is what
181- # DefaultSandDControllerImage points at; the version tag is the immutable one to
182- # pin in production.
183- - name : Build and push
184- uses : docker/build-push-action@v6
185- with :
186- context : .
187- file : hack/docker/Dockerfile.controller
188- platforms : linux/amd64,linux/arm64
189- push : true
190- tags : |
191- inftyai/sandd-controller:${{ github.ref_name }}
192- inftyai/sandd-controller:latest
193- # Cache through the registry: each release starts from a cold runner, and a
194- # from-scratch dependency compile is the bulk of this job.
195- cache-from : type=registry,ref=inftyai/sandd-controller:buildcache
196- cache-to : type=registry,ref=inftyai/sandd-controller:buildcache,mode=max
197-
198- # Proves the pushed manifest is actually multi-arch and that the binary in it
199- # runs. A single-arch push dies on the node with "exec format error", which is
200- # a far worse place to discover it.
201- - name : Verify the pushed manifest
202- run : |
203- docker buildx imagetools inspect inftyai/sandd-controller:${{ github.ref_name }}
204- for arch in amd64 arm64; do
205- echo "--- linux/$arch ---"
206- docker run --rm --platform "linux/$arch" \
207- inftyai/sandd-controller:${{ github.ref_name }} --version
208- done
0 commit comments