mirror of
https://github.com/aliasvault/aliasvault.git
synced 2026-02-01 09:53:05 -05:00
Create local-docker-build-push.sh (#1531)
This commit is contained in:
committed by
Leendert de Borst
parent
adae6ebe2f
commit
66e8dbfb27
182
scripts/local-docker-build-push.sh
Executable file
182
scripts/local-docker-build-push.sh
Executable file
@@ -0,0 +1,182 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# =============================================================================
|
||||
# Local Docker Release Script
|
||||
# =============================================================================
|
||||
# Build and push Docker images locally instead of waiting for GitHub Actions.
|
||||
# Useful when CI is slow (Rust compile step) or failing.
|
||||
#
|
||||
# Prerequisites:
|
||||
# - Docker with buildx: docker buildx create --use (if not already set up)
|
||||
# - GHCR login: echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin
|
||||
# - Docker Hub login: docker login (for all-in-one image)
|
||||
#
|
||||
# Usage:
|
||||
# ./scripts/local-release.sh [options]
|
||||
#
|
||||
# Options:
|
||||
# --version VERSION Version to release (e.g., 0.26.0). Auto-detected if not specified.
|
||||
# --multi Build and push multi-container images (postgres, api, client, etc.)
|
||||
# --aio Build and push all-in-one image
|
||||
# --all Build all Docker images
|
||||
# --dry-run Show what would be done without executing
|
||||
# --skip-push Build but don't push (loads to local Docker instead)
|
||||
# --amd64-only Build for amd64 only (faster, useful for testing)
|
||||
# =============================================================================
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Defaults
|
||||
VERSION=""
|
||||
BUILD_MULTI=false
|
||||
BUILD_AIO=false
|
||||
DRY_RUN=false
|
||||
SKIP_PUSH=false
|
||||
AMD64_ONLY=false
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--version) VERSION="$2"; shift 2 ;;
|
||||
--multi) BUILD_MULTI=true; shift ;;
|
||||
--aio) BUILD_AIO=true; shift ;;
|
||||
--all) BUILD_MULTI=true; BUILD_AIO=true; shift ;;
|
||||
--dry-run) DRY_RUN=true; shift ;;
|
||||
--skip-push) SKIP_PUSH=true; shift ;;
|
||||
--amd64-only) AMD64_ONLY=true; shift ;;
|
||||
-h|--help) head -28 "$0" | tail -25; exit 0 ;;
|
||||
*) echo -e "${RED}Unknown option: $1${NC}"; exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ "$BUILD_MULTI" == "false" && "$BUILD_AIO" == "false" ]]; then
|
||||
echo "Usage: ./scripts/local-release.sh [--multi] [--aio] [--all] [options]"
|
||||
echo ""
|
||||
echo "Examples:"
|
||||
echo " ./scripts/local-release.sh --aio # Build & push all-in-one"
|
||||
echo " ./scripts/local-release.sh --multi # Build & push multi-container"
|
||||
echo " ./scripts/local-release.sh --all # Build everything"
|
||||
echo " ./scripts/local-release.sh --aio --dry-run # Preview commands"
|
||||
echo " ./scripts/local-release.sh --aio --skip-push # Build locally only"
|
||||
echo " ./scripts/local-release.sh --aio --amd64-only # Faster single-platform build"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Auto-detect version
|
||||
if [[ -z "$VERSION" ]]; then
|
||||
VERSION=$(node -p "require('$ROOT_DIR/apps/browser-extension/package.json').version")
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}======================================${NC}"
|
||||
echo -e "${GREEN}AliasVault Docker Release - v$VERSION${NC}"
|
||||
echo -e "${GREEN}======================================${NC}"
|
||||
echo ""
|
||||
|
||||
[[ "$DRY_RUN" == "true" ]] && echo -e "${YELLOW}DRY RUN MODE${NC}" && echo ""
|
||||
|
||||
# Platform selection
|
||||
if [[ "$AMD64_ONLY" == "true" ]]; then
|
||||
PLATFORMS="linux/amd64"
|
||||
else
|
||||
PLATFORMS="linux/amd64,linux/arm64"
|
||||
fi
|
||||
|
||||
run_cmd() {
|
||||
if [[ "$DRY_RUN" == "true" ]]; then
|
||||
echo -e "${BLUE}[DRY RUN]${NC} $*"
|
||||
else
|
||||
echo -e "${GREEN}$${NC} $*"
|
||||
eval "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
build_multi() {
|
||||
echo -e "${GREEN}Building Multi-Container Images${NC}"
|
||||
echo ""
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
local images=(
|
||||
"postgres:apps/server/Databases/AliasServerDb/Dockerfile"
|
||||
"api:apps/server/AliasVault.Api/Dockerfile"
|
||||
"client:apps/server/AliasVault.Client/Dockerfile"
|
||||
"admin:apps/server/AliasVault.Admin/Dockerfile"
|
||||
"reverse-proxy:apps/server/Dockerfile"
|
||||
"smtp:apps/server/Services/AliasVault.SmtpService/Dockerfile"
|
||||
"task-runner:apps/server/Services/AliasVault.TaskRunner/Dockerfile"
|
||||
"installcli:apps/server/Utilities/AliasVault.InstallCli/Dockerfile"
|
||||
)
|
||||
|
||||
local push_flag=""
|
||||
if [[ "$SKIP_PUSH" == "false" ]]; then
|
||||
push_flag="--push"
|
||||
fi
|
||||
# Without --push, buildx builds but doesn't output anywhere (validates the build)
|
||||
|
||||
for item in "${images[@]}"; do
|
||||
local name="${item%%:*}"
|
||||
local dockerfile="${item#*:}"
|
||||
|
||||
echo -e "${BLUE}→ ghcr.io/aliasvault/$name:$VERSION${NC}"
|
||||
|
||||
run_cmd "docker buildx build \\
|
||||
--platform $PLATFORMS \\
|
||||
-f $dockerfile \\
|
||||
-t ghcr.io/aliasvault/$name:$VERSION \\
|
||||
-t ghcr.io/aliasvault/$name:latest \\
|
||||
$push_flag \\
|
||||
."
|
||||
echo ""
|
||||
done
|
||||
}
|
||||
|
||||
build_aio() {
|
||||
echo -e "${GREEN}Building All-in-One Image${NC}"
|
||||
echo ""
|
||||
cd "$ROOT_DIR"
|
||||
|
||||
local push_flag=""
|
||||
if [[ "$SKIP_PUSH" == "false" ]]; then
|
||||
push_flag="--push"
|
||||
fi
|
||||
# Without --push, buildx builds but doesn't output anywhere (validates the build)
|
||||
|
||||
echo -e "${BLUE}→ aliasvault/aliasvault:$VERSION${NC}"
|
||||
|
||||
run_cmd "docker buildx build \\
|
||||
--platform $PLATFORMS \\
|
||||
-f dockerfiles/all-in-one/Dockerfile \\
|
||||
-t ghcr.io/aliasvault/aliasvault:$VERSION \\
|
||||
-t ghcr.io/aliasvault/aliasvault:latest \\
|
||||
-t aliasvault/aliasvault:$VERSION \\
|
||||
-t aliasvault/aliasvault:latest \\
|
||||
$push_flag \\
|
||||
."
|
||||
}
|
||||
|
||||
# Check Docker
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo -e "${RED}Docker not found${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Ensure buildx is available
|
||||
if ! docker buildx version &> /dev/null; then
|
||||
echo -e "${RED}Docker buildx not available. Run: docker buildx create --use${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[[ "$BUILD_MULTI" == "true" ]] && build_multi
|
||||
[[ "$BUILD_AIO" == "true" ]] && build_aio
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}Done!${NC}"
|
||||
[[ "$DRY_RUN" == "true" ]] && echo -e "${YELLOW}(dry run - no changes made)${NC}"
|
||||
[[ "$SKIP_PUSH" == "true" ]] && echo -e "${YELLOW}(skip-push - built locally only)${NC}"
|
||||
Reference in New Issue
Block a user