Files
Beniamino Galvani 481afec6ea release: fix validation of gitlab token
If the token is wrong or expired, the command still returns
success. Check the content of the reply instead.

Fixes: f05192ada8 ('release.sh: release to freedesktop.org, not to GNOME')

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/2148
2025-03-25 14:35:55 +01:00

646 lines
26 KiB
Bash
Executable File

#!/bin/bash
# Script for doing NetworkManager releases.
#
# Run with --help for usage.
#
# There are 6 modes:
#
# - "devel" : on main branch to tag a devel release (e.g. "1.25.2-dev").
# - "rc1" : the first release candidate on "main" branch which branches off
# a new "nm-1-X" branch (e.g. tag "1.26-rc1" (1.25.90) and branch
# off "nm-1-26"). On main this also bumps the version number
# and creates a new devel release (e.g. "1.27.0-dev").
# - "rc" : further release candidates on RC branch (e.g. from "nm-1-26" branch
# tag "1.26-rc2" with version number 1.25.91).
# - "major" : on stable branch do a major release (e.g. on "nm-1-26" branch
# release "1.26.0").
# You should do a "major-post" release right a "major" release.
# - "major-post": after a "major" release, merge the release branch with main and
# do another devel snapshot on main (e.g. do "1.27.1-dev" release).
# - "minor" : on a stable branch do a minor release (e.g. "1.26.4" on "nm-1-26").
#
# Requisites:
#
# * You need to start with a clean working directory (git clean -fdx)
#
# * Run in a "clean" environment, i.e. no unusual environment variables set, on a recent
# Fedora, with suitable dependencies installed.
#
# * First, ensure that you have a valid Gitlab's private token for gitlab.freedestkop.org
# stored in ~/.config/nm-release-token, or pass one with --gitlab-token argument.
# Also, ensure you have a GPG key that you want to use for signing. Also, have gpg-agent running
# and possibly configure `git config --get user.signingkey` for the proper key.
#
# * Your git repository needs a remote "origin" that points to the upstream git repository
# (or set $ORIGIN) and use the standard git refs/remotes/$ORIGIN/ branch names.
#
# * All your (relevant) local branches (main and nm-1-*) must be up to date with their
# remote tracking branches for origin.
#
# Run with --no-test to do the actual release.
fail_msg() {
echo -n "FAIL: "
echo_color 31 "$@"
}
die() {
fail_msg "$@"
exit 1
}
echo_color() {
local color="$1"
shift
echo -e -n "\033[0;${color}m"
echo "$@"
echo -e -n '\033[0m'
}
print_usage() {
echo "Usage:"
echo " $BASH_SOURCE [devel|rc1|rc|major|major-post|minor]"
echo " [--no-test] \\"
echo " [--no-find-backports] \\"
echo " [--no-cleanup] \\"
echo " [--allow-local-branches] \\"
echo " [--no-check-gitlab] \\"
echo " [--no-check-news] \\"
echo " [--no-warn-publish-docs] \\"
echo " [--gitlab-token <private_gitlab_token>] \\"
}
die_help() {
print_usage
echo
sed -e '2,/^$/!d' -e 's/^#\($\| \)/ /' "$BASH_SOURCE"
exit 0
}
die_usage() {
echo -n "FAIL: "
echo_color 31 "$@"
echo
print_usage
exit 1
}
do_command() {
local color=36
if [ "$DRY_RUN" = 0 ]; then
color=31
fi
echo -n "COMMAND: "
echo_color $color -n "$@"
echo
if [ "$DRY_RUN" = 0 ]; then
"$@"
fi
}
SCRIPTDIR="$(dirname "$(readlink -f "$0")")"
GITDIR="$(cd "$SCRIPTDIR" && git rev-parse --show-toplevel || die "Could not get GITDIR")"
parse_version() {
local VERSION=$(grep -E -m1 '^\s+version:' "$GITDIR/meson.build" \
| cut -d"'" -f2 \
| sed 's/\./ /g')
re='^(0|[1-9][0-9]*) (0|[1-9][0-9]*) (0|[1-9][0-9]*)$'
[[ "$VERSION" =~ $re ]] || return 1
echo "$VERSION"
}
number_is_even() {
local re='^[0-9]*[02468]$'
[[ "$1" =~ $re ]]
}
number_is_odd() {
local re='^[0-9]*[13579]$'
[[ "$1" =~ $re ]]
}
git_same_ref() {
local a="$(git rev-parse "$1" 2>/dev/null)" || return 1
local b="$(git rev-parse "$2" 2>/dev/null)" || return 1
[ "$a" = "$b" ]
}
check_gitlab_pipeline() {
local BRANCH="$1"
local SHA="$2"
local PIPELINE_ID
PIPELINE_ID="$(curl --no-progress-meter "https://gitlab.freedesktop.org/api/v4/projects/411/pipelines?ref=$BRANCH&sha=$SHA&source=push&order_by=id" 2>/dev/null | jq '.[0].id')"
if ! [[ $PIPELINE_ID =~ [0-9]+ ]] ; then
echo "Cannot find pipeline for branch $BRANCH. Check \"https://gitlab.freedesktop.org/NetworkManager/NetworkManager/pipelines?page=1&scope=branches&ref=$BRANCH\""
return 1
fi
PIPELINE_STATUSES="$(curl --no-progress-meter "https://gitlab.freedesktop.org/api/v4/projects/411/pipelines/$PIPELINE_ID/jobs?per_page=100" 2>/dev/null | jq '.[] | select(.stage!="prep" and .stage!="tier3") | .status')"
if ! echo "$PIPELINE_STATUSES" | grep -q '^"success"$' ; then
echo "Cannot find successful jobs for branch $BRANCH. Check \"https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/pipelines/$PIPELINE_ID\""
return 1
fi
if echo "$PIPELINE_STATUSES" | grep -q -v '^"success"$' ; then
echo "Seems not all jobs for $BRANCH ran (or were successfull). Check \"https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/pipelines/$PIPELINE_ID\""
return 1
fi
return 0
}
set_version_number() {
sed -i \
-e '1,20 s/^\( *version: *'\''\)[0-9]\+\.[0-9]\+\.[0-9]\+\('\'',\)$/\1'"$1.$2.$3"'\2/' \
meson.build
}
check_news() {
local mode="$1"
shift
local ver_arr=("$@")
case "$mode" in
major|minor)
if git grep -q 'NOT RECOMMENDED FOR PRODUCTION USE' -- ./NEWS ; then
return 1
fi
;;
*)
;;
esac
return 0
}
DO_CLEANUP=1
CLEANUP_CHECKOUT_BRANCH=
CLEANUP_REFS=()
cleanup() {
if [ $DO_CLEANUP = 1 ]; then
[ -n "$CLEANUP_CHECKOUT_BRANCH" ] && git checkout -f "$CLEANUP_CHECKOUT_BRANCH"
for c in "${CLEANUP_REFS[@]}"; do
echo "delete reference. Restore with $(echo_color 36 -n git update-ref \"$c\" $(git rev-parse "$c"))"
git update-ref -d "$c"
done
fi
}
trap cleanup EXIT
DIR="$(git rev-parse --show-toplevel)"
ORIGIN=origin
BASH_SOURCE_ABSOLUTE="$(readlink -f "$BASH_SOURCE")"
test -d "$DIR" &&
cd "$DIR" &&
test -f ./contrib/fedora/rpm/build_clean.sh || die "cannot find NetworkManager base directory"
RELEASE_MODE=""
DRY_RUN=1
FIND_BACKPORTS=1
ALLOW_LOCAL_BRANCHES=0
HELP_AND_EXIT=1
CHECK_GITLAB=1
WARN_PUBLISH_DOCS=1
CHECK_NEWS=1
while [ "$#" -ge 1 ]; do
A="$1"
shift
HELP_AND_EXIT=0
case "$A" in
--no-test)
DRY_RUN=0
;;
--no-find-backports)
FIND_BACKPORTS=0
;;
--no-cleanup)
DO_CLEANUP=0
;;
--allow-local-branches)
# by default, the script errors out if the relevant branch (main, nm-1-Y) are not the same
# as the remote branch on origin. You should not do a release if you have local changes
# that differ from upstream. Set this flag to override that check.
ALLOW_LOCAL_BRANCHES=1
;;
--no-check-gitlab)
CHECK_GITLAB=0
;;
--no-warn-publish-docs)
WARN_PUBLISH_DOCS=0
;;
--no-check-news)
CHECK_NEWS=0
;;
--help|-h)
die_help
;;
--gitlab-token)
[ "$#" -ge 1 ] || die_usage "provide a value for --gitlab-token"
GITLAB_TOKEN="$1"
shift
;;
devel|rc1|rc|major|major-post|minor)
[ -z "$RELEASE_MODE" ] || die_usage "duplicate release-mode"
RELEASE_MODE="$A"
;;
*)
die_usage "unknown argument \"$A\""
;;
esac
done
[ "$HELP_AND_EXIT" = 1 ] && die_help
[ -n "$RELEASE_MODE" ] || die_usage "specify the desired release mode"
VERSION_ARR=( $(parse_version) ) || die "cannot detect NetworkManager version"
VERSION_STR="$(IFS=.; echo "${VERSION_ARR[*]}")"
echo "Current version before release: $VERSION_STR (do \"$RELEASE_MODE\" release)"
grep -q "version: '${VERSION_ARR[0]}.${VERSION_ARR[1]}.${VERSION_ARR[2]}'," ./meson.build || die "meson.build does not have expected version"
TMP="$(git status --porcelain)" || die "git status failed"
test -z "$TMP" || die "git working directory is not clean (git status --porcelain)"
TMP="$(LANG=C git clean -ndx)" || die "git clean -ndx failed"
test -z "$TMP" || die "git working directory is not clean? (git clean -ndx)"
CUR_BRANCH="$(git rev-parse --abbrev-ref HEAD)"
CUR_HEAD="$(git rev-parse HEAD)"
TMP_BRANCH=release-branch
if [ "$CUR_BRANCH" = main ]; then
number_is_odd "${VERSION_ARR[1]}" || die "Unexpected version number on main. Should be an odd development version"
[ "$RELEASE_MODE" = devel -o "$RELEASE_MODE" = rc1 -o "$RELEASE_MODE" = major-post ] || die "Unexpected branch name \"$CUR_BRANCH\" for \"$RELEASE_MODE\""
else
re='^nm-[0-9]+-[0-9]+$'
[[ "$CUR_BRANCH" =~ $re ]] || die "Unexpected current branch $CUR_BRANCH. Should be main or nm-?-??"
if number_is_odd "${VERSION_ARR[1]}"; then
# we are on a release candiate branch.
[ "$RELEASE_MODE" = rc -o "$RELEASE_MODE" = major ] || die "Unexpected branch name \"$CUR_BRANCH\" for \"$RELEASE_MODE\""
[ "$CUR_BRANCH" == "nm-${VERSION_ARR[0]}-$((${VERSION_ARR[1]} + 1))" ] || die "Unexpected current branch $CUR_BRANCH. Should be nm-${VERSION_ARR[0]}-$((${VERSION_ARR[1]} + 1))"
else
[ "$RELEASE_MODE" = minor ] || die "Unexpected branch name \"$CUR_BRANCH\" for \"$RELEASE_MODE\""
[ "$CUR_BRANCH" == "nm-${VERSION_ARR[0]}-${VERSION_ARR[1]}" ] || die "Unexpected current branch $CUR_BRANCH. Should be nm-${VERSION_ARR[0]}-${VERSION_ARR[1]}"
fi
fi
RC_VERSION=
RELEASE_BRANCH=
case "$RELEASE_MODE" in
minor)
number_is_even "${VERSION_ARR[1]}" || die "cannot do minor release on top of version $VERSION_STR"
[ "$CUR_BRANCH" != main ] || die "cannot do a minor release on main"
;;
devel)
number_is_odd "${VERSION_ARR[1]}" || die "cannot do devel release on top of version $VERSION_STR"
[ "$((${VERSION_ARR[2]} + 1))" -lt 90 ] || die "devel release must have a micro version smaller than 90 but current version is $VERSION_STR"
[ "$CUR_BRANCH" == main ] || die "devel release can only be on main"
;;
rc)
number_is_odd "${VERSION_ARR[1]}" || die "cannot do rc release on top of version $VERSION_STR"
[ "${VERSION_ARR[2]}" -ge 90 ] || die "rc release must have a micro version larger than ${VERSION_ARR[0]}.90 but current version is $VERSION_STR"
RC_VERSION="$((${VERSION_ARR[2]} - 88))"
[ "$CUR_BRANCH" == "nm-${VERSION_ARR[0]}-$((${VERSION_ARR[1]} + 1))" ] || die "devel release can only be on \"nm-${VERSION_ARR[0]}-$((${VERSION_ARR[1]} + 1))\" branch"
;;
rc1)
number_is_odd "${VERSION_ARR[1]}" || die "cannot do rc release on top of version $VERSION_STR"
[ "${VERSION_ARR[2]}" -lt 90 ] || die "rc release must have a micro version smaller than ${VERSION_ARR[0]}.${VERSION_ARR[1]}.90 but current version is $VERSION_STR"
[ "$CUR_BRANCH" == main ] || die "rc1 release can only be on main"
RELEASE_BRANCH="nm-${VERSION_ARR[0]}-$((${VERSION_ARR[1]} + 1))"
;;
major)
number_is_odd "${VERSION_ARR[1]}" || die "cannot do major release on top of version $VERSION_STR"
[ "${VERSION_ARR[2]}" -ge 90 ] || die "parent version for major release must have a micro version larger than ${VERSION_ARR[0]}.90 but current version is $VERSION_STR"
[ "$CUR_BRANCH" == "nm-${VERSION_ARR[0]}-$((${VERSION_ARR[1]} + 1))" ] || die "major release can only be on \"nm-${VERSION_ARR[0]}-$((${VERSION_ARR[1]} + 1))\" branch"
;;
major-post)
number_is_odd "${VERSION_ARR[1]}" || die "cannot do major-post release on top of version $VERSION_STR"
[ "$((${VERSION_ARR[2]} + 1))" -lt 90 ] || die "major-post release must have a micro version smaller than 90 but current version is $VERSION_STR"
[ "$CUR_BRANCH" == main ] || die "major-post release can only be on main"
;;
*)
die "Release mode $RELEASE_MODE not yet implemented"
;;
esac
git fetch "$ORIGIN" || die "git fetch failed"
if [ "$ALLOW_LOCAL_BRANCHES" != 1 ]; then
git_same_ref "$CUR_BRANCH" "refs/heads/$CUR_BRANCH" || die "Current branch $CUR_BRANCH is not a branch??"
git_same_ref "$CUR_BRANCH" "refs/remotes/$ORIGIN/$CUR_BRANCH" || die "Current branch $CUR_BRANCH seems not up to date with refs/remotes/$ORIGIN/$CUR_BRANCH. Git pull or --allow-local-branches?"
fi
NEWER_BRANCHES=()
if [ "$CUR_BRANCH" != main ]; then
i="${VERSION_ARR[1]}"
while : ; do
i=$((i + 2))
b="nm-${VERSION_ARR[0]}-$i"
if ! git show-ref --verify --quiet "refs/remotes/$ORIGIN/$b"; then
git show-ref --verify --quiet "refs/heads/$b" && die "unexpectedly branch $b exists"
break
fi
if [ "$ALLOW_LOCAL_BRANCHES" != 1 ]; then
git_same_ref "$b" "refs/heads/$b" || die "branch $b is not a branch??"
git_same_ref "$b" "refs/remotes/$ORIGIN/$b" || die "branch $b seems not up to date with refs/remotes/$ORIGIN/$b. Git pull or --allow-local-branches?"
fi
NEWER_BRANCHES+=("refs/heads/$b")
done
b=main
if [ "$ALLOW_LOCAL_BRANCHES" != 1 ]; then
git_same_ref "$b" "refs/heads/$b" || die "branch $b is not a branch??"
git_same_ref "$b" "refs/remotes/$ORIGIN/$b" || die "branch $b seems not up to date with refs/remotes/$ORIGIN/$b. Git pull or --allow-local-branches?"
fi
fi
if [ -n "$RELEASE_BRANCH" ]; then
git show-ref --verify --quiet "refs/remotes/$ORIGIN/$RELEASE_BRANCH" && die "release branch refs/remotes/$ORIGIN/$RELEASE_BRANCH unexpectedly exists already"
git show-ref --verify --quiet "refs/heads/$RELEASE_BRANCH" && die "release branch refs/heads/$RELEASE_BRANCH unexpectedly exists already"
fi
if [ "$ALLOW_LOCAL_BRANCHES" != 1 ]; then
cmp <(git show "$ORIGIN/main:contrib/fedora/rpm/release.sh") "$BASH_SOURCE_ABSOLUTE" || die "$BASH_SOURCE is not identical to \`git show \"$ORIGIN/main:contrib/fedora/rpm/release.sh\"\`"
fi
if ! check_news "$RELEASE_MODE" "@{VERSION_ARR[@]}" ; then
if [ "$CHECK_NEWS" == 1 ]; then
die "NEWS file needs update to mention stable release (skip check with --no-check-news)"
fi
echo "WARNING: NEWS file needs update to mention stable release (test skipped with --no-check-news)"
fi
if [ "$RELEASE_MODE" = major -o "$RELEASE_MODE" = minor ]; then
echo
latest=
if [ "$RELEASE_MODE" = major ]; then
echo "Note that after the new major you have to publish the new documentation on"
latest=" -l"
else
echo "Note that after the stable release you maybe should publish the new documentation on"
latest=" [-l]"
fi
echo "$(echo_color 36 -n "https://gitlab.freedesktop.org/NetworkManager/networkmanager.pages.freedesktop.org.git") by running"
if [ "$RELEASE_MODE" = major ]; then
v="${VERSION_ARR[0]}.$((${VERSION_ARR[1]} + 1)).0"
else
v="${VERSION_ARR[0]}.${VERSION_ARR[1]}.$((${VERSION_ARR[2]} + 1))"
fi
echo " \`$(echo_color 36 -n "./scripts/import-docs.sh $v$latest")\`"
echo
if [ $WARN_PUBLISH_DOCS = 1 ]; then
echo "Avoid this prompt via \"--no-warn-publish-docs\""
read -p "Please confirm that you know [ENTER] "
fi
fi
if [ $FIND_BACKPORTS = 1 ]; then
git show "$ORIGIN/main:contrib/scripts/find-backports" > ./.git/nm-find-backports \
&& chmod +x ./.git/nm-find-backports \
|| die "cannot get contrib/scripts/find-backports"
TMP="$(./.git/nm-find-backports "$CUR_BRANCH" main "${NEWER_BRANCHES[@]}" 2>/dev/null)" || die "nm-find-backports failed"
test -z "$TMP" || die "nm-find-backports returned patches that need to be backported (ignore with --no-find-backports): ./.git/nm-find-backports \"$CUR_BRANCH\" main ${NEWER_BRANCHES[@]}"
fi
if [ $CHECK_GITLAB = 1 ]; then
if ! check_gitlab_pipeline "$CUR_BRANCH" "$CUR_HEAD" ; then
echo "Check the pipelines for branch \"$CUR_BRANCH\" at https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/pipelines?ref=$CUR_BRANCH&source=push"
echo "Wait for pipeline with \`ci-fairy wait-for-pipeline --project NetworkManager/NetworkManager --sha \"$CUR_HEAD\"\`"
die "It seems not all gitlab-ci jobs were running/succeeding. Skip this check with --no-check-gitlab"
fi
fi
BRANCHES=()
BUILD_TAG=
CLEANUP_CHECKOUT_BRANCH="$CUR_BRANCH"
git checkout -B "$TMP_BRANCH"
CLEANUP_REFS+=("refs/heads/$TMP_BRANCH")
case "$RELEASE_MODE" in
minor)
set_version_number "${VERSION_ARR[0]}" "${VERSION_ARR[1]}" $(("${VERSION_ARR[2]}" + 1))
git commit -m "release: bump version to ${VERSION_ARR[0]}.${VERSION_ARR[1]}.$(("${VERSION_ARR[2]}" + 1))" -a || die "failed to commit release"
b="${VERSION_ARR[0]}.${VERSION_ARR[1]}.$(("${VERSION_ARR[2]}" + 1))"
git tag -s -a -m "Tag $b" "$b" HEAD || die "failed to tag release"
BRANCHES+=("$b")
CLEANUP_REFS+=("refs/tags/$b")
BUILD_TAG="$b"
TAR_VERSION="$b"
;;
devel)
set_version_number "${VERSION_ARR[0]}" "${VERSION_ARR[1]}" $(("${VERSION_ARR[2]}" + 1))
git commit -m "release: bump version to ${VERSION_ARR[0]}.${VERSION_ARR[1]}.$(("${VERSION_ARR[2]}" + 1)) (development)" -a || die "failed to commit devel version bump"
b="${VERSION_ARR[0]}.${VERSION_ARR[1]}.$(("${VERSION_ARR[2]}" + 1))"
git tag -s -a -m "Tag $b (development)" "$b-dev" HEAD || die "failed to tag release"
BRANCHES+=("$b-dev")
CLEANUP_REFS+=("refs/tags/$b-dev")
BUILD_TAG="$b-dev"
TAR_VERSION="$b"
;;
rc)
b="${VERSION_ARR[0]}.${VERSION_ARR[1]}.$(("${VERSION_ARR[2]}" + 1))"
t="${VERSION_ARR[0]}.$(("${VERSION_ARR[1]}" + 1))-rc$RC_VERSION"
set_version_number "${VERSION_ARR[0]}" "${VERSION_ARR[1]}" $(("${VERSION_ARR[2]}" + 1))
git commit -m "release: bump version to $b ($t) (development)" -a || die "failed to commit rc version bump"
git tag -s -a -m "Tag $b ($t) (development)" "$t" HEAD || die "failed to tag release"
BRANCHES+=("$t")
CLEANUP_REFS+=("refs/tags/$t")
BUILD_TAG="$t"
TAR_VERSION="$b"
;;
rc1)
set_version_number "${VERSION_ARR[0]}" "${VERSION_ARR[1]}" 90
b="${VERSION_ARR[0]}.${VERSION_ARR[1]}.90"
t="${VERSION_ARR[0]}.$(("${VERSION_ARR[1]}" + 1))-rc1"
git commit -m "release: bump version to $b ($t)" -a || die "failed to commit rc1 version bump"
git tag -s -a -m "Tag $b ($t) (development)" "$t" HEAD || die "failed to tag release $t"
BRANCHES+=("$t")
CLEANUP_REFS+=("refs/tags/$t")
BUILD_TAG="$t"
TAR_VERSION="$b"
;;
major)
b="${VERSION_ARR[0]}.$((${VERSION_ARR[1]} + 1)).0"
set_version_number "${VERSION_ARR[0]}" "$((${VERSION_ARR[1]} + 1))" 0
git commit -m "release: bump version to $b" -a || die "failed to commit major version bump"
git tag -s -a -m "Tag $b" "$b" HEAD || die "failed to tag release"
BRANCHES+=("$b")
CLEANUP_REFS+=("refs/tags/$b")
BUILD_TAG="$b"
TAR_VERSION="$b"
;;
major-post)
# We create a merge commit with the content of current "main", with two
# parent commits $THE_RELEASE and "main". But we want that the first parent
# is the release, so that `git log --first-parent` follows the path with the
# release candidates, and not the devel part during that time. Hence this
# switcheroo here.
git checkout -B "$TMP_BRANCH" "${VERSION_ARR[0]}.$((${VERSION_ARR[1]} - 1)).0" || die "merge0"
git merge -Xours --commit -m tmp main || die "merge1"
git rm --cached -r . || die "merge2"
git checkout main -- . || die "merge3"
b="${VERSION_ARR[0]}.${VERSION_ARR[1]}.$((${VERSION_ARR[2]} + 1))"
git commit --amend -m tmp -a || die "failed to commit major version bump"
test x = "x$(git diff main HEAD)" || die "there is a diff after merge!"
set_version_number "${VERSION_ARR[0]}" "${VERSION_ARR[1]}" "$((${VERSION_ARR[2]} + 1))"
git commit --amend -m "release: bump version to $b (development)" -a || die "failed to commit major version bump"
git tag -s -a -m "Tag $b (development)" "$b-dev" HEAD || die "failed to tag release"
BRANCHES+=("$b-dev")
CLEANUP_REFS+=("refs/tags/$b-dev")
BUILD_TAG="$b-dev"
TAR_VERSION="$b"
;;
*)
die "Release mode $RELEASE_MODE not yet implemented"
;;
esac
build_tag() {
local BUILD_TAG="$1"
local TAR_FILE="NetworkManager-$2.tar.xz"
local SUM_FILE="$TAR_FILE.sha256sum"
git checkout "$BUILD_TAG" || die "failed to checkout $BUILD_TAG"
./contrib/fedora/rpm/build_clean.sh -r || die "build release failed"
cp "./build/meson-dist/$TAR_FILE" /tmp/ || die "failed to copy $TAR_FILE to /tmp"
cp "./build/meson-dist/$SUM_FILE" /tmp/ || die "failed to copy $SUM_FILE to /tmp"
git clean -fdx
}
RELEASE_TAR_VERSIONS=()
RELEASE_TAGS=()
if [ -n "$BUILD_TAG" ]; then
build_tag "$BUILD_TAG" "$TAR_VERSION"
RELEASE_TAR_VERSIONS+=("$TAR_VERSION")
RELEASE_TAGS+=("$BUILD_TAG")
fi
git checkout -B "$CUR_BRANCH" "$TMP_BRANCH" || die "cannot checkout $CUR_BRANCH"
BRANCHES+=( "$CUR_BRANCH" )
if [ "$RELEASE_MODE" = rc1 ]; then
git branch "$RELEASE_BRANCH" "$TMP_BRANCH" || die "cannot checkout $CUR_BRANCH"
BRANCHES+=( "$RELEASE_BRANCH" )
CLEANUP_REFS+=( "refs/heads/$RELEASE_BRANCH" )
git checkout "$TMP_BRANCH"
b="${VERSION_ARR[0]}.$((${VERSION_ARR[1]} + 2)).0"
set_version_number "${VERSION_ARR[0]}" "$((${VERSION_ARR[1]} + 2))" 0
git commit -m "release: bump version to $b (development)" -a || die "failed to commit devel version bump"
git tag -s -a -m "Tag $b (development)" "$b-dev" HEAD || die "failed to tag release"
BRANCHES+=("$b-dev")
CLEANUP_REFS+=("refs/tags/$b-dev")
BUILD_TAG="$b-dev"
TAR_VERSION="$b"
build_tag "$BUILD_TAG" "$TAR_VERSION"
RELEASE_TAR_VERSIONS+=("$TAR_VERSION")
RELEASE_TAGS+=("$BUILD_TAG")
git checkout -B "$CUR_BRANCH" "$TMP_BRANCH" || die "cannot checkout $CUR_BRANCH"
fi
if [[ $GITLAB_TOKEN == "" ]]; then
[[ -r ~/.config/nm-release-token ]] || die "cannot read ~/.config/nm-release-token"
GITLAB_TOKEN=$(< ~/.config/nm-release-token)
fi
# This step is not necessary for authentication, we use it only to provide a meaningful error message.
GITLAB_USER_ID=$(curl --request GET --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
"https://gitlab.freedesktop.org/api/v4/personal_access_tokens/self" 2>/dev/null | jq ".user_id" || true)
if [ -z "$GITLAB_USER_ID" ] || [ "$GITLAB_USER_ID" = "null" ]; then
die "failed to authenticate to gitlab.freedesktop.org with the private token"
fi
do_command git push "$ORIGIN" "${BRANCHES[@]}" || die "failed to to push branches ${BRANCHES[@]} to $ORIGIN"
CREATE_RELEASE_FAIL=0
for I in "${!RELEASE_TAR_VERSIONS[@]}"; do
TAR_FILE="NetworkManager-${RELEASE_TAR_VERSIONS[$I]}.tar.xz"
SUM_FILE="$TAR_FILE.sha256sum"
BUILD_TAG="${RELEASE_TAGS["$I"]}"
FAIL=0
# upload tarball and checksum file as generic packages
for F in "$TAR_FILE" "$SUM_FILE"; do
do_command curl --location --fail-with-body --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
--upload-file "/tmp/$F" \
"https://gitlab.freedesktop.org/api/v4/projects/411/packages/generic/NetworkManager/$BUILD_TAG/$F" \
|| FAIL=1
if [[ $FAIL = 1 ]]; then
fail_msg "failed to upload $F"
CREATE_RELEASE_FAIL=1
break
fi
done
[[ $FAIL = 1 ]] && continue
# create release
do_command curl --location --header 'Content-Type: application/json' --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
--request POST "https://gitlab.freedesktop.org/api/v4/projects/411/releases" \
--data "$(cat <<END
{
"name": "NetworkManager $BUILD_TAG",
"tag_name": "$BUILD_TAG",
"assets": {
"links": [
{
"name": "NetworkManager $BUILD_TAG tarball with docs",
"url": "https://gitlab.freedesktop.org/api/v4/projects/411/packages/generic/NetworkManager/$BUILD_TAG/$TAR_FILE",
"direct_asset_path": "/$TAR_FILE",
"link_type":"package"
},
{
"name": "NetworkManager $BUILD_TAG tarball sha256sum",
"url": "https://gitlab.freedesktop.org/api/v4/projects/411/packages/generic/NetworkManager/$BUILD_TAG/$SUM_FILE",
"direct_asset_path": "/$SUM_FILE",
"link_type":"package"
},
{
"name": "NEWS",
"url": "https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/$BUILD_TAG/NEWS?ref_type=tags",
"direct_asset_path": "/NEWS",
"link_type":"other"
}
]
}
}
END
)" || FAIL=1
if [[ $? != 0 ]]; then
fail_msg "failed to create NetworkManager $BUILD_TAG release"
CREATE_RELEASE_FAIL=1
continue
fi
done
CLEANUP_CHECKOUT_BRANCH=
if [ "$DRY_RUN" = 0 ]; then
CLEANUP_REFS=()
git branch -D "$TMP_BRANCH"
else
H="$(git rev-parse "$CUR_BRANCH")"
git checkout -B "$CUR_BRANCH" "$CUR_HEAD" || die "cannot reset $CUR_BRANCH to $CUR_HEAD"
echo "delete reference. Restore with $(echo_color 36 -n git checkout -B "\"$CUR_BRANCH\"" "$H")"
fi
if [[ $CREATE_RELEASE_FAIL == 1 ]]; then
die "failed creating the release at gitlab.freedesktop.org. This was the last step, create it manually from the web UI"
fi