towerops/bin/deploy

66 lines
1.8 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")/.."
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log() { echo -e "${GREEN}==> $1${NC}"; }
warn() { echo -e "${YELLOW}==> $1${NC}"; }
die() { echo -e "${RED}ERROR: $1${NC}" >&2; exit 1; }
# Ensure we're in a clean state
log "Checking working tree..."
if [ -n "$(git status --porcelain)" ]; then
die "Working tree is dirty. Commit or stash changes first."
fi
# Pull latest from both branches
log "Pulling latest from origin..."
git fetch origin
# Sync production image changes into main
log "Checking for CI image updates on production..."
git checkout production
git pull origin production
IMAGE_COMMITS=$(git log main..production --oneline --grep="update production image" | wc -l | tr -d ' ')
if [ "$IMAGE_COMMITS" -gt "0" ]; then
log "Found $IMAGE_COMMITS image update(s) on production, merging into main..."
git checkout main
git merge production --no-edit
else
git checkout main
fi
git pull origin main
# Run all tests
log "Running precommit checks (compile + format + tests)..."
if ! mix precommit; then
die "Precommit checks failed. Fix issues before deploying."
fi
# Push main (triggers staging deploy via Dokku)
log "Pushing to main (staging)..."
git push origin main
# Merge main into production and push (triggers CI pipeline)
log "Merging main into production..."
git checkout production
git merge main --no-edit
git push origin production
# Switch back to main
git checkout main
log "Deploy triggered."
echo ""
echo " Staging: pushed to main (Dokku auto-deploys)"
echo " Production: pushed to production (CI runs tests, builds image, ArgoCD applies)"
echo ""
echo " Monitor CI: https://git.mcintire.me/graham/towerops-web/actions"
echo " Monitor k8s: kubectl rollout status deployment/towerops -n towerops"