- Renamed DocStack to dockstack - Transformed toolbox-template into toolbox-qadocker with new functionality - Removed NewToolbox.sh script - Updated PROMPT and configuration files across all toolboxes - Consolidated audit and testing scripts - Updated QWEN.md to reflect new filesystem structure as authoritative source - Merged PROMPT content into QWEN.md as requested Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com> The filesystem structure has been intentionally restructured and is now the authoritative source of truth for the project organization.
111 lines
3.2 KiB
Bash
Executable File
111 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
usage() {
|
|
cat <<'EOU'
|
|
Usage: ./release.sh [--dry-run] [--allow-dirty] <semver>
|
|
|
|
Examples:
|
|
./release.sh 0.2.0
|
|
./release.sh --dry-run 0.2.0
|
|
|
|
This script rebuilds the toolbox image, tags it as:
|
|
- tsysdevstack-toolboxstack-<name>:dev
|
|
- tsysdevstack-toolboxstack-<name>:release-current
|
|
- tsysdevstack-toolboxstack-<name>:v<semver>
|
|
|
|
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 |