Files
nuzlocke-tracker/deploy.sh

82 lines
3.2 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
set -euo pipefail
# ── Configuration ──────────────────────────────────────────────
REGISTRY="gitea.nerdboden.de"
OWNER="thefurya"
IMAGES=("nuzlocke-tracker-api" "nuzlocke-tracker-frontend")
DOCKERFILES=("backend/Dockerfile.prod" "frontend/Dockerfile.prod")
CONTEXTS=("./backend" "./frontend")
PORTAINER_URL="${PORTAINER_URL:-https://portainer.nerdboden.de}"
PORTAINER_API_KEY="${PORTAINER_API_KEY:-}"
PORTAINER_STACK_ID="${PORTAINER_STACK_ID:-}"
PORTAINER_ENDPOINT_ID="${PORTAINER_ENDPOINT_ID:-1}"
# ── Helpers ────────────────────────────────────────────────────
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
info() { echo -e "${GREEN}[✓]${NC} $1"; }
warn() { echo -e "${YELLOW}[!]${NC} $1"; }
error() { echo -e "${RED}[✗]${NC} $1"; exit 1; }
# ── Preflight checks ──────────────────────────────────────────
BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [[ "$BRANCH" != "main" ]]; then
warn "You are on branch '$BRANCH', not 'main'."
read -rp "Continue anyway? [y/N] " confirm
[[ "$confirm" =~ ^[Yy]$ ]] || exit 0
fi
if ! git diff --quiet || ! git diff --cached --quiet; then
warn "You have uncommitted changes."
read -rp "Continue anyway? [y/N] " confirm
[[ "$confirm" =~ ^[Yy]$ ]] || exit 0
fi
# ── Build and push images ─────────────────────────────────────
for i in "${!IMAGES[@]}"; do
IMAGE="${REGISTRY}/${OWNER}/${IMAGES[$i]}:latest"
info "Building ${IMAGES[$i]}..."
docker build -t "$IMAGE" -f "${DOCKERFILES[$i]}" "${CONTEXTS[$i]}"
info "Pushing ${IMAGES[$i]}..."
docker push "$IMAGE"
done
info "All images built and pushed."
# ── Trigger Portainer redeployment ─────────────────────────────
if [[ -z "$PORTAINER_API_KEY" ]]; then
warn "PORTAINER_API_KEY not set — skipping Portainer redeployment."
warn "Set it in your environment or .env.deploy file to enable auto-redeploy."
exit 0
fi
if [[ -z "$PORTAINER_STACK_ID" ]]; then
warn "PORTAINER_STACK_ID not set — skipping Portainer redeployment."
warn "Find your stack ID in Portainer and set it in your environment."
exit 0
fi
info "Fetching stack file from Portainer..."
STACK_FILE=$(curl -sf \
-H "X-API-Key: ${PORTAINER_API_KEY}" \
"${PORTAINER_URL}/api/stacks/${PORTAINER_STACK_ID}/file") \
|| error "Failed to fetch stack file from Portainer."
STACK_CONTENT=$(echo "$STACK_FILE" | jq -r '.StackFileContent')
info "Triggering stack redeployment..."
curl -sf -X PUT \
-H "X-API-Key: ${PORTAINER_API_KEY}" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg content "$STACK_CONTENT" '{"pullImage": true, "stackFileContent": $content}')" \
"${PORTAINER_URL}/api/stacks/${PORTAINER_STACK_ID}?endpointId=${PORTAINER_ENDPOINT_ID}" \
> /dev/null \
|| error "Failed to trigger Portainer redeployment."
info "Stack redeployment triggered successfully!"