Skip to content

Commit cafc48d

Browse files
harrisonymcowger
andauthored
ci: add multi-arch Docker builds (amd64 + arm64) (#355)
## Summary - Add `compile:linux-arm64` script and use `TARGETARCH` in the Dockerfile to select the correct compile target at build time - Add QEMU and Docker Buildx steps to the release workflow, enabling `platforms: linux/amd64,linux/arm64` multi-arch image builds - Remove hardcoded `platform: linux/amd64` from `docker-compose.yml` so the platform is auto-detected ## Verification Multi-arch build tested successfully via `workflow_dispatch`: https://github.com/harrisony/plexus/actions/runs/25427061173 --------- Co-authored-by: Matt Cowger <matt@cowger.us>
1 parent aba8d81 commit cafc48d

5 files changed

Lines changed: 35 additions & 6 deletions

File tree

.github/workflows/release-build-docker.yml

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,23 @@ jobs:
1919
- name: Checkout repository
2020
uses: actions/checkout@v6
2121

22+
- name: Set up QEMU
23+
uses: docker/setup-qemu-action@v4
24+
25+
- name: Set up Docker Buildx
26+
uses: docker/setup-buildx-action@v4
27+
2228
- name: Set up Bun
2329
uses: oven-sh/setup-bun@v2
2430
with:
2531
bun-version: latest
2632

33+
- name: Cache Bun dependencies
34+
uses: actions/cache@v4
35+
with:
36+
path: ~/.bun/install/cache
37+
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
38+
2739
- name: Install dependencies
2840
run: bun install --frozen-lockfile
2941

@@ -52,13 +64,16 @@ jobs:
5264
with:
5365
context: .
5466
push: true
67+
platforms: linux/amd64,linux/arm64
5568
tags: ${{ steps.meta.outputs.tags }}
5669
labels: ${{ steps.meta.outputs.labels }}
5770
build-args: |
5871
APP_VERSION=${{ inputs.tag }}
72+
cache-from: type=gha
73+
cache-to: type=gha,mode=max
5974

6075
- name: Smoke test Docker image
61-
timeout-minutes: 1
76+
timeout-minutes: 2
6277
run: |
6378
echo "Starting smoke test for Docker image..."
6479
TEST_ADMIN_KEY="test-admin-key-$(openssl rand -hex 8)"

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,7 @@ packages/backend/.test-db.sqlite-wal
6969
.test-db.sqlite-wal
7070
.pi-lens
7171
docs/openapi.yaml
72+
73+
# Compiled binaries
74+
plexus-
75+
plexus

Dockerfile

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ FROM oven/bun:1 AS builder
44
WORKDIR /app
55

66
ARG APP_VERSION=dev
7+
ARG TARGETPLATFORM
78
ENV APP_VERSION=${APP_VERSION}
89

910
# Copy root package files
@@ -26,15 +27,23 @@ COPY . .
2627
# Build the frontend and compile everything into a single self-contained binary.
2728
# Frontend assets (HTML, JS, CSS, images) and migration SQL files are all embedded
2829
# inside the binary via `bun build --compile` — no runtime file copies needed.
29-
RUN bun run compile:linux
30+
# Use BuildKit's TARGETPLATFORM to select the correct build target (e.g., linux/amd64, linux/arm64)
31+
RUN case "${TARGETPLATFORM}" in \
32+
linux/arm64) bun run compile:linux-arm64 ;; \
33+
linux/amd64) bun run compile:linux-amd64 ;; \
34+
*) echo "Unsupported platform: ${TARGETPLATFORM}" && exit 1 ;; \
35+
esac
3036

3137
# Stage 2: Minimal production image — just the binary
3238
FROM debian:bookworm-slim
3339

40+
ARG APP_VERSION=dev
41+
ARG TARGETPLATFORM
42+
3443
WORKDIR /app
3544

