sbt-dynver : un script de release

Nous avons vu dans un précédent article le plugin sbt-dynver qui permet de versionner votre code en se basant sur les tags Git. Il manquait un processus de release automatisé tout comme sbt-release tout en restant plus léger.

Voici un script permettant d'effectuer ce processus de release. Il effectue les tâches suivantes :

  1. Vérifier que vous êtes sur la branche prévue pour les releases.
  2. Vérifier s'il n'y a pas de modifications non commitées.
  3. Lire et vérifier le nouveau numéro de version (en affichant la version actuelle).
  4. Création du tag en se basant sur le nouveau numéro de version.
  5. Pousser toutes les dernières modifications (tag inclus) sur le repo distant
#!/bin/sh
# Release script
#
# This script asks the user for the new version tag and push the
# code with the new tag.
#
# You should:
# - have release based on Git tags
# - be in your main branch
# - have a tag that starts with 'v' and the rest looks like
#   [semver](https://semver.org/)

release_branch=master
remote_repository=origin
version_tag_regexp='v[0-9]+(\.[0-9]+)+(-.*)?'

# check current branch
current_branch=$(git branch --show-current)
if [ "$current_branch" != "$release_branch" ]; then
  echo "current branch is not $release_branch (current: $current_branch)"
  exit 1
fi

# check there are no uncommitted files
modified_files=$(git ls-files --modified --deleted --exclude-standard --others)
if [ "$modified_files" != "" ]; then
  echo "those files have been modified, deleted, and/or added:"
  echo "$modified_files"
  exit 1
fi

# get the last available tag
last_tag=$(git tag --list --sort=-v:refname | grep -E "$version_tag_regexp" | head -n 1)

# read and check the new tag
read -r -p "Enter new version (prefix with 'v') [last version:$last_tag]: " new_tag
if [ "$new_tag" = "" ]; then
  echo "the tag input is empty"
  exit 1
fi
if [ "$(echo "$new_tag" | grep -E "$version_tag_regexp")" = "" ]; then
  echo "bad tag format: $new_tag"
  exit 1
fi

# proceed the new release

echo "set version to $new_tag"
git tag "$new_tag" -m "Set version to $new_tag"

echo "push new tag and last commit to remote"
git push --atomic "$remote_repository" "$release_branch" "$new_tag"

Mettez ce script dans un fichier nommé release.sh. Rendez-le exécutable et ajoutez son répertoire dans votre PATH ou déposez-le dans un sous-répertoire dédié aux scripts dans votre projet.