From 5cb4f2193a6289d56e2ab6339ea0cb9d69ee32ff Mon Sep 17 00:00:00 2001 From: joshsiv-mulga Date: Sun, 17 May 2026 20:31:04 +1000 Subject: [PATCH] build(microvm): wire build into deploy + distro + release pipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds install-microvm Makefile target (with grouped-target staleness detection on vmlinuz/initramfs.cpio.gz), wires it into dev-install.sh and reset-dev-env.sh, makes 'make deploy' reinstall artifacts when present, and makes 'make distro-amd64' stage build/microvm/* into the release tarball staging dir. arm64 distro stays unchanged (no aarch64 microvm artifact yet — Phase 4). Release workflow gains a setup-go step and a 'make build-microvm-image' step before 'make distro-amd64' on the amd64 runner so the resulting tarball includes the kernel + initramfs without a manual copy. Precursor for the Phase 3 PC-machine LB removal (mulga-siv-69). Closes mulga-siv-71. --- .github/workflows/release.yml | 8 +++++++ Makefile | 40 ++++++++++++++++++++++++++++++++--- scripts/dev-install.sh | 3 +++ scripts/reset-dev-env.sh | 4 ++++ 4 files changed, 52 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 788f83460..4655253d5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,6 +31,14 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: '1.26.3' + + - name: Build microVM artifacts (lb-agent + kernel + initramfs) + run: cd spinifex && make build-microvm-image + - name: Build amd64 Tarball env: VERSION: ${{ github.ref_name }} diff --git a/Makefile b/Makefile index 7d6d05d58..8e6ebf91b 100644 --- a/Makefile +++ b/Makefile @@ -82,9 +82,26 @@ endif build-lb-image: ## Build LB Alpine image $(MAKE) build-system-image IMAGE=lb -build-microvm-image: ## Build microVM kernel + initramfs +MICROVM_OUT_DIR := build/microvm +MICROVM_ARTIFACTS := $(MICROVM_OUT_DIR)/vmlinuz $(MICROVM_OUT_DIR)/initramfs.cpio.gz +MICROVM_INPUTS := scripts/build-microvm-image.sh $(MICROVM_OUT_DIR)/init.sh $(MICROVM_OUT_DIR)/inittab bin/lb-agent + +# Grouped target — script writes both files in one run. +$(MICROVM_ARTIFACTS) &: $(MICROVM_INPUTS) ./scripts/build-microvm-image.sh +# Only triggers when bin/lb-agent is missing; preserves the artifact's mtime so +# build-microvm-image stays correctly stale-aware. +bin/lb-agent: + $(MAKE) build-lb-agent + +build-microvm-image: $(MICROVM_ARTIFACTS) ## Build microVM kernel + initramfs (incremental — skips when up to date) + +install-microvm: $(MICROVM_ARTIFACTS) ## Install microVM artifacts to /usr/share/spinifex/microvm/ + sudo install -d /usr/share/spinifex/microvm + sudo install -m 0644 $(MICROVM_OUT_DIR)/vmlinuz /usr/share/spinifex/microvm/vmlinuz + sudo install -m 0644 $(MICROVM_OUT_DIR)/initramfs.cpio.gz /usr/share/spinifex/microvm/initramfs.cpio.gz + go_run: @echo -e "\n....Running $(GO_PROJECT_NAME)...." $(GOPATH)/bin/$(GO_PROJECT_NAME) @@ -125,9 +142,18 @@ run: $(MAKE) go_build $(MAKE) go_run -# Fast iteration: build + install binary + restart all services +# Fast iteration: build + install binary + restart all services. +# Microvm artifacts are reinstalled when they already exist on disk — the rule's +# input timestamps drive a rebuild only if anything actually changed. On a fresh +# checkout (no build/microvm/vmlinuz yet) the install step is skipped; run +# `make install-microvm` explicitly the first time. deploy: build sudo install -m 755 bin/spx /usr/local/bin/spx + @if [ -f $(MICROVM_OUT_DIR)/vmlinuz ]; then \ + $(MAKE) install-microvm; \ + else \ + echo "[deploy] microvm artifacts absent — run 'make install-microvm' for first-time setup"; \ + fi sudo systemctl daemon-reload sudo systemctl restart spinifex.target @@ -209,6 +235,14 @@ distro-amd64: -f build/Dockerfile.distro \ --output type=local,dest=dist/amd64/ \ ../ + @if [ -f $(MICROVM_OUT_DIR)/vmlinuz ] && [ -f $(MICROVM_OUT_DIR)/initramfs.cpio.gz ]; then \ + echo "[distro-amd64] staging microvm artifacts into tarball"; \ + mkdir -p dist/amd64/microvm; \ + cp $(MICROVM_OUT_DIR)/vmlinuz $(MICROVM_OUT_DIR)/initramfs.cpio.gz dist/amd64/microvm/; \ + else \ + echo "[distro-amd64] WARNING: microvm artifacts missing — tarball will not include them"; \ + echo "[distro-amd64] run 'make build-microvm-image' before 'make distro-amd64'"; \ + fi tar -czf dist/spinifex-$(VERSION)-linux-amd64.tar.gz -C dist/amd64 . sha256sum dist/spinifex-$(VERSION)-linux-amd64.tar.gz > dist/spinifex-$(VERSION)-linux-amd64.tar.gz.sha256 @@ -241,7 +275,7 @@ ansible-dev-install: ansible-dev-reset: cd scripts/ansible && ansible-playbook playbooks/dev-reset.yml -.PHONY: build build-ui build-installer build-lb-agent build-system-image build-lb-image build-microvm-image go_build go_run preflight test test-cover test-race diff-coverage bench run \ +.PHONY: build build-ui build-installer build-lb-agent build-system-image build-lb-image build-microvm-image install-microvm go_build go_run preflight test test-cover test-race diff-coverage bench run \ deploy reinstall clean \ install-system install-go install-aws quickinstall \ lint fix govulncheck \ diff --git a/scripts/dev-install.sh b/scripts/dev-install.sh index 5bd6ad862..0fd0112bd 100755 --- a/scripts/dev-install.sh +++ b/scripts/dev-install.sh @@ -95,6 +95,9 @@ echo "=== Building and importing LB image ===" cd "$PROJECT_ROOT" && make build-lb-agent "$PROJECT_ROOT/scripts/build-system-image.sh" "$PROJECT_ROOT/scripts/images/lb.conf" --import --quiet +echo "=== Building and installing microVM artifacts ===" +cd "$PROJECT_ROOT" && make install-microvm + echo "=== Done ===" echo "Services: sudo systemctl status spinifex.target" echo "Logs: journalctl -u 'spinifex-*' -f" diff --git a/scripts/reset-dev-env.sh b/scripts/reset-dev-env.sh index 05db3609e..ff69be427 100755 --- a/scripts/reset-dev-env.sh +++ b/scripts/reset-dev-env.sh @@ -273,5 +273,9 @@ echo "==> Building and importing LB image" cd "$PROJECT_ROOT" && make build-lb-agent "$PROJECT_ROOT/scripts/build-system-image.sh" "$PROJECT_ROOT/scripts/images/lb.conf" --import --quiet +# --- Build + install microVM artifacts (kernel + initramfs for direct-boot LBs) --- +echo "==> Building and installing microVM artifacts" +cd "$PROJECT_ROOT" && make install-microvm + # --- Smoke test --- sudo -u "$INVOKING_USER" "$SCRIPT_DIR/smoke-test.sh"