From 5e5eb572b3e26bf746ffa40ac1ae2d22ac9ca0ee Mon Sep 17 00:00:00 2001 From: maziggy Date: Fri, 2 Jan 2026 11:21:35 +0100 Subject: [PATCH] - Pre-built Docker images on GitHub Container Registry - Add multi-architecture support: linux/amd64 and linux/arm64 (Raspberry Pi 4/5) - Add docker-publish.sh script for building and pushing images - Supports --parallel flag for simultaneous architecture builds - Uses Docker Buildx with QEMU emulation - Update docker-compose.yml to support both pre-built and source builds - `docker compose up -d` pulls pre-built image - `docker compose up -d --build` builds from source --- CHANGELOG.md | 7 +- README.md | 18 ++++- docker-compose.yml | 4 + docker-publish.sh | 196 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 222 insertions(+), 3 deletions(-) create mode 100755 docker-publish.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index 15f7e8393..f2e7a1cfa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,14 @@ All notable changes to Bambuddy will be documented in this file. -## [0.1.6b5] - 2026-01-01 +## [0.1.6b5] - 2026-01-02 ### Added +- **Pre-built Docker images** - Ready-to-use container images on GitHub Container Registry: + - Pull directly: `docker pull ghcr.io/maziggy/bambuddy:latest` + - Multi-architecture support: `linux/amd64` and `linux/arm64` (Raspberry Pi 4/5) + - No build required - just `docker compose up -d` + - Automatic architecture detection - Docker pulls the right image for your system - **Spoolman Link Spool feature** - Manually link existing Spoolman spools to AMS trays: - Hover over any AMS slot to see "Link to Spoolman" button (when Spoolman enabled) - Select from list of unlinked Spoolman spools diff --git a/README.md b/README.md index 593872d04..f1bad46e1 100644 --- a/README.md +++ b/README.md @@ -237,14 +237,24 @@ #### Docker (Recommended) +**Option A: Pre-built image (fastest)** ```bash -git clone https://github.com/maziggy/bambuddy.git -cd bambuddy +mkdir bambuddy && cd bambuddy +curl -O https://raw.githubusercontent.com/maziggy/bambuddy/main/docker-compose.yml docker compose up -d ``` +**Option B: Build from source** +```bash +git clone https://github.com/maziggy/bambuddy.git +cd bambuddy +docker compose up -d --build +``` + Open **http://localhost:8000** in your browser. +> **Multi-architecture support:** Pre-built images are available for `linux/amd64` and `linux/arm64` (Raspberry Pi 4/5). +
Docker Configuration & Commands @@ -267,6 +277,10 @@ Open **http://localhost:8000** in your browser. **Updating:** ```bash +# Pre-built image: just pull the latest +docker compose pull && docker compose up -d + +# From source: rebuild after pulling changes cd bambuddy && git pull && docker compose up -d --build ``` diff --git a/docker-compose.yml b/docker-compose.yml index 43d9d9742..990d4873f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,10 @@ services: bambuddy: + image: ghcr.io/maziggy/bambuddy:latest build: . + # Usage: + # docker compose up -d → pulls pre-built image from ghcr.io + # docker compose up -d --build → builds locally from source container_name: bambuddy # Network mode options: # - Default (bridge): Works for basic usage, but printer discovery and diff --git a/docker-publish.sh b/docker-publish.sh new file mode 100755 index 000000000..69df45832 --- /dev/null +++ b/docker-publish.sh @@ -0,0 +1,196 @@ +#!/bin/bash +# Build and push multi-architecture Docker image to GitHub Container Registry +# +# Usage: +# ./scripts/docker-publish.sh [version] [--parallel] +# +# Examples: +# ./scripts/docker-publish.sh 0.1.6 # Sequential build (default) +# ./scripts/docker-publish.sh 0.1.6 --parallel # Build both archs simultaneously +# ./scripts/docker-publish.sh 0.1.6-beta # Pre-release (no latest tag) +# +# Prerequisites: +# 1. Log in to ghcr.io first: +# echo $GITHUB_TOKEN | docker login ghcr.io -u YOUR_USERNAME --password-stdin +# +# 2. Create a GitHub Personal Access Token with 'write:packages' scope: +# https://github.com/settings/tokens/new?scopes=write:packages +# +# Supported architectures: +# - linux/amd64 (x86_64, most servers/desktops) +# - linux/arm64 (Raspberry Pi 4/5, Apple Silicon via emulation) + +set -e + +# Configuration +REGISTRY="ghcr.io" +IMAGE_NAME="maziggy/bambuddy" +FULL_IMAGE="${REGISTRY}/${IMAGE_NAME}" +PLATFORMS="linux/amd64,linux/arm64" +BUILDER_NAME="bambuddy-builder" + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Parse arguments +VERSION="" +PARALLEL=false +for arg in "$@"; do + case $arg in + --parallel) + PARALLEL=true + ;; + *) + if [ -z "$VERSION" ]; then + VERSION="$arg" + fi + ;; + esac +done + +if [ -z "$VERSION" ]; then + echo -e "${YELLOW}Usage: $0 [--parallel]${NC}" + echo "Example: $0 0.1.6" + echo " $0 0.1.6 --parallel # Build both architectures simultaneously" + exit 1 +fi + +# Get CPU count +CPU_COUNT=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4) + +echo -e "${GREEN}================================================${NC}" +echo -e "${GREEN} Building multi-arch image${NC}" +echo -e "${GREEN} ${FULL_IMAGE}:${VERSION}${NC}" +echo -e "${GREEN} Platforms: ${PLATFORMS}${NC}" +echo -e "${GREEN} CPU cores: ${CPU_COUNT}${NC}" +if [ "$PARALLEL" = true ]; then + echo -e "${GREEN} Mode: PARALLEL (both archs simultaneously)${NC}" +else + echo -e "${GREEN} Mode: Sequential (amd64 → arm64)${NC}" +fi +echo -e "${GREEN}================================================${NC}" +echo "" + +# Check if logged in to registry +if ! docker info 2>/dev/null | grep -q "Username"; then + echo -e "${YELLOW}Warning: You may not be logged in to Docker registry${NC}" + echo "Run: echo \$GITHUB_TOKEN | docker login ghcr.io -u YOUR_USERNAME --password-stdin" + echo "" +fi + +# Determine if this is a release version (no pre-release suffix) +IS_RELEASE=false +if [[ "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + IS_RELEASE=true +fi + +# Setup buildx builder if not exists +echo -e "${BLUE}[1/4] Setting up Docker Buildx...${NC}" +if ! docker buildx inspect "$BUILDER_NAME" >/dev/null 2>&1; then + echo "Creating new buildx builder: $BUILDER_NAME" + docker buildx create \ + --name "$BUILDER_NAME" \ + --driver docker-container \ + --driver-opt network=host \ + --buildkitd-flags '--allow-insecure-entitlement network.host' \ + --bootstrap +fi +docker buildx use "$BUILDER_NAME" + +# Verify builder supports multi-platform +echo -e "${BLUE}[2/4] Verifying multi-platform support...${NC}" +if ! docker buildx inspect --bootstrap | grep -q "linux/arm64"; then + echo -e "${YELLOW}Installing QEMU for cross-platform builds...${NC}" + docker run --privileged --rm tonistiigi/binfmt --install all +fi + +# Build tags +TAGS="-t ${FULL_IMAGE}:${VERSION}" +if [ "$IS_RELEASE" = true ]; then + TAGS="$TAGS -t ${FULL_IMAGE}:latest" + echo -e "${BLUE}[3/4] Building and pushing (version + latest)...${NC}" +else + echo -e "${BLUE}[3/4] Building and pushing (version only, no latest)...${NC}" +fi + +if [ "$PARALLEL" = true ]; then + # Parallel build: Build each architecture separately then combine + echo -e "${YELLOW}Building amd64 and arm64 in parallel...${NC}" + + # Build amd64 in background + ( + echo -e "${BLUE}[amd64] Starting build...${NC}" + docker buildx build \ + --platform linux/amd64 \ + -t "${FULL_IMAGE}:${VERSION}-amd64" \ + --provenance=false \ + --push \ + . 2>&1 | sed 's/^/[amd64] /' + echo -e "${GREEN}[amd64] Complete!${NC}" + ) & + PID_AMD64=$! + + # Build arm64 in background + ( + echo -e "${BLUE}[arm64] Starting build...${NC}" + docker buildx build \ + --platform linux/arm64 \ + -t "${FULL_IMAGE}:${VERSION}-arm64" \ + --provenance=false \ + --push \ + . 2>&1 | sed 's/^/[arm64] /' + echo -e "${GREEN}[arm64] Complete!${NC}" + ) & + PID_ARM64=$! + + # Wait for both builds + echo "Waiting for parallel builds to complete..." + wait $PID_AMD64 + wait $PID_ARM64 + + # Create and push multi-arch manifest + echo -e "${BLUE}Creating multi-arch manifest...${NC}" + docker buildx imagetools create \ + -t "${FULL_IMAGE}:${VERSION}" \ + "${FULL_IMAGE}:${VERSION}-amd64" \ + "${FULL_IMAGE}:${VERSION}-arm64" + + if [ "$IS_RELEASE" = true ]; then + docker buildx imagetools create \ + -t "${FULL_IMAGE}:latest" \ + "${FULL_IMAGE}:${VERSION}-amd64" \ + "${FULL_IMAGE}:${VERSION}-arm64" + fi +else + # Sequential build (default): Build both platforms in one command + DOCKER_BUILDKIT=1 docker buildx build \ + --platform "$PLATFORMS" \ + --build-arg BUILDKIT_INLINE_CACHE=1 \ + --provenance=false \ + $TAGS \ + --push \ + . +fi + +echo -e "${BLUE}[4/4] Verifying manifest...${NC}" +docker buildx imagetools inspect "${FULL_IMAGE}:${VERSION}" + +echo "" +echo -e "${GREEN}================================================${NC}" +echo -e "${GREEN}✓ Successfully pushed multi-arch image:${NC}" +echo -e "${GREEN}================================================${NC}" +echo " - ${FULL_IMAGE}:${VERSION}" +if [ "$IS_RELEASE" = true ]; then + echo " - ${FULL_IMAGE}:latest" +fi +echo "" +echo -e "${BLUE}Supported platforms:${NC}" +echo " - linux/amd64 (Intel/AMD servers, desktops)" +echo " - linux/arm64 (Raspberry Pi 4/5, Apple Silicon)" +echo "" +echo -e "${GREEN}Users can now run:${NC}" +echo " docker pull ${FULL_IMAGE}:${VERSION}"