accept list of compose repo
This commit is contained in:
@@ -3,8 +3,8 @@ name: Maven Release (reusable)
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
compose-repo:
|
compose-repos:
|
||||||
description: "Repo docker-compose da aggiornare (es. Biters/bitwork). Vuoto = skip."
|
description: "Repo docker-compose da aggiornare, separati da virgola (es. Biters/bitwork,Biters/altro). Vuoto = skip."
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
default: ""
|
default: ""
|
||||||
@@ -188,42 +188,22 @@ jobs:
|
|||||||
git rebase origin/${{ github.ref_name }}
|
git rebase origin/${{ github.ref_name }}
|
||||||
git push origin develop --force-with-lease
|
git push origin develop --force-with-lease
|
||||||
|
|
||||||
# ── Aggiorna docker-compose (opzionale) ────────────────────
|
# ── Aggiorna docker-compose (opzionale, multi-repo) ────────
|
||||||
- name: Clona repo compose e aggiorna versione immagine
|
- name: Aggiorna docker-compose nei repo compose
|
||||||
if: ${{ inputs.compose-repo != '' }}
|
if: ${{ inputs.compose-repos != '' }}
|
||||||
run: |
|
run: |
|
||||||
VERSION="${{ steps.version.outputs.RELEASE_VERSION }}"
|
VERSION="${{ steps.version.outputs.RELEASE_VERSION }}"
|
||||||
PROJECT_NAME="${{ steps.version.outputs.PROJECT_NAME }}"
|
PROJECT_NAME="${{ steps.version.outputs.PROJECT_NAME }}"
|
||||||
REGISTRY="${{ inputs.docker-registry }}"
|
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')
|
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"
|
APP_YML="${GITHUB_WORKSPACE}/src/main/resources/application.yml"
|
||||||
|
|
||||||
if [ ! -f "$APP_YML" ]; then
|
# ── Estrai variabili da application.yml (una volta sola) ──
|
||||||
echo "application.yml non trovato, skip verifica variabili."
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
ALL_PLACEHOLDERS=$(grep -oP '\$\{[^}]+\}' "$APP_YML" | sort -u)
|
|
||||||
|
|
||||||
APP_VARS_REQUIRED=""
|
APP_VARS_REQUIRED=""
|
||||||
APP_VARS_WITH_DEFAULT=""
|
APP_VARS_WITH_DEFAULT=""
|
||||||
|
APP_VARS_ALL=""
|
||||||
|
if [ -f "$APP_YML" ]; then
|
||||||
|
ALL_PLACEHOLDERS=$(grep -oP '\$\{[^}]+\}' "$APP_YML" | sort -u)
|
||||||
for ph in $ALL_PLACEHOLDERS; do
|
for ph in $ALL_PLACEHOLDERS; do
|
||||||
var=$(echo "$ph" | sed 's/\${//;s/[:}].*//')
|
var=$(echo "$ph" | sed 's/\${//;s/[:}].*//')
|
||||||
echo "$var" | grep -q '\.' && continue
|
echo "$var" | grep -q '\.' && continue
|
||||||
@@ -236,31 +216,47 @@ jobs:
|
|||||||
APP_VARS_REQUIRED=$(echo "$APP_VARS_REQUIRED" | grep -v '^$' | sort -u)
|
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_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)
|
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
|
||||||
|
|
||||||
echo "Variabili application.yml:"
|
# ── Cicla su ogni repo compose ──
|
||||||
echo " Obbligatorie: $(echo "$APP_VARS_REQUIRED" | wc -w)"
|
IFS=',' read -ra REPO_LIST <<< "${{ inputs.compose-repos }}"
|
||||||
echo " Con default: $(echo "$APP_VARS_WITH_DEFAULT" | wc -w)"
|
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=""
|
MISSING=""
|
||||||
cd /tmp/compose-repo
|
|
||||||
|
|
||||||
for compose_file in docker-compose-*.yml; do
|
for compose_file in docker-compose-*.yml; do
|
||||||
[ -f "$compose_file" ] || continue
|
[ -f "$compose_file" ] || continue
|
||||||
ENV_NAME=${compose_file#docker-compose-}
|
ENV_NAME=${compose_file#docker-compose-}
|
||||||
ENV_NAME=${ENV_NAME%.yml}
|
ENV_NAME=${ENV_NAME%.yml}
|
||||||
ENV_FILE=".env_${ENV_NAME}"
|
ENV_FILE=".env_${ENV_NAME}"
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo " ── ${compose_file} ──"
|
echo " ── ${compose_file} ──"
|
||||||
|
|
||||||
COMMON_VARS=$(yq '.services["common-env-hc"].environment // {} | keys | .[]' \
|
COMMON_VARS=$(yq '.services["common-env-hc"].environment // {} | keys | .[]' \
|
||||||
"$compose_file" 2>/dev/null || true)
|
"$compose_file" 2>/dev/null || true)
|
||||||
|
|
||||||
SVC_VARS=$(yq ".services | to_entries[] |
|
SVC_VARS=$(yq ".services | to_entries[] |
|
||||||
select(.value.image // \"\" | test(\"${PROJECT_NAME}\")) |
|
select(.value.image // \"\" | test(\"${PROJECT_NAME}\")) |
|
||||||
.value.environment // {} | keys | .[]" \
|
.value.environment // {} | keys | .[]" \
|
||||||
"$compose_file" 2>/dev/null || true)
|
"$compose_file" 2>/dev/null || true)
|
||||||
|
|
||||||
COMPOSE_VARS=$(printf '%s\n%s' "$COMMON_VARS" "$SVC_VARS" | grep -v '^$' | sort -u)
|
COMPOSE_VARS=$(printf '%s\n%s' "$COMMON_VARS" "$SVC_VARS" | grep -v '^$' | sort -u)
|
||||||
|
|
||||||
for var in $APP_VARS_ALL; do
|
for var in $APP_VARS_ALL; do
|
||||||
@@ -281,21 +277,13 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Separa REQUIRED da HAS_DEFAULT
|
|
||||||
MISSING_REQUIRED=$(printf '%b' "$MISSING" | grep "REQUIRED" || true)
|
MISSING_REQUIRED=$(printf '%b' "$MISSING" | grep "REQUIRED" || true)
|
||||||
MISSING_DEFAULTS=$(printf '%b' "$MISSING" | grep "HAS_DEFAULT" || true)
|
MISSING_DEFAULTS=$(printf '%b' "$MISSING" | grep "HAS_DEFAULT" || true)
|
||||||
|
|
||||||
if [ -n "$MISSING_DEFAULTS" ] && [ -z "$MISSING_REQUIRED" ]; then
|
if [ -n "$MISSING_DEFAULTS" ] && [ -z "$MISSING_REQUIRED" ]; then
|
||||||
echo ""
|
echo " WARNING: variabili con default mancanti (non bloccante)"
|
||||||
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
|
elif [ -n "$MISSING_REQUIRED" ]; then
|
||||||
echo ""
|
echo " WARNING: variabili obbligatorie mancanti"
|
||||||
echo "WARNING: variabili obbligatorie mancanti nei compose:"
|
|
||||||
printf '%b' "$MISSING"
|
|
||||||
|
|
||||||
ISSUE_BODY="## Variabili mancanti — ${PROJECT_NAME} v${VERSION}
|
ISSUE_BODY="## Variabili mancanti — ${PROJECT_NAME} v${VERSION}
|
||||||
|
|
||||||
La pipeline di release ha rilevato variabili non censite:
|
La pipeline di release ha rilevato variabili non censite:
|
||||||
@@ -318,25 +306,21 @@ jobs:
|
|||||||
--arg title "[CI] Variabili mancanti: ${PROJECT_NAME} v${VERSION}" \
|
--arg title "[CI] Variabili mancanti: ${PROJECT_NAME} v${VERSION}" \
|
||||||
--arg body "$ISSUE_BODY" \
|
--arg body "$ISSUE_BODY" \
|
||||||
'{title: $title, body: $body}')"
|
'{title: $title, body: $body}')"
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo " Issue creata su ${COMPOSE_REPO}."
|
echo " Issue creata su ${COMPOSE_REPO}."
|
||||||
else
|
else
|
||||||
echo "Tutte le variabili sono correttamente censite."
|
echo " Tutte le variabili censite."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Push docker-compose aggiornato
|
# ── Push se ci sono modifiche ──
|
||||||
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
|
if git diff --quiet; then
|
||||||
echo "Nessuna modifica necessaria ai docker-compose"
|
echo " Nessuna modifica necessaria"
|
||||||
else
|
else
|
||||||
git add -A
|
git add -A
|
||||||
git commit -m "chore(${PROJECT_NAME}): aggiorna immagine a ${VERSION}"
|
git commit -m "chore(${PROJECT_NAME}): aggiorna immagine a ${VERSION}"
|
||||||
git push origin HEAD
|
git push origin HEAD
|
||||||
echo " Docker-compose aggiornati con versione ${VERSION}"
|
echo " Docker-compose aggiornati con versione ${VERSION}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
cd "$GITHUB_WORKSPACE"
|
||||||
|
done
|
||||||
|
|||||||
Reference in New Issue
Block a user