228 lines
6.6 KiB
Bash
Executable File
228 lines
6.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# RuVector-Postgres Docker Hub Publication Script
|
|
# Builds and publishes multi-arch Docker images to Docker Hub
|
|
#
|
|
# Usage:
|
|
# ./publish-dockerhub.sh # Build and push v2.0.0
|
|
# ./publish-dockerhub.sh --dry-run # Build only, don't push
|
|
# ./publish-dockerhub.sh --pg-version 16 # Build for specific PG version
|
|
# ./publish-dockerhub.sh --all-versions # Build for all PG versions
|
|
|
|
set -e
|
|
set -u
|
|
set -o pipefail
|
|
|
|
# Configuration
|
|
DOCKER_REGISTRY="${DOCKER_REGISTRY:-ruvector}"
|
|
IMAGE_NAME="${IMAGE_NAME:-ruvector-postgres}"
|
|
VERSION="2.0.0"
|
|
RUST_VERSION="1.83"
|
|
|
|
# Supported PostgreSQL versions
|
|
PG_VERSIONS=(14 15 16 17)
|
|
DEFAULT_PG_VERSION=17
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
# Flags
|
|
DRY_RUN=false
|
|
ALL_VERSIONS=false
|
|
SINGLE_PG_VERSION=""
|
|
PUSH_LATEST=true
|
|
|
|
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
|
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
|
|
# Parse arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--dry-run)
|
|
DRY_RUN=true
|
|
shift
|
|
;;
|
|
--pg-version)
|
|
SINGLE_PG_VERSION="$2"
|
|
shift 2
|
|
;;
|
|
--all-versions)
|
|
ALL_VERSIONS=true
|
|
shift
|
|
;;
|
|
--no-latest)
|
|
PUSH_LATEST=false
|
|
shift
|
|
;;
|
|
--help)
|
|
echo "Usage: $0 [OPTIONS]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --dry-run Build only, don't push to Docker Hub"
|
|
echo " --pg-version N Build for specific PostgreSQL version (14-17)"
|
|
echo " --all-versions Build for all supported PostgreSQL versions"
|
|
echo " --no-latest Don't tag as 'latest'"
|
|
echo " --help Show this help"
|
|
exit 0
|
|
;;
|
|
*)
|
|
log_error "Unknown option: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Determine which versions to build
|
|
if [[ -n "$SINGLE_PG_VERSION" ]]; then
|
|
VERSIONS_TO_BUILD=("$SINGLE_PG_VERSION")
|
|
elif [[ "$ALL_VERSIONS" == "true" ]]; then
|
|
VERSIONS_TO_BUILD=("${PG_VERSIONS[@]}")
|
|
else
|
|
VERSIONS_TO_BUILD=("$DEFAULT_PG_VERSION")
|
|
fi
|
|
|
|
# Get script and project directories
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
|
|
|
|
log_info "=== RuVector-Postgres Docker Hub Publication ==="
|
|
log_info "Version: ${VERSION}"
|
|
log_info "Registry: ${DOCKER_REGISTRY}/${IMAGE_NAME}"
|
|
log_info "PostgreSQL versions: ${VERSIONS_TO_BUILD[*]}"
|
|
log_info "Dry run: ${DRY_RUN}"
|
|
|
|
# Verify Docker is available
|
|
if ! command -v docker &> /dev/null; then
|
|
log_error "Docker is not installed"
|
|
exit 1
|
|
fi
|
|
|
|
# Check Docker buildx for multi-arch support
|
|
if ! docker buildx version &> /dev/null; then
|
|
log_warn "Docker buildx not available, multi-arch builds disabled"
|
|
MULTI_ARCH=false
|
|
else
|
|
log_info "Docker buildx available for multi-arch builds"
|
|
MULTI_ARCH=true
|
|
fi
|
|
|
|
# Login check (skip for dry run)
|
|
if [[ "$DRY_RUN" == "false" ]]; then
|
|
if ! docker info 2>/dev/null | grep -q "Username"; then
|
|
log_warn "Not logged into Docker Hub. Please run: docker login"
|
|
log_warn "Continuing with build only..."
|
|
DRY_RUN=true
|
|
fi
|
|
fi
|
|
|
|
# Create buildx builder if needed
|
|
if [[ "$MULTI_ARCH" == "true" ]]; then
|
|
BUILDER_NAME="ruvector-builder"
|
|
if ! docker buildx inspect "$BUILDER_NAME" &> /dev/null; then
|
|
log_info "Creating buildx builder: ${BUILDER_NAME}"
|
|
docker buildx create --name "$BUILDER_NAME" --driver docker-container --bootstrap
|
|
fi
|
|
docker buildx use "$BUILDER_NAME"
|
|
fi
|
|
|
|
# Build function
|
|
build_image() {
|
|
local pg_version=$1
|
|
local tags=()
|
|
|
|
# Version tags
|
|
tags+=("${DOCKER_REGISTRY}/${IMAGE_NAME}:${VERSION}-pg${pg_version}")
|
|
tags+=("${DOCKER_REGISTRY}/${IMAGE_NAME}:v${VERSION}-pg${pg_version}")
|
|
tags+=("${DOCKER_REGISTRY}/${IMAGE_NAME}:pg${pg_version}")
|
|
|
|
# Latest tag for default PG version
|
|
if [[ "$pg_version" == "$DEFAULT_PG_VERSION" && "$PUSH_LATEST" == "true" ]]; then
|
|
tags+=("${DOCKER_REGISTRY}/${IMAGE_NAME}:latest")
|
|
tags+=("${DOCKER_REGISTRY}/${IMAGE_NAME}:${VERSION}")
|
|
tags+=("${DOCKER_REGISTRY}/${IMAGE_NAME}:v${VERSION}")
|
|
fi
|
|
|
|
log_info "Building image for PostgreSQL ${pg_version}..."
|
|
log_info "Tags: ${tags[*]}"
|
|
|
|
# Build tag arguments
|
|
local tag_args=""
|
|
for tag in "${tags[@]}"; do
|
|
tag_args+=" -t ${tag}"
|
|
done
|
|
|
|
cd "$PROJECT_ROOT"
|
|
|
|
if [[ "$MULTI_ARCH" == "true" ]]; then
|
|
# Multi-arch build (amd64 + arm64)
|
|
local push_flag=""
|
|
if [[ "$DRY_RUN" == "false" ]]; then
|
|
push_flag="--push"
|
|
else
|
|
push_flag="--load"
|
|
fi
|
|
|
|
docker buildx build \
|
|
--platform linux/amd64,linux/arm64 \
|
|
-f crates/ruvector-postgres/docker/Dockerfile \
|
|
--build-arg PG_VERSION="${pg_version}" \
|
|
--build-arg RUST_VERSION="${RUST_VERSION}" \
|
|
${tag_args} \
|
|
${push_flag} \
|
|
.
|
|
else
|
|
# Single-arch build
|
|
docker build \
|
|
-f crates/ruvector-postgres/docker/Dockerfile \
|
|
--build-arg PG_VERSION="${pg_version}" \
|
|
--build-arg RUST_VERSION="${RUST_VERSION}" \
|
|
${tag_args} \
|
|
.
|
|
|
|
# Push if not dry run
|
|
if [[ "$DRY_RUN" == "false" ]]; then
|
|
for tag in "${tags[@]}"; do
|
|
docker push "$tag"
|
|
done
|
|
fi
|
|
fi
|
|
|
|
log_success "Built image for PostgreSQL ${pg_version}"
|
|
}
|
|
|
|
# Build all requested versions
|
|
for pg_ver in "${VERSIONS_TO_BUILD[@]}"; do
|
|
build_image "$pg_ver"
|
|
done
|
|
|
|
# Summary
|
|
echo ""
|
|
log_success "=== Publication Complete ==="
|
|
log_info "Images built:"
|
|
for pg_ver in "${VERSIONS_TO_BUILD[@]}"; do
|
|
echo " - ${DOCKER_REGISTRY}/${IMAGE_NAME}:${VERSION}-pg${pg_ver}"
|
|
done
|
|
|
|
if [[ "$DRY_RUN" == "true" ]]; then
|
|
log_warn "Dry run mode - images were NOT pushed to Docker Hub"
|
|
log_info "To push, run without --dry-run flag"
|
|
else
|
|
log_success "Images pushed to Docker Hub!"
|
|
log_info "Pull with: docker pull ${DOCKER_REGISTRY}/${IMAGE_NAME}:${VERSION}"
|
|
fi
|
|
|
|
# Print usage examples
|
|
echo ""
|
|
log_info "=== Usage Examples ==="
|
|
echo " docker pull ${DOCKER_REGISTRY}/${IMAGE_NAME}:latest"
|
|
echo " docker pull ${DOCKER_REGISTRY}/${IMAGE_NAME}:${VERSION}"
|
|
echo " docker pull ${DOCKER_REGISTRY}/${IMAGE_NAME}:${VERSION}-pg17"
|
|
echo " docker pull ${DOCKER_REGISTRY}/${IMAGE_NAME}:pg16"
|
|
echo ""
|
|
echo " docker run -d -p 5432:5432 ${DOCKER_REGISTRY}/${IMAGE_NAME}:latest"
|