|
|
|
|
@ -1,44 +1,50 @@
|
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
# Script de deploy para Google Cloud Run com Artifact Registry
|
|
|
|
|
# Uso: ./deploy.sh
|
|
|
|
|
# Pré-requisitos:
|
|
|
|
|
# - gcloud CLI autenticado e com projeto principal setado
|
|
|
|
|
# - Artifact Registry Repository já criado (orquestrador)
|
|
|
|
|
# - Service Account com roles: Cloud SQL Client, Cloud Run Developer, Artifact Registry Writer
|
|
|
|
|
# Deploy script for Google Cloud Run + Artifact Registry
|
|
|
|
|
# Usage: ./deploy.sh
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
ENV_FILE="${ENV_FILE:-.env.prod}"
|
|
|
|
|
if [ ! -f "${ENV_FILE}" ] && [ -f ".env" ]; then
|
|
|
|
|
ENV_FILE=".env"
|
|
|
|
|
fi
|
|
|
|
|
if [ ! -f "${ENV_FILE}" ]; then
|
|
|
|
|
echo "ERROR: env file not found. Expected ${ENV_FILE} (or .env)."
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
get_env_value() {
|
|
|
|
|
local key="$1"
|
|
|
|
|
grep -E "^${key}=" "${ENV_FILE}" | tail -n 1 | cut -d'=' -f2- | tr -d '\r'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Detectar configuração do gcloud
|
|
|
|
|
PROJECT_ID=$(gcloud config get-value project)
|
|
|
|
|
REGION="us-central1"
|
|
|
|
|
SERVICE_NAME="orquestrador"
|
|
|
|
|
REPO_NAME="orquestrador"
|
|
|
|
|
IMAGE_NAME="$REGION-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/$SERVICE_NAME"
|
|
|
|
|
IMAGE_NAME="${REGION}-docker.pkg.dev/${PROJECT_ID}/${REPO_NAME}/${SERVICE_NAME}"
|
|
|
|
|
|
|
|
|
|
if [ -z "$PROJECT_ID" ]; then
|
|
|
|
|
echo "❌ Projeto não configurado. Execute: gcloud config set project <seu-projeto>"
|
|
|
|
|
if [ -z "${PROJECT_ID}" ]; then
|
|
|
|
|
echo "ERROR: gcloud project is not configured."
|
|
|
|
|
echo "Run: gcloud config set project <your-project-id>"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "🚀 Iniciando deploy para Google Cloud Run"
|
|
|
|
|
echo "📦 Projeto: $PROJECT_ID"
|
|
|
|
|
echo "🌍 Região: $REGION"
|
|
|
|
|
echo "🏗️ Repositório: $REPO_NAME"
|
|
|
|
|
echo "Starting deploy to Cloud Run"
|
|
|
|
|
echo "Project: ${PROJECT_ID}"
|
|
|
|
|
echo "Region: ${REGION}"
|
|
|
|
|
echo "Env file: ${ENV_FILE}"
|
|
|
|
|
|
|
|
|
|
# Passo 1: Validar autenticação
|
|
|
|
|
echo ""
|
|
|
|
|
echo "1️⃣ Verificando autenticação GCP..."
|
|
|
|
|
echo "1) Checking auth..."
|
|
|
|
|
ACTIVE_ACCOUNT=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")
|
|
|
|
|
if [ -z "$ACTIVE_ACCOUNT" ]; then
|
|
|
|
|
echo "❌ Nenhuma conta autenticada. Execute: gcloud auth login"
|
|
|
|
|
if [ -z "${ACTIVE_ACCOUNT}" ]; then
|
|
|
|
|
echo "ERROR: no active gcloud account. Run: gcloud auth login"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
echo "✅ Autenticado como: $ACTIVE_ACCOUNT"
|
|
|
|
|
echo "Authenticated as: ${ACTIVE_ACCOUNT}"
|
|
|
|
|
|
|
|
|
|
# Passo 2: Habilitar APIs
|
|
|
|
|
echo ""
|
|
|
|
|
echo "2️⃣ Habilitando APIs necessárias..."
|
|
|
|
|
echo "2) Enabling required APIs..."
|
|
|
|
|
gcloud services enable \
|
|
|
|
|
run.googleapis.com \
|
|
|
|
|
cloudbuild.googleapis.com \
|
|
|
|
|
@ -46,78 +52,60 @@ gcloud services enable \
|
|
|
|
|
aiplatform.googleapis.com \
|
|
|
|
|
sqladmin.googleapis.com \
|
|
|
|
|
--quiet
|
|
|
|
|
echo "✅ APIs habilitadas"
|
|
|
|
|
|
|
|
|
|
# Passo 3: Build com Cloud Build
|
|
|
|
|
echo ""
|
|
|
|
|
echo "3️⃣ Fazendo build da imagem Docker com Cloud Build..."
|
|
|
|
|
echo "3) Building image with Cloud Build..."
|
|
|
|
|
gcloud builds submit \
|
|
|
|
|
--config=cloudbuild.yaml \
|
|
|
|
|
--substitutions=_REGION="$REGION",_REPO_NAME="$REPO_NAME",_IMAGE_NAME="$SERVICE_NAME"
|
|
|
|
|
echo "✅ Build concluído"
|
|
|
|
|
--substitutions=_REGION="${REGION}",_REPO_NAME="${REPO_NAME}",_IMAGE_NAME="${SERVICE_NAME}"
|
|
|
|
|
|
|
|
|
|
# Passo 4: Deploy para Cloud Run com variáveis de ambiente
|
|
|
|
|
echo ""
|
|
|
|
|
echo "4️⃣ Realizando deploy para Cloud Run com variáveis de ambiente..."
|
|
|
|
|
echo "4) Deploying to Cloud Run..."
|
|
|
|
|
|
|
|
|
|
# Ler variáveis do .env (excluindo comentários e linhas vazias, e tratando espaços/caracteres especiais)
|
|
|
|
|
ENV_VARS=""
|
|
|
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
|
|
|
|
# Ignorar linhas vazias e comentários
|
|
|
|
|
[[ "$line" =~ ^[[:space:]]*# ]] && continue
|
|
|
|
|
[[ -z "${line// }" ]] && continue
|
|
|
|
|
|
|
|
|
|
# Adicionar à string de variáveis (key=value) e remover \r (quebras de linha Windows)
|
|
|
|
|
if [[ "$line" == *"="* ]]; then
|
|
|
|
|
# Limpar caracteres de retorno de carro (\r) para evitar erros no Linux
|
|
|
|
|
clean_line=$(echo "$line" | tr -d '\r')
|
|
|
|
|
ENV_VARS="$ENV_VARS$clean_line,"
|
|
|
|
|
ENV_VARS="${ENV_VARS}${clean_line},"
|
|
|
|
|
fi
|
|
|
|
|
done < .env
|
|
|
|
|
|
|
|
|
|
# Remover última vírgula
|
|
|
|
|
done < "${ENV_FILE}"
|
|
|
|
|
ENV_VARS="${ENV_VARS%,}"
|
|
|
|
|
|
|
|
|
|
if [ -z "$ENV_VARS" ]; then
|
|
|
|
|
echo "⚠️ Nenhuma variável de ambiente encontrada em .env"
|
|
|
|
|
# Deploy sem variáveis (pode falhar se a app exigir)
|
|
|
|
|
gcloud run deploy "$SERVICE_NAME" \
|
|
|
|
|
--image="$IMAGE_NAME:latest" \
|
|
|
|
|
--region="$REGION" \
|
|
|
|
|
--platform=managed \
|
|
|
|
|
--allow-unauthenticated
|
|
|
|
|
CLOUD_SQL_CONN=$(get_env_value "CLOUD_SQL_CONNECTION_NAME")
|
|
|
|
|
RUN_VPC_CONN=$(get_env_value "RUN_VPC_CONNECTOR")
|
|
|
|
|
RUN_VPC_EGRESS=$(get_env_value "RUN_VPC_EGRESS")
|
|
|
|
|
|
|
|
|
|
DEPLOY_ARGS=(
|
|
|
|
|
--image="${IMAGE_NAME}:latest"
|
|
|
|
|
--region="${REGION}"
|
|
|
|
|
--platform=managed
|
|
|
|
|
--memory=512Mi
|
|
|
|
|
--cpu=1
|
|
|
|
|
--timeout=3600
|
|
|
|
|
--max-instances=10
|
|
|
|
|
--allow-unauthenticated
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if [ -n "${ENV_VARS}" ]; then
|
|
|
|
|
DEPLOY_ARGS+=(--set-env-vars="${ENV_VARS}")
|
|
|
|
|
else
|
|
|
|
|
# Deploy com as variáveis coletadas
|
|
|
|
|
gcloud run deploy "$SERVICE_NAME" \
|
|
|
|
|
--image="$IMAGE_NAME:latest" \
|
|
|
|
|
--region="$REGION" \
|
|
|
|
|
--platform=managed \
|
|
|
|
|
--set-env-vars="$ENV_VARS" \
|
|
|
|
|
--memory=512Mi \
|
|
|
|
|
--cpu=1 \
|
|
|
|
|
--timeout=3600 \
|
|
|
|
|
--max-instances=10 \
|
|
|
|
|
--allow-unauthenticated
|
|
|
|
|
echo "WARN: no env vars found in ${ENV_FILE}"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ -n "${CLOUD_SQL_CONN}" ]; then
|
|
|
|
|
DEPLOY_ARGS+=(--add-cloudsql-instances="${CLOUD_SQL_CONN}")
|
|
|
|
|
echo "Cloud SQL socket enabled: ${CLOUD_SQL_CONN}"
|
|
|
|
|
fi
|
|
|
|
|
echo "✅ Deploy concluído com variáveis de ambiente"
|
|
|
|
|
|
|
|
|
|
# Passo 5: Sucesso
|
|
|
|
|
echo ""
|
|
|
|
|
echo "================================"
|
|
|
|
|
echo "✅ PROCESSO FINALIZADO!"
|
|
|
|
|
echo "================================"
|
|
|
|
|
echo ""
|
|
|
|
|
echo "📋 Próximos passos:"
|
|
|
|
|
echo ""
|
|
|
|
|
echo "1. Verifique o status:"
|
|
|
|
|
echo " gcloud run services describe $SERVICE_NAME --region=$REGION"
|
|
|
|
|
echo ""
|
|
|
|
|
echo "2. Obtenha a URL da aplicação:"
|
|
|
|
|
echo " gcloud run services describe $SERVICE_NAME --region=$REGION --format='value(status.url)'"
|
|
|
|
|
echo ""
|
|
|
|
|
echo "3. Teste a API:"
|
|
|
|
|
echo " curl https://<url-do-seu-servico>/docs"
|
|
|
|
|
echo ""
|
|
|
|
|
echo "4. Visualize logs:"
|
|
|
|
|
echo " gcloud run services logs read $SERVICE_NAME --region=$REGION --limit=50"
|
|
|
|
|
|
|
|
|
|
if [ -n "${RUN_VPC_CONN}" ]; then
|
|
|
|
|
DEPLOY_ARGS+=(--vpc-connector="${RUN_VPC_CONN}")
|
|
|
|
|
DEPLOY_ARGS+=(--vpc-egress="${RUN_VPC_EGRESS:-private-ranges-only}")
|
|
|
|
|
echo "VPC connector enabled: ${RUN_VPC_CONN}"
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
gcloud run deploy "${SERVICE_NAME}" "${DEPLOY_ARGS[@]}"
|
|
|
|
|
|
|
|
|
|
echo "Deploy finished."
|
|
|
|
|
echo "Service URL:"
|
|
|
|
|
gcloud run services describe "${SERVICE_NAME}" --region="${REGION}" --format='value(status.url)'
|
|
|
|
|
|
|
|
|
|
|