128 lines
4.1 KiB
Bash
Executable File
128 lines
4.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# [DEF:BuildOfflineDockerBundle:Module]
|
|
# @PURPOSE: Build and export an offline Docker bundle for enterprise-clean releases.
|
|
# @COMPLEXITY: 2
|
|
# [/DEF:BuildOfflineDockerBundle:Module]
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
DIST_ROOT="${PROJECT_ROOT}/dist/docker"
|
|
|
|
TAG="${1:-v1.0.0-rc2}"
|
|
POSTGRES_IMAGE="${POSTGRES_IMAGE:-postgres:16-alpine}"
|
|
BACKEND_IMAGE="ss-tools-backend:${TAG}"
|
|
FRONTEND_IMAGE="ss-tools-frontend:${TAG}"
|
|
|
|
get_image_id() {
|
|
docker image inspect --format '{{.Id}}' "$1"
|
|
}
|
|
|
|
get_repo_digest() {
|
|
local digest
|
|
digest="$(docker image inspect --format '{{join .RepoDigests ","}}' "$1" 2>/dev/null || true)"
|
|
if [[ -n "${digest}" && "${digest}" != "<no value>" ]]; then
|
|
printf '%s' "${digest}"
|
|
else
|
|
printf '%s' "unavailable"
|
|
fi
|
|
}
|
|
|
|
mkdir -p "${DIST_ROOT}"
|
|
|
|
cd "${PROJECT_ROOT}"
|
|
|
|
echo "[offline-bundle] building backend image ${BACKEND_IMAGE}"
|
|
docker build -f docker/backend.Dockerfile -t "${BACKEND_IMAGE}" .
|
|
|
|
echo "[offline-bundle] building frontend image ${FRONTEND_IMAGE}"
|
|
docker build -f docker/frontend.Dockerfile -t "${FRONTEND_IMAGE}" .
|
|
|
|
echo "[offline-bundle] pulling postgres image ${POSTGRES_IMAGE}"
|
|
docker pull "${POSTGRES_IMAGE}"
|
|
|
|
echo "[offline-bundle] exporting tar archives"
|
|
docker save -o "${DIST_ROOT}/backend.${TAG}.tar" "${BACKEND_IMAGE}"
|
|
docker save -o "${DIST_ROOT}/frontend.${TAG}.tar" "${FRONTEND_IMAGE}"
|
|
docker save -o "${DIST_ROOT}/postgres.${TAG}.tar" "${POSTGRES_IMAGE}"
|
|
|
|
echo "[offline-bundle] calculating checksums"
|
|
(
|
|
cd "${DIST_ROOT}"
|
|
sha256sum "backend.${TAG}.tar" "frontend.${TAG}.tar" "postgres.${TAG}.tar" > "sha256sums.${TAG}.txt"
|
|
)
|
|
|
|
BACKEND_IMAGE_ID="$(get_image_id "${BACKEND_IMAGE}")"
|
|
FRONTEND_IMAGE_ID="$(get_image_id "${FRONTEND_IMAGE}")"
|
|
POSTGRES_IMAGE_ID="$(get_image_id "${POSTGRES_IMAGE}")"
|
|
|
|
BACKEND_REPO_DIGEST="$(get_repo_digest "${BACKEND_IMAGE}")"
|
|
FRONTEND_REPO_DIGEST="$(get_repo_digest "${FRONTEND_IMAGE}")"
|
|
POSTGRES_REPO_DIGEST="$(get_repo_digest "${POSTGRES_IMAGE}")"
|
|
|
|
cat > "${DIST_ROOT}/manifest.${TAG}.txt" <<EOF
|
|
release_tag=${TAG}
|
|
backend_image=${BACKEND_IMAGE}
|
|
backend_image_id=${BACKEND_IMAGE_ID}
|
|
backend_repo_digest=${BACKEND_REPO_DIGEST}
|
|
frontend_image=${FRONTEND_IMAGE}
|
|
frontend_image_id=${FRONTEND_IMAGE_ID}
|
|
frontend_repo_digest=${FRONTEND_REPO_DIGEST}
|
|
postgres_image=${POSTGRES_IMAGE}
|
|
postgres_image_id=${POSTGRES_IMAGE_ID}
|
|
postgres_repo_digest=${POSTGRES_REPO_DIGEST}
|
|
compose_file=docker-compose.enterprise-clean.yml
|
|
env_template=.env.enterprise-clean.example
|
|
env_bootstrap_fields=INITIAL_ADMIN_CREATE,INITIAL_ADMIN_USERNAME,INITIAL_ADMIN_PASSWORD,INITIAL_ADMIN_EMAIL
|
|
checksums_file=sha256sums.${TAG}.txt
|
|
generated_at_utc=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
EOF
|
|
|
|
cat > "${DIST_ROOT}/manifest.${TAG}.json" <<EOF
|
|
{
|
|
"release_tag": "${TAG}",
|
|
"images": [
|
|
{
|
|
"role": "backend",
|
|
"image": "${BACKEND_IMAGE}",
|
|
"image_id": "${BACKEND_IMAGE_ID}",
|
|
"repo_digest": "${BACKEND_REPO_DIGEST}",
|
|
"archive": "backend.${TAG}.tar"
|
|
},
|
|
{
|
|
"role": "frontend",
|
|
"image": "${FRONTEND_IMAGE}",
|
|
"image_id": "${FRONTEND_IMAGE_ID}",
|
|
"repo_digest": "${FRONTEND_REPO_DIGEST}",
|
|
"archive": "frontend.${TAG}.tar"
|
|
},
|
|
{
|
|
"role": "postgres",
|
|
"image": "${POSTGRES_IMAGE}",
|
|
"image_id": "${POSTGRES_IMAGE_ID}",
|
|
"repo_digest": "${POSTGRES_REPO_DIGEST}",
|
|
"archive": "postgres.${TAG}.tar"
|
|
}
|
|
],
|
|
"compose_file": "docker-compose.enterprise-clean.yml",
|
|
"env_template": ".env.enterprise-clean.example",
|
|
"env_bootstrap_fields": [
|
|
"INITIAL_ADMIN_CREATE",
|
|
"INITIAL_ADMIN_USERNAME",
|
|
"INITIAL_ADMIN_PASSWORD",
|
|
"INITIAL_ADMIN_EMAIL"
|
|
],
|
|
"checksums_file": "sha256sums.${TAG}.txt"
|
|
}
|
|
EOF
|
|
|
|
cp "${PROJECT_ROOT}/docker-compose.enterprise-clean.yml" "${DIST_ROOT}/docker-compose.enterprise-clean.yml"
|
|
cp "${PROJECT_ROOT}/.env.enterprise-clean.example" "${DIST_ROOT}/.env.enterprise-clean.example"
|
|
|
|
echo "[offline-bundle] bundle created in ${DIST_ROOT}"
|
|
echo "[offline-bundle] next step:"
|
|
echo " docker load -i ${DIST_ROOT}/backend.${TAG}.tar"
|
|
echo " docker load -i ${DIST_ROOT}/frontend.${TAG}.tar"
|
|
echo " docker load -i ${DIST_ROOT}/postgres.${TAG}.tar"
|