aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2023-12-31 17:02:01 +0100
committerLinnea Gräf <nea@nea.moe>2023-12-31 17:26:35 +0100
commitc49b65835d37266508561e60782bda36275fb8ae (patch)
treed31fb088de4a3943507e5b9aeac914fa0cd4a79e /docs
parent2243f986a79bce295425fa5024b614bae64e7057 (diff)
downloadfirmament-c49b65835d37266508561e60782bda36275fb8ae.tar.gz
firmament-c49b65835d37266508561e60782bda36275fb8ae.tar.bz2
firmament-c49b65835d37266508561e60782bda36275fb8ae.zip
Add release script
Diffstat (limited to 'docs')
-rw-r--r--docs/How to release.md4
-rwxr-xr-xdocs/release_script.sh160
2 files changed, 163 insertions, 1 deletions
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 <nea@nea.moe>
+#
+# 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