#!/usr/bin/env bash # Bash script to prepare a release using git-cliff. # Inspired by https://github.com/orhun/git-cliff/blob/main/release.sh # Check if a version tag is provided. if [ "$#" -eq 1 ]; then VERSION_TAG=$1 else # After git-cliff version 1.4.0 it should be possible to run `git cliff --bumped-version`. suggested_version=$(git cliff --unreleased --bump --context | jq -r .[0].version) echo -n "No version tag provided. git-cliff suggests $suggested_version. Proceed? [Y/n] " read user_input # Check if input is empty or a variation of "yes". if [[ -z "$user_input" || "$user_input" =~ ^[Yy](es)?$ ]]; then echo "Proceeding with version $suggested_version." VERSION_TAG=$suggested_version else echo "Release preparation cancelled." exit 1 fi fi # Update CHANGELOG. git cliff --tag "$VERSION_TAG" -o CHANGELOG.md # Add all changes and commit. git add -A git commit -m "🔖 chore(release): prepare for $VERSION_TAG" # Template for the tag description. export GIT_CLIFF_TEMPLATE="\ {% for group, commits in commits | group_by(attribute=\"group\") %}\ {{ group | striptags | trim | upper_first }}\ {% for commit in commits %}\ - {% if commit.breaking %}(**‼️BREAKING‼️**) {% endif %}{{ commit.message | upper_first }} ({{ commit.id | truncate(length=7, end=\"\") }})\ {% endfor %}\ {% endfor %}" # Generate the tag description. changelog=$(git cliff --tag "$VERSION_TAG" --unreleased --strip all) # Create a signed and annotated tag. git tag -s -a "$VERSION_TAG" -m "Release $VERSION_TAG" -m "$changelog" echo "Most recent commit:" git log -1 echo echo "Information for tag $VERSION_TAG:" git show $VERSION_TAG echo echo "Release $VERSION_TAG is ready. Don't forget to push the changes and the tag:" echo "git push && git push --tags"