#!/usr/bin/env bash set -euo pipefail usage() { cat <<'EOU' Usage: ./release.sh [--dry-run] [--allow-dirty] Examples: ./release.sh 0.2.0 ./release.sh --dry-run 0.2.0 This script rebuilds the toolbox image, tags it as: - tsysdevstack-toolboxstack-:dev - tsysdevstack-toolboxstack-:release-current - tsysdevstack-toolboxstack-:v When run without --dry-run it pushes all three tags. EOU } DRY_RUN=false ALLOW_DIRTY=false VERSION="" while (( $# > 0 )); do case "$1" in --dry-run) DRY_RUN=true shift ;; --allow-dirty) ALLOW_DIRTY=true shift ;; -h|--help) usage exit 0 ;; -*) echo "Unknown option: $1" >&2 usage exit 1 ;; *) VERSION="$1" shift ;; esac done if [[ -z "${VERSION}" ]]; then echo "Error: semantic version is required." >&2 usage exit 1 fi if [[ "${VERSION}" =~ ^v?([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then SEMVER="v${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}" else echo "Error: version must be semantic (e.g., 0.2.0 or v0.2.0)." >&2 exit 1 fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}" && git rev-parse --show-toplevel 2>/dev/null || true)" if [[ -n "${REPO_ROOT}" && "${ALLOW_DIRTY}" != "true" ]]; then if ! git -C "${REPO_ROOT}" diff --quiet --ignore-submodules --exit-code; then echo "Error: git working tree has uncommitted changes. Please commit or stash before releasing." >&2 exit 1 fi elif [[ -z "${REPO_ROOT}" ]]; then echo "Warning: unable to resolve git repository root; skipping clean tree check." >&2 fi # Get the toolbox name from the directory name (or you can pass it as an argument) TOOLBOX_NAME="${TOOLBOX_NAME_OVERRIDE:-$(basename "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")}" IMAGE_NAME="tsysdevstack-toolboxstack-${TOOLBOX_NAME#toolbox-}" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" USER_ID="${USER_ID_OVERRIDE:-$(id -u)}" GROUP_ID="${GROUP_ID_OVERRIDE:-$(id -g)}" USERNAME="${USERNAME_OVERRIDE:-toolbox}" TEA_VERSION="${TEA_VERSION_OVERRIDE:-0.11.1}" BUILDER_NAME="${BUILDER_NAME:-tsysdevstack-toolboxstack-builder}" CACHE_DIR="${SCRIPT_DIR}/.build-cache" TAG="${TAG_OVERRIDE:-dev}" RELEASE_TAG="${RELEASE_TAG_OVERRIDE:-release-current}" VERSION_TAG="${VERSION_TAG_OVERRIDE:-}" if [[ -n "$VERSION_TAG" ]]; then VERSION_TAG="$SEMVER" fi PUSH="${PUSH_OVERRIDE:-false}" echo "Preparing release for ${SEMVER}" echo " dry-run: ${DRY_RUN}" echo " allow-dirty: ${ALLOW_DIRTY}" if [[ "${DRY_RUN}" == "true" ]]; then echo "[dry-run] Would build ${IMAGE_NAME}:${TAG}" TAG_OVERRIDE="${TAG}" PUSH_OVERRIDE=false "${SCRIPT_DIR}/build.sh" echo "[dry-run] Skipped pushing tags." else echo "Building ${IMAGE_NAME}:${TAG}" TAG_OVERRIDE="${TAG}" PUSH_OVERRIDE=true RELEASE_TAG_OVERRIDE="${RELEASE_TAG}" VERSION_TAG_OVERRIDE="${SEMVER}" "${SCRIPT_DIR}/build.sh" echo "Release ${SEMVER} pushed as:" echo " - ${IMAGE_NAME}:dev" echo " - ${IMAGE_NAME}:release-current" echo " - ${IMAGE_NAME}:${SEMVER}" fi