#!/bin/bash # Vérification du nombre d'arguments if [ "$#" -lt 1 ]; then echo "Usage: promote.sh [ ...] [--dry-run] [--target-stage=] [--no-confirmation]" echo echo "Description:" echo "Ce script permet de promouvoir des tags d'images Docker du projet MSE d'une étape à une autre (ex: 'k8sunstable' vers 'k8stesting')." echo "Il prend un ou plusieurs tags d'images Docker comme argument et les promeut en fonction de leur étape actuelle." echo echo "Arguments :" echo " : Tag source de l'image Docker à promouvoir. Format attendu :" echo " /:-.." echo " Exemple : reg.cadoles.com/cnous-mse/portal:2025.2.6-XXX.1402.ed7732337" echo echo "Options :" echo " --dry-run : Mode 'dry-run'. Simule la promotion sans exécuter de commandes Docker." echo " Utile pour vérifier ce qui se passerait sans faire de changements." echo " --target-stage= : Spécifie un stage cible particulier pour la promotion." echo " Par défaut, la promotion suit la séquence d'étapes (ex: 'k8sunstable' -> 'k8stesting' -> ...)" echo " Vous pouvez spécifier directement le stage (ex: --target-stage k8spreprod)." echo " --no-confirmation : Ignore la demande de confirmation avant de pousser le tag Docker." echo " Utilisé pour automatiser la promotion sans intervention manuelle." echo echo "Exemples d'utilisation :" echo " promote.sh reg.cadoles.com/cnous-mse/portal:2025.2.6-XXX.1402.ed7732337" echo " promote.sh reg.cadoles.com/cnous-mse/portal:2025.2.6-XXX.1402.ed7732337 --dry-run" echo " promote.sh reg.cadoles.com/cnous-mse/portal:2025.2.6-XXX.1402.ed7732337 --target-stage=k8spreprod" echo " promote.sh reg.cadoles.com/cnous-mse/portal:2025.2.6-XXX.1402.ed7732337 --no-confirmation" exit 1 fi # Extraction des options DRY_RUN=false TARGET_STAGE="" NO_CONFIRMATION=false IMAGES=() for arg in "$@"; do if [ "$arg" == "--dry-run" ]; then DRY_RUN=true elif [[ "$arg" == --target-stage=* ]]; then TARGET_STAGE="${arg#--target-stage=}" elif [ "$arg" == "--no-confirm" ]; then NO_CONFIRMATION=true else IMAGES+=("$arg") fi done # Variables pour stocker les promotions par stage PROMOTIONS=( "## Livré Unstable" "## Livré Qualif" "## Livré Preprod" "## Livré Prod" ) UNSTABLE="" QUALIF="" PREPROD="" PROD="" # Fonction pour promouvoir une image Docker promote_image() { local SOURCE_TAG="$1" # Vérifie si le tag source suit le format attendu if [[ ! "$SOURCE_TAG" =~ ^(.+):([0-9]{4}\.[0-9]+\.[0-9]+)-([a-zA-Z0-9]+)\.([0-9]+)\.([a-z0-9]+)$ ]]; then echo "Erreur : Le tag source ne suit pas le format attendu : $SOURCE_TAG" return 1 fi # Extraction des parties du tag source local REGISTRY_REPOSITORY="${BASH_REMATCH[1]}" local VERSION="${BASH_REMATCH[2]}" local CURRENT_STAGE="${BASH_REMATCH[3]}" local BUILD_NUMBER="${BASH_REMATCH[4]}" local COMMIT_HASH="${BASH_REMATCH[5]}" # Définir le nouveau stage if [ -n "$TARGET_STAGE" ]; then NEW_STAGE="$TARGET_STAGE" else case "$CURRENT_STAGE" in "k8sunstable") NEW_STAGE="k8stesting" ;; "k8stesting") NEW_STAGE="k8spreprod" ;; "k8spreprod") NEW_STAGE="k8sprod" ;; "k8sprod") echo "Erreur : Promotion non définie pour '$CURRENT_STAGE'." return 1 ;; *) NEW_STAGE="k8sunstable" ;; esac fi # Construire le nouveau tag local NEW_TAG="${REGISTRY_REPOSITORY}:${VERSION}-${NEW_STAGE}.${BUILD_NUMBER}.${COMMIT_HASH}" echo "Promotion de tag Docker :" echo "Source : $SOURCE_TAG " echo "Cible : $NEW_TAG" if [ "$DRY_RUN" == true ]; then echo "Mode dry-run activé. Les commandes Docker ne seront pas exécutées." return 0 fi if [ "$NO_CONFIRMATION" != true ]; then read -p "Souhaitez-vous pousser le nouveau tag ? (o/N) : " CONFIRMATION if [[ ! "$CONFIRMATION" =~ ^([oO]|oui)$ ]]; then echo "Annulé par l'utilisateur." return 0 fi fi docker tag "$SOURCE_TAG" "$NEW_TAG" docker push "$NEW_TAG" # Regrouper dans la liste appropriée case "$NEW_STAGE" in "k8sunstable") UNSTABLE+="- $NEW_TAG\n" ;; "k8stesting") QUALIF+="- $NEW_TAG\n" ;; "k8spreprod") PREPROD+="- $NEW_TAG\n" ;; "k8sprod") PROD+="- $NEW_TAG\n" ;; esac } # Traiter chaque image for IMAGE in "${IMAGES[@]}"; do promote_image "$IMAGE" done # Afficher le Markdown final if [ -n "$UNSTABLE" ]; then echo -e "\n## Livré Unstable\n\n\`\`\`\n$UNSTABLE\`\`\`" fi if [ -n "$QUALIF" ]; then echo -e "\n## Livré Qualif\n\n\`\`\`\n$QUALIF\`\`\`" fi if [ -n "$PREPROD" ]; then echo -e "\n## Livré Preprod\n\n\`\`\`\n$PREPROD\`\`\`" fi if [ -n "$PROD" ]; then echo -e "\n## Livré Prod\n\n\`\`\`\n$PROD\`\`\`" fi