From 037a3f4d93dc6a3a93359b3b28fb9bcd23c2d122 Mon Sep 17 00:00:00 2001 From: Dalton Alvarenga Date: Thu, 7 May 2026 13:20:27 -0300 Subject: [PATCH] fix(ci): troca --suppress-logs por --async + poll loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --suppress-logs nessa versão do gcloud CLI no runner ainda tenta ler logs no fim e dá exit != 0 quando a SA não tem Viewer no projeto. Build real do PR #8 deu SUCCESS (image lab-18 em AR), mas a step falhou na finalização do gcloud. Com --async, gcloud retorna o build ID logo após enfileirar e sai. Poll explícito via builds describe (que usa cloudbuild.builds.get, já em builds.editor). Mata o build no primeiro estado terminal != SUCCESS. --- .gitea/workflows/cd.yml | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/cd.yml b/.gitea/workflows/cd.yml index 79b4ef8..4574476 100644 --- a/.gitea/workflows/cd.yml +++ b/.gitea/workflows/cd.yml @@ -38,19 +38,40 @@ jobs: - name: Build & push (Cloud Build, sem Docker local) run: | + set -e IMG="${IMAGE_BASE}/${{ gitea.event.repository.name }}:lab-${{ gitea.run_number }}" - # --gcs-source-staging-dir: pula auto-detect que precisa de - # storage.buckets.list (project-scope) — gitea-cd só tem grant + # --gcs-source-staging-dir: pula o auto-detect que precisa de + # storage.buckets.list (project-scope). gitea-cd só tem grant # na bucket _cloudbuild, não no projeto inteiro. - # --suppress-logs: gcloud streama logs do Cloud Build pra stdout e - # isso exige Viewer/Owner no projeto. SA não tem; suprimir os - # logs ainda espera o build terminar e propaga o exit code. - gcloud builds submit \ + # --async: gcloud retorna assim que o build é enfileirado. Sem + # isso, gcloud tenta streamar Cloud Logging, exige Viewer/Owner + # no projeto, e --suppress-logs nessa versão do CLI ainda dá + # exit != 0 quando não consegue ler. Polling abaixo é o trade. + BUILD_ID=$(gcloud builds submit \ --tag "$IMG" \ --project=${{ secrets.GCP_PROJECT }} \ --timeout=30m \ --gcs-source-staging-dir="gs://${{ secrets.GCP_PROJECT }}_cloudbuild/source" \ - --suppress-logs + --async \ + --format="value(id)") + echo "Cloud Build kicked off: $BUILD_ID" + # Poll até terminar. gcloud builds describe usa cloudbuild.builds.get + # (já incluído em roles/cloudbuild.builds.editor). + while true; do + STATUS=$(gcloud builds describe "$BUILD_ID" \ + --project=${{ secrets.GCP_PROJECT }} \ + --region=global \ + --format="value(status)") + echo "[$(date -u +%H:%M:%S)] build $BUILD_ID: $STATUS" + case "$STATUS" in + SUCCESS) break ;; + FAILURE|INTERNAL_ERROR|TIMEOUT|CANCELLED|EXPIRED) + echo "::error::Cloud Build $STATUS — ver console: https://console.cloud.google.com/cloud-build/builds/$BUILD_ID?project=${{ secrets.GCP_PROJECT }}" + exit 1 + ;; + esac + sleep 15 + done echo "IMG=$IMG" >> $GITHUB_ENV - name: Deploy hml2 (apenas em push pra master/main)