Skip to content

Commit 421ae58

Browse files
kerthcetclaude
andcommitted
release: ship the daemon only, drop the controller artifacts
The controller stopped being a deployed artifact when Nebula started linking it into its own manager process through the C ABI (server/src/ffi.rs). A daemon's connection is a live socket owned by whichever process accepted it, so reaching a workload from a separate controller process would mean relaying. That left the release publishing two things nothing consumes: the sandd-controller binaries and the inftyai/sandd-controller image. Publishing them implies a supported deployment shape that has no users, so drop both matrix legs and the controller-image job. The daemon assets are untouched. `cargo build --bin sandd-controller` and `make docker-build-controller` still work for running it standalone. Also fix a Makefile comment that pointed at internal/controller/pod_placement_controller.go, a path whose SandD code was deleted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Signed-off-by: kerthcet <kerthcet@gmail.com>
1 parent 3c45e33 commit 421ae58

2 files changed

Lines changed: 17 additions & 88 deletions

File tree

.github/workflows/release.yaml

Lines changed: 12 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Makefile

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,11 @@ docker-down:
116116

117117
# --- Controller image (native Rust binary) -------------------------------------
118118
#
119-
# This is the image Nebula pulls: DefaultSandDControllerImage in Nebula's
120-
# internal/controller/pod_placement_controller.go is inftyai/sandd-controller:latest.
119+
# For running the controller STANDALONE. Nebula does not pull this: it links the
120+
# controller into its own manager through the C ABI (server/src/ffi.rs), so there is
121+
# no controller Deployment and no image to pin. Nothing publishes this image either
122+
# — the release workflow ships the daemon binaries only.
123+
#
121124
# Distroless + one static-ish binary, ~50MB against the ~4GB server-tunnel image
122125
# below, because it carries no interpreter, no rustup and no Tailscale client.
123126
#

0 commit comments

Comments
 (0)