Logo Cinquin Andy Signature

Automatisation du Déploiement WordPress Plugin : Git vers SVN

Développeur Freelance - Logo

Les sites et les ressources associées

Automatisation du Déploiement WordPress Plugin : Git vers SVN

Publié le  - 6 février 2025 par Andy Cinquin

SvnWordpressGitGithub actions

Automatisation du Déploiement WordPress Plugin : Git vers SVN

Introduction

WordPress utilise toujours SVN (Subversion) pour son dépôt de plugins officiel, tandis que la plupart des développeurs modernes préfèrent Git et GitHub pour leur workflow quotidien. Cette différence peut créer une friction lors du déploiement de mises à jour de plugins, nécessitant souvent des actions manuelles pour synchroniser le code entre Git et SVN.
Cette solution résout ce problème en automatisant complètement le processus via GitHub Actions. À chaque push sur la branche principale, le système incrémente automatiquement la version, crée une release GitHub, et synchronise le code avec le dépôt SVN de WordPress.org. Plus besoin de jongler entre deux systèmes de versioning ou d'effectuer des actions manuelles répétitives : un simple push déclenche toute la chaîne de déploiement.

Configuration des Secrets GitHub

1. Création du GitHub Token

  • Générez un token personnel dans les paramètres de votre compte GitHub
  • Ajoutez les droits d'accès nécessaires pour les dépôts
  • Ce token peut être réutilisé sur d'autres projets si besoin

2. Configuration dans GitHub

Pasted image 20250205202348.png
Pasted image 20250205202405.png

3. Ajout des Secrets

Configurez ces trois variables secrètes :
  • GH_TOKEN : Votre token GitHub personnel
  • SVN_USERNAME : Votre nom d'utilisateur WordPress.org
  • SVN_PASSWORD : Votre mot de passe WordPress.org
Note : La configuration peut se faire au niveau organisation ou repository selon vos besoins de réutilisation.

Fichiers de Configuration

1. Workflow de Déploiement

# File: .github/workflows/deploy.yml  
name: Deploy WordPress Plugin  
  
on:  
  push:  
    branches:  
      - main  
    paths:  
      - 'package.json'  
      - 'auto-alt-text-for-images.php'  
      - 'readme.txt'  
  
jobs:  
  build-and-deploy:  
    name: Build and Deploy Plugin  
    runs-on: ubuntu-latest  
    if: "contains(github.event.head_commit.message, '✨ Release version')"  
  
    steps:  
      - name: Checkout code  
        uses: actions/checkout@v4  
        with:  
          fetch-depth: 0  
  
      - name: Install SVN  
        run: |  
          sudo apt-get update  
          sudo apt-get install -y subversion  
  
      - name: Setup PHP  
        uses: shivammathur/setup-php@v2  
        with:  
          php-version: '8.2'  
          tools: composer, wp-cli  
  
      - name: Setup Node.js  
        uses: actions/setup-node@v4  
        with:  
          node-version: '20'  
  
      - name: Get version from commit message  
        id: get_version  
        run: |  
          VERSION=$(echo "${{ github.event.head_commit.message }}" | grep -oP '✨ Release version \K[0-9]+\.[0-9]+\.[0-9]+')  
          echo "version=$VERSION" >> $GITHUB_OUTPUT  
  
      - name: Install dependencies  
        run: |  
          composer install --no-dev --optimize-autoloader  
          npm ci  
  
      - name: Generate POT file  
        run: |  
          mkdir -p languages  
          wp i18n make-pot . languages/auto-alt-text-for-images.pot --domain=auto-alt-text-for-images --allow-root  
  
      - name: Create ZIP archive  
        run: composer run zip  
  
      - name: Create GitHub Release  
        uses: softprops/action-gh-release@v1  
        with:  
          files: release/auto-alt-text-for-images.zip  
          body_path: CHANGELOG.md  
          name: ${{ steps.get_version.outputs.version }}  
          tag_name: ${{ steps.get_version.outputs.version }}  
        env:  
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  
  
      - name: Checkout WordPress SVN repository  
        env:  
          SVN_USERNAME: ${{ secrets.SVN_USERNAME }}  
          SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }}  
        run: |  
          svn checkout "https://plugins.svn.wordpress.org/auto-alt-text-for-images" \  
          --username "$SVN_USERNAME" \  
          --password "$SVN_PASSWORD" \  
          --no-auth-cache \  
          --non-interactive \  
          --trust-server-cert \  
          svn  
  
      - name: Prepare SVN  
        working-directory: svn  
        run: |  
          VERSION=${{ steps.get_version.outputs.version }}  
          rm -rf trunk/* tags/$VERSION  
          rm -rf assets/*  
          cp -r ../assets/* assets/  
          svn add assets/* --force  
          cp -r ../includes trunk/  
          cp -r ../languages trunk/  
          cp -r ../templates trunk/  
          cp ../auto-alt-text-for-images.php trunk/  
          cp ../README.md trunk/  
          cp ../readme.txt trunk/  
          cp ../uninstall.php trunk/  
          svn add trunk/* --force  
          mkdir -p tags/$VERSION  
          cp -r trunk/* tags/$VERSION/  
          svn add tags/$VERSION --force  
          svn status | grep '^\!' | sed 's/! *//' | xargs -I% svn rm %@  
  
      - name: Commit to SVN  
        working-directory: svn  
        env:  
          SVN_USERNAME: ${{ secrets.SVN_USERNAME }}  
          SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }}  
        run: |  
          VERSION=${{ steps.get_version.outputs.version }}  
          svn commit -m "Release version $VERSION" \  
            --username "$SVN_USERNAME" \  
            --password "$SVN_PASSWORD" \  
            --no-auth-cache \  
            --non-interactive \  
            --trust-server-cert  
  
      - name: Notify on success  
        if: success()  
        run: |  
          echo "Plugin successfully deployed to WordPress.org and GitHub!"  
          echo "Version ${{ steps.get_version.outputs.version }} is now live!"

