From b19419b954684759a5539dd652655c0ef30e5fda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vitor=20Hugo=20Belorio=20Sim=C3=A3o?= Date: Mon, 23 Feb 2026 15:36:42 -0300 Subject: [PATCH] chore(ci): Migrar build para Artifact Registry e melhorar deploy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Build e push para Artifact Registry - Substitutions para deploy via Cloud Build - Atualiza fluxo de deploy automático para Cloud Run --- cloudbuild.yaml | 64 +++++++++++++++++++++++++++++ deploy.sh | 105 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100644 cloudbuild.yaml create mode 100644 deploy.sh diff --git a/cloudbuild.yaml b/cloudbuild.yaml new file mode 100644 index 0000000..f8d98d7 --- /dev/null +++ b/cloudbuild.yaml @@ -0,0 +1,64 @@ +# Cloud Build Configuration para Artifact Registry + Cloud Run +# Substitutions: _REGION, _REPO_NAME, _IMAGE_NAME (passados pelo deploy.sh) + +steps: + # Step 1: Build Docker image para Artifact Registry + - name: "gcr.io/cloud-builders/docker" + args: + - "build" + - "-t" + - "${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPO_NAME}/${_IMAGE_NAME}:$SHORT_SHA" + - "-t" + - "${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPO_NAME}/${_IMAGE_NAME}:latest" + - "." + waitFor: ["-"] + + # Step 2: Push para Artifact Registry + - name: "gcr.io/cloud-builders/docker" + args: + - "push" + - "${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPO_NAME}/${_IMAGE_NAME}:$SHORT_SHA" + waitFor: ["0"] + + # Step 3: Deploy para Cloud Run + - name: "gcr.io/cloud-builders/run" + args: + - "deploy" + - "${_IMAGE_NAME}" + - "--image=${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPO_NAME}/${_IMAGE_NAME}:$SHORT_SHA" + - "--region=${_REGION}" + - "--platform=managed" + - "--memory=512Mi" + - "--cpu=1" + - "--timeout=3600" + - "--max-instances=10" + - "--allow-unauthenticated" + waitFor: ["1"] + + # Step 4: Mostrar URL do serviço + - name: "gcr.io/cloud-builders/run" + args: + - "services" + - "describe" + - "${_IMAGE_NAME}" + - "--region=${_REGION}" + - "--format=value(status.url)" + waitFor: ["2"] + +# Configuração de imagens para armazenar no Artifact Registry +images: + - "${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPO_NAME}/${_IMAGE_NAME}:$SHORT_SHA" + - "${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPO_NAME}/${_IMAGE_NAME}:latest" + +# Configurações de build +options: + machineType: "N1_HIGHCPU_8" + logging: CLOUD_LOGGING_ONLY + +timeout: "1800s" + +# Substitutions padrão (podem ser sobrescritos pelo deploy.sh) +substitutions: + _REGION: "us-central1" + _REPO_NAME: "orquestrador" + _IMAGE_NAME: "orquestrador" diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 0000000..f262eae --- /dev/null +++ b/deploy.sh @@ -0,0 +1,105 @@ +#!/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 + +set -e + +# 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" + +if [ -z "$PROJECT_ID" ]; then + echo "❌ Projeto não configurado. Execute: gcloud config set project " + exit 1 +fi + +echo "🚀 Iniciando deploy para Google Cloud Run" +echo "📦 Projeto: $PROJECT_ID" +echo "🌍 Região: $REGION" +echo "🏗️ Repositório: $REPO_NAME" + +# Passo 1: Validar autenticação +echo "" +echo "1️⃣ Verificando autenticação GCP..." +ACTIVE_ACCOUNT=$(gcloud auth list --filter=status:ACTIVE --format="value(account)") +if [ -z "$ACTIVE_ACCOUNT" ]; then + echo "❌ Nenhuma conta autenticada. Execute: gcloud auth login" + exit 1 +fi +echo "✅ Autenticado como: $ACTIVE_ACCOUNT" + +# Passo 2: Habilitar APIs +echo "" +echo "2️⃣ Habilitando APIs necessárias..." +gcloud services enable \ + run.googleapis.com \ + cloudbuild.googleapis.com \ + artifactregistry.googleapis.com \ + 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..." +gcloud builds submit \ + --config=cloudbuild.yaml \ + --substitutions=_REGION="$REGION",_REPO_NAME="$REPO_NAME",_IMAGE_NAME="$SERVICE_NAME" +echo "✅ Build concluído" + +# Passo 4: Configurar variáveis de ambiente +echo "" +echo "4️⃣ Atualizando variáveis de ambiente no Cloud Run..." + +# Ler variáveis do .env (excluindo comentários e linhas vazias) +ENV_VARS="" +while IFS='=' read -r key value; do + # Pular comentários e linhas vazias + [[ "$key" =~ ^#.*$ ]] && continue + [[ -z "$key" ]] && continue + # Adicionar à variável de deploy (sem espaços) + ENV_VARS="$ENV_VARS${key}=${value}," +done < .env + +# Remover última vírgula +ENV_VARS="${ENV_VARS%,}" + +if [ -z "$ENV_VARS" ]; then + echo "⚠️ Nenhuma variável de ambiente encontrada em .env" +else + gcloud run services update $SERVICE_NAME \ + --region=$REGION \ + --update-env-vars=$ENV_VARS \ + --quiet 2>/dev/null || echo "⚠️ Serviço pode não existir ainda. Será criado automaticamente." +fi +echo "✅ Variáveis de ambiente atualizadas" + +# Passo 5: Sucesso +echo "" +echo "================================" +echo "✅ DEPLOY CONCLUÍDO COM SUCESSO!" +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:///docs" +echo "" +echo "4. Visualize logs:" +echo " gcloud run services logs read $SERVICE_NAME --region=$REGION --limit=50" +