Files
OpenShell/tasks/scripts/docker-build-cluster.sh
John T. Myers 97bad8b7d0 chore: derive build version from git tags for all components (#305)
Compute version strings from git describe in openshell-core's build.rs
using the guess-next-dev scheme (e.g. 0.0.4-dev.6+g2bf9969). All binary
crates and the TUI splash screen now use the shared openshell_core::VERSION
constant instead of CARGO_PKG_VERSION.

In Docker/CI builds where .git is absent, falls back to CARGO_PKG_VERSION
which is already set correctly by the sed-patch pipeline. Also adds
OPENSHELL_CARGO_VERSION support to the cluster image and fast-deploy
supervisor builds for parity with the gateway.
2026-03-14 14:58:33 -07:00

92 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
# Build the k3s cluster image with bundled helm charts.
#
# Environment:
# IMAGE_TAG - Image tag (default: dev)
# K3S_VERSION - k3s version override (optional; default in Dockerfile.cluster)
# DOCKER_PLATFORM - Target platform (optional)
# DOCKER_BUILDER - Buildx builder name (default: auto-select)
# DOCKER_PUSH - When set to "1", push instead of loading into local daemon
# IMAGE_REGISTRY - Registry prefix for image name (e.g. ghcr.io/org/repo)
set -euo pipefail
IMAGE_TAG=${IMAGE_TAG:-dev}
IMAGE_NAME="openshell/cluster"
if [[ -n "${IMAGE_REGISTRY:-}" ]]; then
IMAGE_NAME="${IMAGE_REGISTRY}/cluster"
fi
DOCKER_BUILD_CACHE_DIR=${DOCKER_BUILD_CACHE_DIR:-.cache/buildkit}
CACHE_PATH="${DOCKER_BUILD_CACHE_DIR}/cluster"
mkdir -p "${CACHE_PATH}"
# Select builder — prefer native "docker" driver for local single-arch builds
# to avoid slow tarball export from the docker-container driver.
BUILDER_ARGS=()
if [[ -n "${DOCKER_BUILDER:-}" ]]; then
BUILDER_ARGS=(--builder "${DOCKER_BUILDER}")
elif [[ -z "${DOCKER_PLATFORM:-}" && -z "${CI:-}" ]]; then
_ctx=$(docker context inspect --format '{{.Name}}' 2>/dev/null || echo default)
BUILDER_ARGS=(--builder "${_ctx}")
fi
CACHE_ARGS=()
if [[ -z "${CI:-}" ]]; then
# Local development: use filesystem cache with docker-container driver.
if docker buildx inspect ${BUILDER_ARGS[@]+"${BUILDER_ARGS[@]}"} 2>/dev/null | grep -q "Driver: docker-container"; then
CACHE_ARGS=(
--cache-from "type=local,src=${CACHE_PATH}"
--cache-to "type=local,dest=${CACHE_PATH},mode=max"
)
fi
fi
# Create build directory for charts
mkdir -p deploy/docker/.build/charts
# Package helm chart
echo "Packaging helm chart..."
helm package deploy/helm/openshell -d deploy/docker/.build/charts/
# Build cluster image (no bundled component images — they are pulled at runtime
# from the distribution registry; credentials are injected at deploy time)
echo "Building cluster image..."
OUTPUT_FLAG="--load"
if [[ "${DOCKER_PUSH:-}" == "1" ]]; then
OUTPUT_FLAG="--push"
elif [[ "${DOCKER_PLATFORM:-}" == *","* ]]; then
# Multi-platform builds cannot use --load; push is required.
OUTPUT_FLAG="--push"
fi
# Compute cargo version from git tags (same scheme as docker-build-component.sh).
VERSION_ARGS=()
if [[ -n "${OPENSHELL_CARGO_VERSION:-}" ]]; then
VERSION_ARGS=(--build-arg "OPENSHELL_CARGO_VERSION=${OPENSHELL_CARGO_VERSION}")
else
CARGO_VERSION=$(uv run python tasks/scripts/release.py get-version --cargo 2>/dev/null || true)
if [[ -n "${CARGO_VERSION}" ]]; then
VERSION_ARGS=(--build-arg "OPENSHELL_CARGO_VERSION=${CARGO_VERSION}")
fi
fi
docker buildx build \
${BUILDER_ARGS[@]+"${BUILDER_ARGS[@]}"} \
${DOCKER_PLATFORM:+--platform ${DOCKER_PLATFORM}} \
${CACHE_ARGS[@]+"${CACHE_ARGS[@]}"} \
${VERSION_ARGS[@]+"${VERSION_ARGS[@]}"} \
-f deploy/docker/Dockerfile.cluster \
-t ${IMAGE_NAME}:${IMAGE_TAG} \
${K3S_VERSION:+--build-arg K3S_VERSION=${K3S_VERSION}} \
--provenance=false \
${OUTPUT_FLAG} \
.
echo "Done! Cluster image: ${IMAGE_NAME}:${IMAGE_TAG}"