diff --git a/.gitea/workflows/cd.yml b/.gitea/workflows/cd.yml index e1307bb..4574476 100644 --- a/.gitea/workflows/cd.yml +++ b/.gitea/workflows/cd.yml @@ -38,8 +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 }}" - gcloud builds submit --tag "$IMG" --project=${{ secrets.GCP_PROJECT }} --timeout=30m + # --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. + # --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" \ + --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)