From c49b65835d37266508561e60782bda36275fb8ae Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Sun, 31 Dec 2023 17:02:01 +0100 Subject: Add release script --- docs/How to release.md | 4 +- docs/release_script.sh | 160 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+), 1 deletion(-) create mode 100755 docs/release_script.sh diff --git a/docs/How to release.md b/docs/How to release.md index 862f382..d0d51d4 100644 --- a/docs/How to release.md +++ b/docs/How to release.md @@ -6,10 +6,12 @@ SPDX-License-Identifier: CC0-1.0 # How to create a release +There is a release script to automate some of these actions. + - Bump the version on gradle.properties - Create a tag with that same version (without `v` prefix, please) - Create a changelog based on - `git log --pretty=' - %s' --grep '[no changelog]' --invert-grep --fixed-strings oldversion..newversion | tac`, while + `git log --pretty='- %s' --grep '[no changelog]' --invert-grep --fixed-strings oldversion..newversion | tac`, while filtering out commits that should not be in the changelog. - Upload to [GitHub](https://github.com/romangraef/Firmament/releases/new) - Upload to [Modrinth](https://modrinth.com/mod/firmament/versions) diff --git a/docs/release_script.sh b/docs/release_script.sh new file mode 100755 index 0000000..4573551 --- /dev/null +++ b/docs/release_script.sh @@ -0,0 +1,160 @@ +#!/usr/bin/env bash +# SPDX-FileCopyrightText: 2023 Linnea Gräf +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# ARG_OPTIONAL_BOOLEAN([no-check],[n],[Skip checking preconditions, such as a clean git working directory]) +# ARG_HELP([Script to help creating releases]) +# ARGBASH_GO() +# needed because of Argbash --> m4_ignore([ +### START OF CODE GENERATED BY Argbash v2.10.0 one line above ### +# Argbash is a bash code generator used to get arguments parsing right. +# Argbash is FREE SOFTWARE, see https://argbash.io for more info + + +die() +{ + local _ret="${2:-1}" + test "${_PRINT_HELP:-no}" = yes && print_help >&2 + echo "$1" >&2 + exit "${_ret}" +} + + +begins_with_short_option() +{ + local first_option all_short_options='nh' + first_option="${1:0:1}" + test "$all_short_options" = "${all_short_options/$first_option/}" && return 1 || return 0 +} + +# THE DEFAULTS INITIALIZATION - OPTIONALS +_arg_no_check="off" + + +print_help() +{ + printf '%s\n' "Script to help creating releases" + printf 'Usage: %s [-n|--(no-)no-check] [-h|--help]\n' "$0" + printf '\t%s\n' "-n, --no-check, --no-no-check: Skip checking preconditions, such as a clean git working directory (off by default)" + printf '\t%s\n' "-h, --help: Prints help" +} + + +parse_commandline() +{ + while test $# -gt 0 + do + _key="$1" + case "$_key" in + -n|--no-no-check|--no-check) + _arg_no_check="on" + test "${1:0:5}" = "--no-" && _arg_no_check="off" + ;; + -n*) + _arg_no_check="on" + _next="${_key##-n}" + if test -n "$_next" -a "$_next" != "$_key" + then + { begins_with_short_option "$_next" && shift && set -- "-n" "-${_next}" "$@"; } || die "The short option '$_key' can't be decomposed to ${_key:0:2} and -${_key:2}, because ${_key:0:2} doesn't accept value and '-${_key:2:1}' doesn't correspond to a short option." + fi + ;; + -h|--help) + print_help + exit 0 + ;; + -h*) + print_help + exit 0 + ;; + *) + _PRINT_HELP=yes die "FATAL ERROR: Got an unexpected argument '$1'" 1 + ;; + esac + shift + done +} + +parse_commandline "$@" + +# OTHER STUFF GENERATED BY Argbash + +### END OF CODE GENERATED BY Argbash (sortof) ### ]) +# [ <-- needed because of Argbash +set -euo pipefail + +REMOTE=origin +BRANCH=master + +basedir="$(dirname "$(dirname "$(realpath "$0")")")" +echo "Found base directory at $basedir" + +if ! [ -d "$basedir/.git" ]; then + echo Could not find git directory. + exit 1 +fi + +if [ -n "$(git status --porcelain)" ] && [ "$_arg_no_check" == off ]; then + echo Unclean git working environment + exit 1 +fi + +if ! [[ "$(git rev-parse --abbrev-ref HEAD)" = "$BRANCH" ]]; then + echo "Not on branch $BRANCH." + exit 1 +fi + +git fetch --tags "$REMOTE" + +git tag --list --sort=taggerdate + +oldversion="$(git tag --list --sort=taggerdate | tail -n1)" + +echo "Choosing old version as $oldversion" + +echo -n "Choosing next version as: " +read newversion +echo "Confirming new version as $newversion" + +echo Editing gradle.properties +sed -i -E 's/(mod_version *= *).*/\1'"$newversion"'/' "$basedir"/gradle.properties +git add gradle.properties +echo Committing release commit +git commit -m 'Prepare release '"$newversion"' + +[no changelog]' +echo Tagging release commit +git tag "$newversion" +releasenotes="$basedir/build/releasenotes.md" + +echo Building release notes +echo "**Full Changelog**: https://github.com/nea89o/Firmament/compare/$oldversion...$newversion" > "$releasenotes" +echo >> "$releasenotes" +git log --pretty='- %s' --grep '[no changelog]' --invert-grep --fixed-strings "$oldversion..$newversion" | tac >> "$releasenotes" +echo >> "$releasenotes" + +echo Building JAR +"$basedir"/gradlew clean build + +echo Release notes: +echo ---------------------------------------------- +cat "$releasenotes" +echo ---------------------------------------------- + +echo Pushing to github +git push "$REMOTE" "$BRANCH" "$newversion" + +if command -v gh; then + echo Creating github release + (set -x; gh release create "$newversion" -F "$releasenotes" "$basedir/build/libs/Firmament-$newversion.jar") +else + echo Could not find github command utility. Opening github releases + xdg-open "https://github.com/nea89o/firmament/releases/new" +fi + +echo Opening modrinth releases +xdg-open "https://modrinth.com/mod/firmament/versions" + +echo "Don't forget to upload a discord release as well:" + +# ] <-- needed because of Argbash -- cgit