2. Workflow de Version Bump

# File: .github/workflows/version-bump.yml  
name: Version Bump  
  
on:  
  push:  
    branches:  
      - main  
    paths-ignore:  
      - '.github/workflows/**'  
  
jobs:  
  version-bump:  
    name: Create New Version  
    runs-on: ubuntu-latest  
    permissions:  
      contents: write  
    if: "!contains(github.event.head_commit.message, '✨ Release version')"  
  
    steps:  
      - uses: actions/checkout@v4  
        with:  
          token: ${{ secrets.GH_TOKEN }}  
          fetch-depth: 0  
  
      - name: Read current version  
        id: version  
        run: |  
          CURRENT_VERSION=$(grep -Po '"version": "\K[^"]*' package.json)  
          echo "current_version=${CURRENT_VERSION}" >> $GITHUB_OUTPUT  
  
      - name: Increment version  
        id: bump_version  
        run: |  
          IFS='.' read -r -a version_parts <<< "${{ steps.version.outputs.current_version }}"  
          new_patch=$((version_parts[2] + 1))  
          NEW_VERSION="${version_parts[0]}.${version_parts[1]}.$new_patch"  
          echo "new_version=${NEW_VERSION}" >> $GITHUB_OUTPUT  
  
      - name: Update version numbers  
        run: |  
          NEW_VERSION="${{ steps.bump_version.outputs.new_version }}"  
          sed -i "s/\"version\": \".*\"/\"version\": \"$NEW_VERSION\"/" package.json  
          sed -i "s/Version:     .*/Version:     $NEW_VERSION/" auto-alt-text-for-images.php  
          sed -i "s/define( 'FORVOYEZ_VERSION', '.*' );/define( 'FORVOYEZ_VERSION', '$NEW_VERSION' );/" auto-alt-text-for-images.php  
          sed -i "s/Stable tag: .*/Stable tag: $NEW_VERSION/" readme.txt  
  
      - name: Commit and tag new version  
        run: |  
          NEW_VERSION="${{ steps.bump_version.outputs.new_version }}"  
          git config --global user.email "github-actions[bot]@users.noreply.github.com"  
          git config --global user.name "github-actions[bot]"  
          git pull origin main  
          git add package.json auto-alt-text-for-images.php readme.txt  
          git commit -m "✨ Release version $NEW_VERSION ✨"  
          git tag $NEW_VERSION  
          git push origin main && git push origin $NEW_VERSION

Fonctionnement du Système

  1. À chaque push sur main :
    • Le système vérifie si les fichiers de version ont été modifiés
    • Incrémente automatiquement la version
    • Crée un commit spécial de release
    • Pousse les modifications avec un tag
  2. Le commit de release déclenche :
    • La création d'une release GitHub
    • La synchronisation avec SVN WordPress.org
    • La mise à jour de la documentation
Un simple push sur la branche principale suffit maintenant pour déclencher toute la chaîne de déploiement. Les versions sont gérées automatiquement, et tout reste synchronisé entre GitHub et WordPress.org !



🚀 Merci d'avoir lu jusqu'ici !
Si cet article vous a plu, partagez-le autour de vous.

💡 Une idée en tête ? Discutons-en !

DÉVELOPPONS ENSEMBLE VOS PROJETS

Une idée, un projet ? Je suis là pour répondre à vos demandes et vous accompagner.
N’hésitez pas, je serais ravi d’échanger avec vous sur votre projet !
© 2025 Andy Cinquin - Tous droits réservés - Developed & Designed with ❤️ 🐝 ForHives co-founders