36-
# Copy the compiled binary from the builder stage
37-
COPY --from=builder /app/plexus-linux ./plexus
45+
# Copy the compiled binary from the builder stage (uses BuildKit's TARGETPLATFORM)
46+
COPY --from=builder /app/plexus-linux-${TARGETPLATFORM#linux/} ./plexus
3847

3948
EXPOSE 4000
4049

@@ -44,6 +53,7 @@ ENV LOG_LEVEL=info
4453
ENV DATA_DIR=/app/data
4554
ENV DATABASE_URL=sqlite:///app/data/plexus.db
4655
ENV CONFIG_FILE=/app/config/plexus.yaml
56+
ENV APP_VERSION=${APP_VERSION}
4757
# ADMIN_KEY must be provided at runtime (no default for security)
4858

4959
CMD ["./plexus"]

docker-compose.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ services:
33
build: .
44
image: plexus:latest
55
container_name: plexus
6-
platform: linux/amd64
76
restart: unless-stopped
87
ports:
98
- "4000:4000"

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
"dev:frontend": "cd packages/frontend && bun run dev",
1919
"build:frontend": "cd packages/frontend && bun run build",
2020
"compile:macos": "bun run build:frontend && bun build packages/backend/src/index.ts packages/backend/drizzle/migrations/*.sql packages/backend/drizzle/migrations_pg/*.sql packages/frontend/dist/*.png packages/frontend/dist/*.ico packages/frontend/dist/*.svg packages/frontend/dist/*.webmanifest --compile --asset-naming=\"[name].[ext]\" --target=bun-darwin-arm64 --outfile plexus-macos",
21-
"compile:linux": "bun run build:frontend && bun build packages/backend/src/index.ts packages/backend/drizzle/migrations/*.sql packages/backend/drizzle/migrations_pg/*.sql packages/frontend/dist/*.png packages/frontend/dist/*.ico packages/frontend/dist/*.svg packages/frontend/dist/*.webmanifest --compile --asset-naming=\"[name].[ext]\" --target=bun-linux-x64 --outfile plexus-linux",
21+
"compile:linux-amd64": "bun run build:frontend && bun build packages/backend/src/index.ts packages/backend/drizzle/migrations/*.sql packages/backend/drizzle/migrations_pg/*.sql packages/frontend/dist/*.png packages/frontend/dist/*.ico packages/frontend/dist/*.svg packages/frontend/dist/*.webmanifest --compile --asset-naming=\"[name].[ext]\" --target=bun-linux-x64 --outfile plexus-linux-amd64",
22+
"compile:linux-arm64": "bun run build:frontend && bun build packages/backend/src/index.ts packages/backend/drizzle/migrations/*.sql packages/backend/drizzle/migrations_pg/*.sql packages/frontend/dist/*.png packages/frontend/dist/*.ico packages/frontend/dist/*.svg packages/frontend/dist/*.webmanifest --compile --asset-naming=\"[name].[ext]\" --target=bun-linux-arm64 --outfile plexus-linux-arm64",
2223
"compile:windows": "bun run build:frontend && bun build packages/backend/src/index.ts packages/backend/drizzle/migrations/*.sql packages/backend/drizzle/migrations_pg/*.sql packages/frontend/dist/*.png packages/frontend/dist/*.ico packages/frontend/dist/*.svg packages/frontend/dist/*.webmanifest --compile --asset-naming=\"[name].[ext]\" --target=bun-windows-x64 --outfile plexus.exe",
2324
"build:bin": "bun run build:frontend && bun build packages/backend/src/index.ts packages/backend/drizzle/migrations/*.sql packages/backend/drizzle/migrations_pg/*.sql packages/frontend/dist/*.png packages/frontend/dist/*.ico packages/frontend/dist/*.svg packages/frontend/dist/*.webmanifest --compile --asset-naming=\"[name].[ext]\" --outfile plexus",
2425
"install:all": "bun install && (cd packages/backend && bun install) && (cd packages/frontend && bun install)",

0 commit comments

Comments
 (0)