From fd54b3ed31c1a0323a7769a5ea8ee4775cbdd7f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Rossi?= Date: Thu, 4 Jun 2026 14:00:20 +0200 Subject: [PATCH] accept list of compose repo --- .gitea/workflows/maven-release.yml | 230 ++++++++++++++--------------- 1 file changed, 107 insertions(+), 123 deletions(-) diff --git a/.gitea/workflows/maven-release.yml b/.gitea/workflows/maven-release.yml index 6f29db6..4a07db8 100644 --- a/.gitea/workflows/maven-release.yml +++ b/.gitea/workflows/maven-release.yml @@ -3,8 +3,8 @@ name: Maven Release (reusable) on: workflow_call: inputs: - compose-repo: - description: "Repo docker-compose da aggiornare (es. Biters/bitwork). Vuoto = skip." + compose-repos: + description: "Repo docker-compose da aggiornare, separati da virgola (es. Biters/bitwork,Biters/altro). Vuoto = skip." required: false type: string default: "" @@ -188,115 +188,103 @@ jobs: git rebase origin/${{ github.ref_name }} git push origin develop --force-with-lease - # ── Aggiorna docker-compose (opzionale) ──────────────────── - - name: Clona repo compose e aggiorna versione immagine - if: ${{ inputs.compose-repo != '' }} + # ── Aggiorna docker-compose (opzionale, multi-repo) ──────── + - name: Aggiorna docker-compose nei repo compose + if: ${{ inputs.compose-repos != '' }} run: | VERSION="${{ steps.version.outputs.RELEASE_VERSION }}" PROJECT_NAME="${{ steps.version.outputs.PROJECT_NAME }}" REGISTRY="${{ inputs.docker-registry }}" - COMPOSE_REPO="${{ inputs.compose-repo }}" - - git clone "https://biters.gitea:${GITEA_TOKEN}@git.biters.it/${COMPOSE_REPO}.git" /tmp/compose-repo - cd /tmp/compose-repo - - git config user.name "CI Release Bot" - git config user.email "ci@biters.it" - ESCAPED_REGISTRY=$(echo "$REGISTRY" | sed 's/\./\\./g') - find . -name 'docker-compose*.yml' -exec \ - sed -i "s|\(${ESCAPED_REGISTRY}/biters/${PROJECT_NAME}:\)[^ \"']*|\1${VERSION}|g" {} + - - - name: Verifica variabili environment - if: ${{ inputs.compose-repo != '' }} - run: | - VERSION="${{ steps.version.outputs.RELEASE_VERSION }}" - PROJECT_NAME="${{ steps.version.outputs.PROJECT_NAME }}" - COMPOSE_REPO="${{ inputs.compose-repo }}" APP_YML="${GITHUB_WORKSPACE}/src/main/resources/application.yml" - if [ ! -f "$APP_YML" ]; then - echo "application.yml non trovato, skip verifica variabili." - exit 0 - fi - - ALL_PLACEHOLDERS=$(grep -oP '\$\{[^}]+\}' "$APP_YML" | sort -u) - + # ── Estrai variabili da application.yml (una volta sola) ── APP_VARS_REQUIRED="" APP_VARS_WITH_DEFAULT="" - for ph in $ALL_PLACEHOLDERS; do - var=$(echo "$ph" | sed 's/\${//;s/[:}].*//') - echo "$var" | grep -q '\.' && continue - if echo "$ph" | grep -q ':'; then - APP_VARS_WITH_DEFAULT=$(printf '%s\n%s' "$APP_VARS_WITH_DEFAULT" "$var") - else - APP_VARS_REQUIRED=$(printf '%s\n%s' "$APP_VARS_REQUIRED" "$var") - fi - done - APP_VARS_REQUIRED=$(echo "$APP_VARS_REQUIRED" | grep -v '^$' | sort -u) - APP_VARS_WITH_DEFAULT=$(echo "$APP_VARS_WITH_DEFAULT" | grep -v '^$' | sort -u) - APP_VARS_ALL=$(printf '%s\n%s' "$APP_VARS_REQUIRED" "$APP_VARS_WITH_DEFAULT" | grep -v '^$' | sort -u) - - echo "Variabili application.yml:" - echo " Obbligatorie: $(echo "$APP_VARS_REQUIRED" | wc -w)" - echo " Con default: $(echo "$APP_VARS_WITH_DEFAULT" | wc -w)" - - MISSING="" - cd /tmp/compose-repo - - for compose_file in docker-compose-*.yml; do - [ -f "$compose_file" ] || continue - ENV_NAME=${compose_file#docker-compose-} - ENV_NAME=${ENV_NAME%.yml} - ENV_FILE=".env_${ENV_NAME}" - - echo "" - echo "── ${compose_file} ──" - - COMMON_VARS=$(yq '.services["common-env-hc"].environment // {} | keys | .[]' \ - "$compose_file" 2>/dev/null || true) - - SVC_VARS=$(yq ".services | to_entries[] | - select(.value.image // \"\" | test(\"${PROJECT_NAME}\")) | - .value.environment // {} | keys | .[]" \ - "$compose_file" 2>/dev/null || true) - - COMPOSE_VARS=$(printf '%s\n%s' "$COMMON_VARS" "$SVC_VARS" | grep -v '^$' | sort -u) - - for var in $APP_VARS_ALL; do - if ! echo "$COMPOSE_VARS" | grep -qx "$var"; then - severity="REQUIRED" - echo "$APP_VARS_WITH_DEFAULT" | grep -qx "$var" && severity="HAS_DEFAULT" - MISSING="${MISSING}| \`${var}\` | \`${compose_file}\` | ${severity} |\n" + APP_VARS_ALL="" + if [ -f "$APP_YML" ]; then + ALL_PLACEHOLDERS=$(grep -oP '\$\{[^}]+\}' "$APP_YML" | sort -u) + for ph in $ALL_PLACEHOLDERS; do + var=$(echo "$ph" | sed 's/\${//;s/[:}].*//') + echo "$var" | grep -q '\.' && continue + if echo "$ph" | grep -q ':'; then + APP_VARS_WITH_DEFAULT=$(printf '%s\n%s' "$APP_VARS_WITH_DEFAULT" "$var") + else + APP_VARS_REQUIRED=$(printf '%s\n%s' "$APP_VARS_REQUIRED" "$var") fi done + APP_VARS_REQUIRED=$(echo "$APP_VARS_REQUIRED" | grep -v '^$' | sort -u) + APP_VARS_WITH_DEFAULT=$(echo "$APP_VARS_WITH_DEFAULT" | grep -v '^$' | sort -u) + APP_VARS_ALL=$(printf '%s\n%s' "$APP_VARS_REQUIRED" "$APP_VARS_WITH_DEFAULT" | grep -v '^$' | sort -u) + echo "Variabili application.yml: $(echo "$APP_VARS_REQUIRED" | wc -w) obbligatorie, $(echo "$APP_VARS_WITH_DEFAULT" | wc -w) con default" + fi - if [ -f "$ENV_FILE" ]; then - ENV_REFS=$(grep -oP '\$\{\K\w+(?=\})' "$compose_file" | sort -u) - for ref in $ENV_REFS; do - if ! grep -q "^${ref}=" "$ENV_FILE"; then - MISSING="${MISSING}| \`${ref}\` | \`${ENV_FILE}\` | REQUIRED |\n" + # ── Cicla su ogni repo compose ── + IFS=',' read -ra REPO_LIST <<< "${{ inputs.compose-repos }}" + for COMPOSE_REPO in "${REPO_LIST[@]}"; do + COMPOSE_REPO=$(echo "$COMPOSE_REPO" | xargs) + [ -z "$COMPOSE_REPO" ] && continue + REPO_DIR="/tmp/compose-$(echo "$COMPOSE_REPO" | tr '/' '-')" + + echo "" + echo "════════════════════════════════════════" + echo " Repo: ${COMPOSE_REPO}" + echo "════════════════════════════════════════" + + # ── Clone e aggiorna versione immagine ── + git clone "https://biters.gitea:${GITEA_TOKEN}@git.biters.it/${COMPOSE_REPO}.git" "$REPO_DIR" + cd "$REPO_DIR" + git config user.name "CI Release Bot" + git config user.email "ci@biters.it" + + find . -name 'docker-compose*.yml' -exec \ + sed -i "s|\(${ESCAPED_REGISTRY}/biters/${PROJECT_NAME}:\)[^ \"']*|\1${VERSION}|g" {} + + + # ── Verifica variabili environment ── + if [ -n "$APP_VARS_ALL" ]; then + MISSING="" + for compose_file in docker-compose-*.yml; do + [ -f "$compose_file" ] || continue + ENV_NAME=${compose_file#docker-compose-} + ENV_NAME=${ENV_NAME%.yml} + ENV_FILE=".env_${ENV_NAME}" + + echo " ── ${compose_file} ──" + + COMMON_VARS=$(yq '.services["common-env-hc"].environment // {} | keys | .[]' \ + "$compose_file" 2>/dev/null || true) + SVC_VARS=$(yq ".services | to_entries[] | + select(.value.image // \"\" | test(\"${PROJECT_NAME}\")) | + .value.environment // {} | keys | .[]" \ + "$compose_file" 2>/dev/null || true) + COMPOSE_VARS=$(printf '%s\n%s' "$COMMON_VARS" "$SVC_VARS" | grep -v '^$' | sort -u) + + for var in $APP_VARS_ALL; do + if ! echo "$COMPOSE_VARS" | grep -qx "$var"; then + severity="REQUIRED" + echo "$APP_VARS_WITH_DEFAULT" | grep -qx "$var" && severity="HAS_DEFAULT" + MISSING="${MISSING}| \`${var}\` | \`${compose_file}\` | ${severity} |\n" + fi + done + + if [ -f "$ENV_FILE" ]; then + ENV_REFS=$(grep -oP '\$\{\K\w+(?=\})' "$compose_file" | sort -u) + for ref in $ENV_REFS; do + if ! grep -q "^${ref}=" "$ENV_FILE"; then + MISSING="${MISSING}| \`${ref}\` | \`${ENV_FILE}\` | REQUIRED |\n" + fi + done fi done - fi - done - # Separa REQUIRED da HAS_DEFAULT - MISSING_REQUIRED=$(printf '%b' "$MISSING" | grep "REQUIRED" || true) - MISSING_DEFAULTS=$(printf '%b' "$MISSING" | grep "HAS_DEFAULT" || true) + MISSING_REQUIRED=$(printf '%b' "$MISSING" | grep "REQUIRED" || true) + MISSING_DEFAULTS=$(printf '%b' "$MISSING" | grep "HAS_DEFAULT" || true) - if [ -n "$MISSING_DEFAULTS" ] && [ -z "$MISSING_REQUIRED" ]; then - echo "" - echo "WARNING: variabili con default mancanti nei compose (non bloccante):" - printf '%b' "$MISSING" - echo "" - echo "Queste variabili hanno un valore di default in application.yml — verificare se adeguato." - elif [ -n "$MISSING_REQUIRED" ]; then - echo "" - echo "WARNING: variabili obbligatorie mancanti nei compose:" - printf '%b' "$MISSING" - - ISSUE_BODY="## Variabili mancanti — ${PROJECT_NAME} v${VERSION} + if [ -n "$MISSING_DEFAULTS" ] && [ -z "$MISSING_REQUIRED" ]; then + echo " WARNING: variabili con default mancanti (non bloccante)" + elif [ -n "$MISSING_REQUIRED" ]; then + echo " WARNING: variabili obbligatorie mancanti" + ISSUE_BODY="## Variabili mancanti — ${PROJECT_NAME} v${VERSION} La pipeline di release ha rilevato variabili non censite: @@ -310,33 +298,29 @@ jobs: ### Azione richiesta Aggiungere le variabili mancanti nei rispettivi file e committare su ${COMPOSE_REPO}." - curl -s -X POST \ - -H "Authorization: token ${GITEA_TOKEN}" \ - -H "Content-Type: application/json" \ - "https://git.biters.it/api/v1/repos/${COMPOSE_REPO}/issues" \ - -d "$(jq -n \ - --arg title "[CI] Variabili mancanti: ${PROJECT_NAME} v${VERSION}" \ - --arg body "$ISSUE_BODY" \ - '{title: $title, body: $body}')" + curl -s -X POST \ + -H "Authorization: token ${GITEA_TOKEN}" \ + -H "Content-Type: application/json" \ + "https://git.biters.it/api/v1/repos/${COMPOSE_REPO}/issues" \ + -d "$(jq -n \ + --arg title "[CI] Variabili mancanti: ${PROJECT_NAME} v${VERSION}" \ + --arg body "$ISSUE_BODY" \ + '{title: $title, body: $body}')" + echo " Issue creata su ${COMPOSE_REPO}." + else + echo " Tutte le variabili censite." + fi + fi - echo "" - echo "Issue creata su ${COMPOSE_REPO}." - else - echo "Tutte le variabili sono correttamente censite." - fi + # ── Push se ci sono modifiche ── + if git diff --quiet; then + echo " Nessuna modifica necessaria" + else + git add -A + git commit -m "chore(${PROJECT_NAME}): aggiorna immagine a ${VERSION}" + git push origin HEAD + echo " Docker-compose aggiornati con versione ${VERSION}" + fi - - name: Push docker-compose aggiornato - if: ${{ inputs.compose-repo != '' }} - run: | - VERSION="${{ steps.version.outputs.RELEASE_VERSION }}" - PROJECT_NAME="${{ steps.version.outputs.PROJECT_NAME }}" - cd /tmp/compose-repo - - if git diff --quiet; then - echo "Nessuna modifica necessaria ai docker-compose" - else - git add -A - git commit -m "chore(${PROJECT_NAME}): aggiorna immagine a ${VERSION}" - git push origin HEAD - echo "Docker-compose aggiornati con versione ${VERSION}" - fi + cd "$GITHUB_WORKSPACE" + done