753c641e72
The standalone Registry v2 host (docker.dcglab.co.uk, briefly registry.dcglab.co.uk) is being scrapped. Move all kb images to Gitea's built-in container registry.
255 lines
10 KiB
Bash
Executable File
255 lines
10 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# release-engine.sh — Build, tag, and release the engine Docker images
|
|
#
|
|
# Usage:
|
|
# ./release-engine.sh --gitea|--github [--dry-run] [--no-increment] [--patch|--minor|--major]
|
|
|
|
set -euo pipefail
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# Config
|
|
#──────────────────────────────────────────────────────────────────────
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
ENGINE_DIR="$SCRIPT_DIR/engine"
|
|
VERSION_FILE="$ENGINE_DIR/VERSION"
|
|
|
|
# Container registry
|
|
REGISTRY="${REGISTRY:-gitea.dcglab.co.uk}"
|
|
IMAGE_ORG="${IMAGE_ORG:-steve}"
|
|
IMAGE_BASE="${REGISTRY}/${IMAGE_ORG}/kb"
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# Parse args
|
|
#──────────────────────────────────────────────────────────────────────
|
|
DRY_RUN=false
|
|
INCREMENT=true
|
|
BUMP="patch"
|
|
FORGE=""
|
|
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--dry-run) DRY_RUN=true ;;
|
|
--no-increment) INCREMENT=false ;;
|
|
--minor) BUMP="minor" ;;
|
|
--major) BUMP="major" ;;
|
|
--patch) BUMP="patch" ;;
|
|
--gitea) FORGE="tea" ;;
|
|
--github) FORGE="gh" ;;
|
|
*)
|
|
echo "Unknown argument: $arg"
|
|
echo "Usage: $0 --gitea|--github [--dry-run] [--no-increment] [--patch|--minor|--major]"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ -z "$FORGE" ]]; then
|
|
echo "Error: specify --gitea or --github"
|
|
echo "Usage: $0 --gitea|--github [--dry-run] [--no-increment] [--patch|--minor|--major]"
|
|
exit 1
|
|
fi
|
|
|
|
# Ensure we're on main branch
|
|
CURRENT_BRANCH="$(git -C "$SCRIPT_DIR" rev-parse --abbrev-ref HEAD)"
|
|
if [[ "$CURRENT_BRANCH" != "main" ]]; then
|
|
echo "Error: releases must be made from the main branch (currently on '$CURRENT_BRANCH')"
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v "$FORGE" &>/dev/null; then
|
|
echo "Error: '$FORGE' not found in PATH"
|
|
exit 1
|
|
fi
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# Version helpers
|
|
#──────────────────────────────────────────────────────────────────────
|
|
read_version() {
|
|
local file="$1"
|
|
if [[ ! -f "$file" ]]; then
|
|
echo "Error: version file not found: $file" >&2
|
|
exit 1
|
|
fi
|
|
tr -d '[:space:]' < "$file"
|
|
}
|
|
|
|
bump_version() {
|
|
local ver="$1" part="$2"
|
|
local major minor patch
|
|
IFS='.' read -r major minor patch <<< "$ver"
|
|
|
|
case "$part" in
|
|
major) echo "$((major + 1)).0.0" ;;
|
|
minor) echo "${major}.$((minor + 1)).0" ;;
|
|
patch) echo "${major}.${minor}.$((patch + 1))" ;;
|
|
esac
|
|
}
|
|
|
|
write_version() {
|
|
local file="$1" ver="$2"
|
|
echo "$ver" > "$file"
|
|
}
|
|
|
|
run() {
|
|
echo " $ $*"
|
|
if [[ "$DRY_RUN" == false ]]; then
|
|
"$@"
|
|
fi
|
|
}
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# Determine release version
|
|
#──────────────────────────────────────────────────────────────────────
|
|
CURRENT_VERSION="$(read_version "$VERSION_FILE")"
|
|
|
|
if [[ "$INCREMENT" == true ]]; then
|
|
VERSION="$(bump_version "$CURRENT_VERSION" "$BUMP")"
|
|
echo "==> Engine version bump: $CURRENT_VERSION → $VERSION ($BUMP)"
|
|
else
|
|
VERSION="$CURRENT_VERSION"
|
|
echo "==> Engine version: $VERSION (no increment)"
|
|
fi
|
|
|
|
GIT_TAG="engine-v${VERSION}"
|
|
DOCKER_TAG="v${VERSION}"
|
|
|
|
echo " Git tag: $GIT_TAG"
|
|
echo " Image tag: $DOCKER_TAG"
|
|
echo " Registry: $IMAGE_BASE"
|
|
echo " Forge CLI: $FORGE"
|
|
echo " Dry run: $DRY_RUN"
|
|
echo ""
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# 1. Pre-flight checks
|
|
#──────────────────────────────────────────────────────────────────────
|
|
echo "==> Pre-flight checks"
|
|
|
|
if [[ "$DRY_RUN" == false ]]; then
|
|
if git -C "$SCRIPT_DIR" rev-parse "$GIT_TAG" &>/dev/null; then
|
|
echo "Error: tag $GIT_TAG already exists"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo " OK"
|
|
echo ""
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# 2. Update version file
|
|
#──────────────────────────────────────────────────────────────────────
|
|
if [[ "$INCREMENT" == true ]]; then
|
|
echo "==> Updating engine version to $VERSION"
|
|
run write_version "$VERSION_FILE" "$VERSION"
|
|
echo ""
|
|
fi
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# 3. Build Docker engine images
|
|
#──────────────────────────────────────────────────────────────────────
|
|
echo "==> Building Docker engine images ($VERSION)"
|
|
|
|
NVIDIA_IMAGE="${IMAGE_BASE}/engine:${DOCKER_TAG}-nvidia"
|
|
CPU_IMAGE="${IMAGE_BASE}/engine:${DOCKER_TAG}-cpu"
|
|
NVIDIA_LATEST="${IMAGE_BASE}/engine:latest-nvidia"
|
|
CPU_LATEST="${IMAGE_BASE}/engine:latest-cpu"
|
|
|
|
run docker build -t "$NVIDIA_IMAGE" -t "$NVIDIA_LATEST" -f "$ENGINE_DIR/Dockerfile.nvidia" "$ENGINE_DIR"
|
|
run docker build -t "$CPU_IMAGE" -t "$CPU_LATEST" -f "$ENGINE_DIR/Dockerfile.cpu" "$ENGINE_DIR"
|
|
|
|
echo ""
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# 3b. Build Docker MCP server image
|
|
#──────────────────────────────────────────────────────────────────────
|
|
MCP_DIR="$SCRIPT_DIR/mcp"
|
|
|
|
if [[ -f "$MCP_DIR/Dockerfile" ]]; then
|
|
echo "==> Building Docker MCP server image ($VERSION)"
|
|
|
|
MCP_IMAGE="${IMAGE_BASE}/mcp:${DOCKER_TAG}"
|
|
MCP_LATEST="${IMAGE_BASE}/mcp:latest"
|
|
|
|
run docker build -t "$MCP_IMAGE" -t "$MCP_LATEST" -f "$MCP_DIR/Dockerfile" "$MCP_DIR"
|
|
|
|
echo ""
|
|
fi
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# 4. Commit, tag, and push
|
|
#──────────────────────────────────────────────────────────────────────
|
|
echo "==> Committing and tagging $GIT_TAG"
|
|
|
|
if [[ "$INCREMENT" == true ]]; then
|
|
run git -C "$SCRIPT_DIR" add "$VERSION_FILE"
|
|
run git -C "$SCRIPT_DIR" commit -m "Bump engine version to $VERSION"
|
|
fi
|
|
|
|
run git -C "$SCRIPT_DIR" tag -a "$GIT_TAG" -m "Release $GIT_TAG"
|
|
run git -C "$SCRIPT_DIR" push origin HEAD
|
|
run git -C "$SCRIPT_DIR" push origin "$GIT_TAG"
|
|
|
|
echo ""
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# 5. Create release
|
|
#──────────────────────────────────────────────────────────────────────
|
|
echo "==> Creating release via $FORGE"
|
|
|
|
RELEASE_TITLE="Engine $GIT_TAG"
|
|
RELEASE_NOTES="## Docker images
|
|
|
|
\`\`\`bash
|
|
# NVIDIA GPU
|
|
docker pull ${NVIDIA_IMAGE}
|
|
|
|
# CPU only
|
|
docker pull ${CPU_IMAGE}
|
|
\`\`\`
|
|
|
|
## MCP server
|
|
|
|
\`\`\`bash
|
|
docker pull ${MCP_IMAGE:-${IMAGE_BASE}/mcp:${DOCKER_TAG}}
|
|
\`\`\`"
|
|
|
|
if [[ "$FORGE" == "gh" ]]; then
|
|
run gh release create "$GIT_TAG" \
|
|
--title "$RELEASE_TITLE" \
|
|
--notes "$RELEASE_NOTES"
|
|
|
|
elif [[ "$FORGE" == "tea" ]]; then
|
|
run tea release create \
|
|
--tag "$GIT_TAG" \
|
|
--title "$RELEASE_TITLE" \
|
|
--note "$RELEASE_NOTES"
|
|
fi
|
|
|
|
echo ""
|
|
|
|
#──────────────────────────────────────────────────────────────────────
|
|
# 6. Push Docker images to registry
|
|
#──────────────────────────────────────────────────────────────────────
|
|
echo "==> Pushing Docker images to $REGISTRY"
|
|
|
|
run docker push "$NVIDIA_IMAGE"
|
|
run docker push "$NVIDIA_LATEST"
|
|
run docker push "$CPU_IMAGE"
|
|
run docker push "$CPU_LATEST"
|
|
|
|
if [[ -n "${MCP_IMAGE:-}" ]]; then
|
|
run docker push "$MCP_IMAGE"
|
|
run docker push "$MCP_LATEST"
|
|
fi
|
|
|
|
echo ""
|
|
echo "==> Release $GIT_TAG complete!"
|
|
echo ""
|
|
echo " Images:"
|
|
echo " $NVIDIA_IMAGE"
|
|
echo " $CPU_IMAGE"
|
|
if [[ -n "${MCP_IMAGE:-}" ]]; then
|
|
echo " $MCP_IMAGE"
|
|
fi
|