|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +# Script to build and push SysBio Portal to GCP Artifact Registry |
| 4 | +# Usage: ./scripts/push-to-gcp.sh [options] |
| 5 | +# |
| 6 | +# Options: |
| 7 | +# --version VERSION Image version tag (default: latest) |
| 8 | +# --project PROJECT GCP Project ID (overrides env var) |
| 9 | +# --region REGION GCP Region (default: us-central1) |
| 10 | +# --repo REPO Artifact Registry repository name (default: portal) |
| 11 | +# --service SERVICE Cloud Run service name (default: sysbio-portal) |
| 12 | +# --deploy Also redeploy the Cloud Run service after pushing |
| 13 | +# --help Show this help message |
| 14 | +# |
| 15 | +# Environment variables (can be set in .env file): |
| 16 | +# GCP_PROJECT_ID GCP Project ID |
| 17 | +# GCP_REGION GCP Region (default: us-central1) |
| 18 | +# GCP_REPOSITORY Artifact Registry repository name (default: portal) |
| 19 | +# GCP_CLOUD_RUN_SERVICE Cloud Run service name (default: sysbio-portal) |
| 20 | +# GCP_SERVICE_ACCOUNT_KEY Path to service account key file (optional) |
| 21 | + |
| 22 | +set -e |
| 23 | + |
| 24 | +# Script directory |
| 25 | +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| 26 | +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" |
| 27 | + |
| 28 | +# Load environment variables from .env if it exists |
| 29 | +if [ -f "$PROJECT_ROOT/.env" ]; then |
| 30 | + echo "📄 Loading environment variables from .env..." |
| 31 | + export $(grep -v '^#' "$PROJECT_ROOT/.env" | grep -v '^$' | xargs) |
| 32 | +fi |
| 33 | + |
| 34 | +# Default configuration |
| 35 | +VERSION="latest" |
| 36 | +PROJECT_ID="${GCP_PROJECT_ID:-}" |
| 37 | +REGION="${GCP_REGION:-us-central1}" |
| 38 | +REPOSITORY="${GCP_REPOSITORY:-portal}" |
| 39 | +CLOUD_RUN_SERVICE="${GCP_CLOUD_RUN_SERVICE:-sysbio-portal}" |
| 40 | +SERVICE_ACCOUNT_KEY="${GCP_SERVICE_ACCOUNT_KEY:-}" |
| 41 | +IMAGE_NAME="sysbio-portal" |
| 42 | +DEPLOY=false |
| 43 | + |
| 44 | +# Parse command line arguments |
| 45 | +while [[ $# -gt 0 ]]; do |
| 46 | + case $1 in |
| 47 | + --version) |
| 48 | + VERSION="$2" |
| 49 | + shift 2 |
| 50 | + ;; |
| 51 | + --project) |
| 52 | + PROJECT_ID="$2" |
| 53 | + shift 2 |
| 54 | + ;; |
| 55 | + --region) |
| 56 | + REGION="$2" |
| 57 | + shift 2 |
| 58 | + ;; |
| 59 | + --repo) |
| 60 | + REPOSITORY="$2" |
| 61 | + shift 2 |
| 62 | + ;; |
| 63 | + --service) |
| 64 | + CLOUD_RUN_SERVICE="$2" |
| 65 | + shift 2 |
| 66 | + ;; |
| 67 | + --deploy) |
| 68 | + DEPLOY=true |
| 69 | + shift |
| 70 | + ;; |
| 71 | + --help) |
| 72 | + head -22 "$0" | tail -19 |
| 73 | + exit 0 |
| 74 | + ;; |
| 75 | + *) |
| 76 | + echo "Unknown option: $1" |
| 77 | + echo "Use --help for usage information" |
| 78 | + exit 1 |
| 79 | + ;; |
| 80 | + esac |
| 81 | +done |
| 82 | + |
| 83 | +# Validate required configuration |
| 84 | +if [ -z "$PROJECT_ID" ]; then |
| 85 | + echo "❌ Error: GCP Project ID is required." |
| 86 | + echo "" |
| 87 | + echo "Please provide it via one of the following methods:" |
| 88 | + echo " 1. Command line: ./scripts/push-to-gcp.sh --project YOUR_PROJECT_ID" |
| 89 | + echo " 2. Environment variable: export GCP_PROJECT_ID=YOUR_PROJECT_ID" |
| 90 | + echo " 3. .env file: GCP_PROJECT_ID=YOUR_PROJECT_ID" |
| 91 | + echo "" |
| 92 | + echo "Common project IDs:" |
| 93 | + echo " - sysbio-tools-staging" |
| 94 | + echo " - dti-diver-development" |
| 95 | + exit 1 |
| 96 | +fi |
| 97 | + |
| 98 | +# Full image path |
| 99 | +IMAGE_PATH="${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY}/${IMAGE_NAME}" |
| 100 | + |
| 101 | +# Build timestamp |
| 102 | +BUILD_TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%S.000Z") |
| 103 | + |
| 104 | +echo "================================================" |
| 105 | +echo "SysBio Portal GCP Deployment" |
| 106 | +echo "================================================" |
| 107 | +echo "Project: ${PROJECT_ID}" |
| 108 | +echo "Region: ${REGION}" |
| 109 | +echo "Repository: ${REPOSITORY}" |
| 110 | +echo "Image: ${IMAGE_NAME}" |
| 111 | +echo "Version: ${VERSION}" |
| 112 | +echo "Timestamp: ${BUILD_TIMESTAMP}" |
| 113 | +echo "Deploy: ${DEPLOY}" |
| 114 | +echo "================================================" |
| 115 | +echo "" |
| 116 | + |
| 117 | +# Authenticate with GCP |
| 118 | +echo "🔐 Configuring Docker authentication..." |
| 119 | +if [ -n "$SERVICE_ACCOUNT_KEY" ] && [ -f "$SERVICE_ACCOUNT_KEY" ]; then |
| 120 | + echo " Using service account key: ${SERVICE_ACCOUNT_KEY}" |
| 121 | + gcloud auth activate-service-account --key-file="${SERVICE_ACCOUNT_KEY}" |
| 122 | + gcloud auth configure-docker ${REGION}-docker.pkg.dev --quiet |
| 123 | +else |
| 124 | + echo " Using gcloud CLI authentication (your current active account)" |
| 125 | + echo " Run 'gcloud auth list' to see active accounts" |
| 126 | + echo " Run 'gcloud config set account YOUR_EMAIL' to switch accounts" |
| 127 | + gcloud auth configure-docker ${REGION}-docker.pkg.dev --quiet |
| 128 | +fi |
| 129 | +echo " ℹ️ Note: Not changing your default GCP project. Using ${PROJECT_ID} for this deployment only." |
| 130 | +echo "" |
| 131 | + |
| 132 | +# Build the image |
| 133 | +echo "🏗️ Building Docker image for linux/amd64..." |
| 134 | +docker build --platform linux/amd64 \ |
| 135 | + --build-arg BUILD_TIMESTAMP="${BUILD_TIMESTAMP}" \ |
| 136 | + -t ${IMAGE_NAME}:${VERSION} \ |
| 137 | + "$PROJECT_ROOT" |
| 138 | + |
| 139 | +# Tag for GCP |
| 140 | +echo "" |
| 141 | +echo "🏷️ Tagging image for GCP Artifact Registry..." |
| 142 | +docker tag ${IMAGE_NAME}:${VERSION} ${IMAGE_PATH}:${VERSION} |
| 143 | + |
| 144 | +if [ "$VERSION" != "latest" ]; then |
| 145 | + echo "🏷️ Also tagging as latest..." |
| 146 | + docker tag ${IMAGE_NAME}:${VERSION} ${IMAGE_PATH}:latest |
| 147 | +fi |
| 148 | + |
| 149 | +# Push to GCP |
| 150 | +echo "" |
| 151 | +echo "📤 Pushing to GCP Artifact Registry..." |
| 152 | +docker push ${IMAGE_PATH}:${VERSION} |
| 153 | + |
| 154 | +if [ "$VERSION" != "latest" ]; then |
| 155 | + docker push ${IMAGE_PATH}:latest |
| 156 | +fi |
| 157 | + |
| 158 | +echo "" |
| 159 | +echo "✅ Successfully pushed to GCP Artifact Registry!" |
| 160 | +echo " Image URL: ${IMAGE_PATH}:${VERSION}" |
| 161 | + |
| 162 | +# Optionally redeploy Cloud Run service |
| 163 | +if [ "$DEPLOY" = true ]; then |
| 164 | + echo "" |
| 165 | + echo "🚀 Redeploying Cloud Run service '${CLOUD_RUN_SERVICE}'..." |
| 166 | + gcloud run services update ${CLOUD_RUN_SERVICE} \ |
| 167 | + --image ${IMAGE_PATH}:${VERSION} \ |
| 168 | + --region ${REGION} \ |
| 169 | + --project ${PROJECT_ID} |
| 170 | + |
| 171 | + echo "" |
| 172 | + echo "✅ Cloud Run service '${CLOUD_RUN_SERVICE}' redeployed!" |
| 173 | +fi |
| 174 | + |
| 175 | +echo "" |
| 176 | +echo "================================================" |
| 177 | +echo "✅ Deployment Complete!" |
| 178 | +echo "================================================" |
| 179 | +echo "" |
| 180 | +echo "Image pushed: ${IMAGE_PATH}:${VERSION}" |
| 181 | +echo "" |
| 182 | + |
| 183 | +if [ "$DEPLOY" = false ]; then |
| 184 | + echo "To update the Cloud Run service, either:" |
| 185 | + echo "" |
| 186 | + echo "1. Re-run with --deploy flag:" |
| 187 | + echo " ./scripts/push-to-gcp.sh --deploy" |
| 188 | + echo "" |
| 189 | + echo "2. Use the Cloud Console:" |
| 190 | + echo " https://console.cloud.google.com/run?project=${PROJECT_ID}" |
| 191 | + echo "" |
| 192 | + echo "3. Or deploy via CLI:" |
| 193 | + echo " gcloud run deploy ${CLOUD_RUN_SERVICE} \\" |
| 194 | + echo " --image ${IMAGE_PATH}:${VERSION} \\" |
| 195 | + echo " --platform managed \\" |
| 196 | + echo " --region ${REGION} \\" |
| 197 | + echo " --project ${PROJECT_ID}" |
| 198 | + echo "" |
| 199 | +fi |
0 commit comments