# ============================================================ # Forgejo Actions — Build + Push image → Registre Forgejo # Déclenché uniquement sur un tag A.B.C poussé sur master # ============================================================ # # Prérequis : créer un jeton Forgejo dans # Paramètres → Applications → Jetons d'accès personnel # Permissions requises : read:packages, write:packages # Puis l'ajouter dans le dépôt : # Paramètres → Actions → Secrets → FORGEJO_TOKEN # ============================================================ name: Build & Deploy on: push: tags: # Pré-filtre glob (validation stricte faite dans le job) - '[1-9]*.[1-9]*.[1-9]*' jobs: build-and-push: name: Validation, build et push runs-on: ubuntu-latest permissions: contents: read packages: write steps: # ── 1. Checkout complet (historique + tags) ─────────────────────── - name: Checkout du code uses: actions/checkout@v4 with: fetch-depth: 0 # Indispensable pour comparer les tags existants # ── 2. Le tag doit pointer sur un commit présent dans master ───────── - name: Vérification — tag sur master run: | git fetch origin master --no-tags if ! git merge-base --is-ancestor "${{ github.sha }}" origin/master; then echo "Le tag '${{ github.ref_name }}' ne pointe pas sur un commit de master." exit 1 fi echo "Commit du tag présent dans master." # ── 3. Validation du format + progression de version ────────────── - name: Validation du tag et calcul des tags Docker id: semver run: | TAG="${{ github.ref_name }}" # ── Format strict : A.B.C avec A, B, C entiers > 0 ────────── if ! echo "$TAG" | grep -qE '^[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*$'; then echo "❌ Format invalide : '$TAG'" echo " Attendu : A.B.C avec A, B, C entiers > 0 (ex: 1.2.3)" exit 1 fi IFS='.' read -r A B C <<< "$TAG" # ── Trouver le tag valide le plus élevé (hors tag courant) ─── # Les tags sont triés numériquement par composant : le dernier # de la boucle est donc le maximum courant. PREV_TAG="" while IFS= read -r t; do [ "$t" = "$TAG" ] && continue if echo "$t" | grep -qE '^[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*$'; then PREV_TAG="$t" fi done < <(git tag -l | sort -t. -k1,1n -k2,2n -k3,3n) # ── Vérification de la progression stricte ─────────────────── if [ -n "$PREV_TAG" ]; then IFS='.' read -r PA PB PC <<< "$PREV_TAG" echo "ℹ️ Tag précédent le plus élevé : $PREV_TAG" OK=false if [ "$A" -gt "$PA" ]; then OK=true elif [ "$A" -eq "$PA" ] && [ "$B" -gt "$PB" ]; then OK=true elif [ "$A" -eq "$PA" ] && [ "$B" -eq "$PB" ] && [ "$C" -gt "$PC" ]; then OK=true fi if [ "$OK" = false ]; then echo "❌ '$TAG' ne respecte pas la règle de progression :" echo " A > PA" echo " OU ( A = PA ET B > PB )" echo " OU ( A = PA ET B = PB ET C > PC )" echo " Tag précédent : $PREV_TAG — Tag proposé : $TAG" exit 1 fi else echo "ℹ️ Aucun tag valide précédent — première version, pas de vérification de progression." fi echo "✅ Tag '$TAG' validé." # ── Outputs réutilisés par les étapes suivantes ─────────────── echo "full=${A}.${B}.${C}" >> "$GITHUB_OUTPUT" echo "minor=${A}.${B}" >> "$GITHUB_OUTPUT" echo "major=${A}" >> "$GITHUB_OUTPUT" # ── 4. Extraction du hostname du registre Forgejo ───────────────── - name: Extraction de l'URL du registre id: registry run: | # Retire le protocole pour obtenir uniquement le hostname # Ex : https://forge.example.com → forge.example.com HOST=$(echo "${{ github.server_url }}" | sed -E 's|^https?://||') echo "host=${HOST}" >> "$GITHUB_OUTPUT" # ── 5. Authentification ─────────────────────────────────────────── - name: Connexion au registre Forgejo uses: docker/login-action@v3 with: registry: ${{ steps.registry.outputs.host }} username: ${{ github.actor }} password: ${{ secrets.FORGEJO_TOKEN }} # ── 6. Build et push (4 tags) ───────────────────────────────────── - name: Build et push de l'image Docker uses: docker/build-push-action@v5 with: context: . file: ./docker/apache/Dockerfile push: true tags: | ${{ steps.registry.outputs.host }}/${{ github.repository_owner }}/mcserverwebsite:${{ steps.semver.outputs.full }} ${{ steps.registry.outputs.host }}/${{ github.repository_owner }}/mcserverwebsite:${{ steps.semver.outputs.minor }} ${{ steps.registry.outputs.host }}/${{ github.repository_owner }}/mcserverwebsite:${{ steps.semver.outputs.major }} ${{ steps.registry.outputs.host }}/${{ github.repository_owner }}/mcserverwebsite:latest