diff --git a/Dockerfile b/Dockerfile index a76d0e4..f64eb07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,4 +41,4 @@ EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ CMD python -c "import httpx; httpx.get('http://localhost:8080/docs', timeout=5)" || exit 1 -CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"] +CMD ["sh", "-c", "uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-8080}"] diff --git a/cloudbuild.yaml b/cloudbuild.yaml index f8d98d7..df1dfbb 100644 --- a/cloudbuild.yaml +++ b/cloudbuild.yaml @@ -7,48 +7,28 @@ steps: 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" + - "-t" + - "${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPO_NAME}/${_IMAGE_NAME}:$BUILD_ID" - "." - 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"] + - "${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPO_NAME}/${_IMAGE_NAME}:$BUILD_ID" - # Step 4: Mostrar URL do serviço - - name: "gcr.io/cloud-builders/run" + # Step 3: Mostrar URL da imagem (opcional, útil para debug) + - name: "gcr.io/cloud-builders/gcloud" + entrypoint: "bash" args: - - "services" - - "describe" - - "${_IMAGE_NAME}" - - "--region=${_REGION}" - - "--format=value(status.url)" - waitFor: ["2"] + - "-c" + - "echo 'Imagem pronta: ${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPO_NAME}/${_IMAGE_NAME}:$BUILD_ID'" # 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" + - "${_REGION}-docker.pkg.dev/$PROJECT_ID/${_REPO_NAME}/${_IMAGE_NAME}:$BUILD_ID" # Configurações de build options: diff --git a/deploy.sh b/deploy.sh index f262eae..bcbc627 100644 --- a/deploy.sh +++ b/deploy.sh @@ -56,18 +56,23 @@ gcloud builds submit \ --substitutions=_REGION="$REGION",_REPO_NAME="$REPO_NAME",_IMAGE_NAME="$SERVICE_NAME" echo "✅ Build concluído" -# Passo 4: Configurar variáveis de ambiente +# Passo 4: Deploy para Cloud Run com variáveis de ambiente echo "" -echo "4️⃣ Atualizando variáveis de ambiente no Cloud Run..." +echo "4️⃣ Realizando deploy para Cloud Run com variáveis de ambiente..." -# Ler variáveis do .env (excluindo comentários e linhas vazias) +# Ler variáveis do .env (excluindo comentários e linhas vazias, e tratando espaços/caracteres especiais) 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}," +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," + fi done < .env # Remover última vírgula @@ -75,18 +80,31 @@ 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 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." + # 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 fi -echo "✅ Variáveis de ambiente atualizadas" +echo "✅ Deploy concluído com variáveis de ambiente" # Passo 5: Sucesso echo "" echo "================================" -echo "✅ DEPLOY CONCLUÍDO COM SUCESSO!" +echo "✅ PROCESSO FINALIZADO!" echo "================================" echo "" echo "📋 Próximos passos:" diff --git a/requirements.txt b/requirements.txt index fa6d3a0..742942b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,3 +22,5 @@ google-cloud-aiplatform==1.70.0 google-generativeai==0.8.5 httpx==0.27.2 psycopg2-binary==2.9.10 +sqlalchemy==2.0.38 +pydantic-settings==2.13.0