One click only

Finalement j’ai bouclé mon petit script de gestion de release de plugin où il suffit maintenant, une fois après avoir modifié et commité le numéro de version dans le fichier _define.php de lancer le script (avec uniquement le nom du plugin) qui va :

  1. Vérifier l’existence du plugin

  2. Extraire le numéro de version depuis le fichier _define.php

  3. Créer si nécessaire le package (archive zip) dans mon dossier de soumission (celui aussi utilisé par le plugin pacKman de JcDenis)

  4. Vérifier que la release n’a pas déjà été créée

  5. Créer un tag dans le dépôt Git local avec le numéro de version récupéré à l’étape 2

  6. Pousser le dépôt local vers le dépôt Github distant

  7. Pousser le tag créé à l’étape 5 vers le dépôt Github distant

  8. Créer la release sur le dépôt Github ce qui va déclencher la mise à jour du fichier dcstore.xml (à l’aide d’un workflow Github)

  9. Attendre 60 secondes1 et récupérer localement l’éventuelle mise à jour effectuée à l’étape 8, sachant que cette étape 9 est lancée dans un process séparé ce qui permet de quitter le script sans attendre son résultat.

Le code du script en question (probablement à adapter si vous souhaitez l’utiliser chez vous) :

Code source
#!/bin/bash

# Check 1st parameter (module name = directory)
if [ -z "$1" ]; then
  echo "You must give the module name = module directory"
  exit 1
fi

# Check module existance
if [ ! -d "$1" ]; then
  echo "The module $1 does not exists"
  exit 1
fi
MODULE="$1"

# Check 2nd parameter (tag = version)

if [ -z "$2" ]; then
  # Try to find last version from _define.php
  FILE="$MODULE/_define.php"

  # Check _define.php
  if [ ! -f "$FILE" ]; then
    echo "No _define.php in module $MODULE"
    exit 1
  fi

  # Extract version
  REGEX="registerModule\([[:space:]]*'([^']*)',[[:space:]]*'([^']*)',[[:space:]]*'([^']*)',[[:space:]]*'([^']*)',"
  DEFINE=$(<"$FILE")
  if [[ $DEFINE =~ $REGEX ]]; then
    MATCH="${BASH_REMATCH[4]}"
    TAG="$(echo "$MATCH" | tr -d \'\" | tr -d '\n\t\r ')"
  else
    echo "You must give the tag name = version"
    exit 1
  fi
else
  TAG="$2"
fi

# Check if asset exists
REPO="$HOME/Documents/EGO/Geekeries/Projets/Dotclear-2/soumissions"
ASSET="$REPO/plugin-$MODULE-$TAG.zip"
if [ ! -f "$ASSET" ]; then
  echo "The zip package of $MODULE $TAG is not yet created"

  if [ -d "$REPO/$MODULE" ]; then
    rm -rf "${REPO:?}/$MODULE"
  fi

  mkdir "$REPO/$MODULE"
  rsync --exclude-from="do_zip_rsync_exclude.txt" -a "$MODULE/" "$REPO/$MODULE/"
  (cd "$REPO" && zip -q -r "$REPO/plugin-$MODULE-$TAG.zip" "./$MODULE")

  # Cleanup
  rm -rf "${REPO:?}/$MODULE"

  # Final output
  echo "Zip package plugin-$MODULE-$TAG.zip ready!"
fi

# Process release

# Run next commands inside plugin folder
cd "$MODULE" || exit

# Check if release already exist
TAGVIEW="$(gh release view "$TAG" 2>&1 1>/dev/null)"
if [ ! "$TAGVIEW" = "release not found" ]; then
  echo "The release $TAG of $MODULE plugin has already been created!"
  echo "---"
  TAGLIST="$(gh release list)"
  echo "$TAGLIST"
  exit 1
fi

echo "Creating relase $TAG for $MODULE"

# Get remote updates if necessary
git pull

# Create local tag if necessary
if [ ! "$(git tag -l "$TAG")" ]; then
  git tag "$TAG"
fi

git push origin
git push origin "$TAG"
gh release create "$TAG" "$ASSET" --generate-notes --latest

echo "Release $TAG of $MODULE has been created"
echo "---"
TAGLIST="$(gh release list)"
echo "$TAGLIST"

# Wait 60 seconds before pull (dcstore.xml may be updated)
# but without waiting for and exit this script
(sleep 60 && git pull)&

À lancer depuis le répertoire principal des plugins avec la commande :

./do_release.sh <plugin>

Ça me permet de publier quasiment à la volée la moindre correction sans me soucier de tout la partie chi@nte :-p

Je mets en pièces jointes :

  • Le script que j’appelle do_release.sh
  • Le fichier d’exclusion utilisé pour la génération du package

  1. Le workflow Github dure en général moins d’une trentaine de secondes, on est large avec soixante. ↩︎

Ajouter un commentaire

Les champs suivis d'un * sont obligatoires

Les commentaires peuvent être formatés en utilisant la syntaxe Markdown Extra.

Ajouter un rétrolien

URL de rétrolien : https://open-time.net/trackback/15721

Haut de page