181 lines
6.9 KiB
Bash
Executable File
181 lines
6.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
REPO="${1}"
|
|
EVENT_NAME="${2}"
|
|
EVENT_TYPE="${3}"
|
|
EVENT_VERSION="${4}"
|
|
RELEASE_TEST="${5}"
|
|
|
|
##############################################################
|
|
# Version validation functions
|
|
|
|
check_version_format() {
|
|
if ! echo "${EVENT_VERSION}" | grep -qE '^v[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+$'; then
|
|
echo "::error::The supplied version (${EVENT_VERSION}) is not a valid version string."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
patch_is_zero() {
|
|
if ! echo "${EVENT_VERSION}" | grep -qE '^v[[:digit:]]+\.[[:digit:]]+\.0$'; then
|
|
echo "::error::The patch number for a ${EVENT_TYPE} build must be 0."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
minor_is_zero() {
|
|
if ! echo "${EVENT_VERSION}" | grep -qE '^v[[:digit:]]+\.0'; then
|
|
echo "::error::The minor version number for a ${EVENT_TYPE} build must be 0."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
major_matches() {
|
|
current_major="$(cut -f 1 -d '-' packaging/version | cut -f 1 -d '.' | cut -f 2 -d 'v')"
|
|
target_major="$(echo "${EVENT_VERSION}" | cut -f 1 -d '.' | cut -f 2 -d 'v')"
|
|
|
|
if [ "${target_major}" != "${current_major}" ]; then
|
|
echo "::error::Major version mismatch, expected ${current_major} but got ${target_major}."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
minor_matches() {
|
|
current_minor="$(cut -f 1 -d '-' packaging/version | cut -f 2 -d '.')"
|
|
target_minor="$(echo "${EVENT_VERSION}" | cut -f 2 -d '.')"
|
|
|
|
if [ "${target_minor}" != "${current_minor}" ]; then
|
|
echo "::error::Minor version mismatch, expected ${current_minor} but got ${target_minor}."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
check_for_existing_tag() {
|
|
if git tag | grep -qE "^${EVENT_VERSION}$"; then
|
|
echo "::error::A tag for version ${EVENT_VERSION} already exists."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
check_newer_major_version() {
|
|
current="$(cut -f 1 -d '-' packaging/version | cut -f 1 -d '.' | cut -f 2 -d 'v')"
|
|
target="$(echo "${EVENT_VERSION}" | cut -f 1 -d '.' | cut -f 2 -d 'v')"
|
|
|
|
if [ "${target}" -le "${current}" ]; then
|
|
echo "::error::Version ${EVENT_VERSION} is not newer than the current version."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
check_newer_minor_version() {
|
|
current="$(cut -f 1 -d '-' packaging/version | cut -f 2 -d '.')"
|
|
target="$(echo "${EVENT_VERSION}" | cut -f 2 -d '.')"
|
|
|
|
if [ "${target}" -le "${current}" ]; then
|
|
echo "::error::Version ${EVENT_VERSION} is not newer than the current version."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
check_newer_patch_version() {
|
|
current="$(cut -f 1 -d '-' packaging/version | cut -f 3 -d '.')"
|
|
target="$(echo "${EVENT_VERSION}" | cut -f 3 -d '.')"
|
|
|
|
if [ "${target}" -le "${current}" ]; then
|
|
echo "::error::Version ${EVENT_VERSION} is not newer than the current version."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
##############################################################
|
|
# Core logic
|
|
|
|
git config user.name "netdatabot"
|
|
git config user.email "bot@netdata.cloud"
|
|
|
|
if [ "${REPO}" != "netdata/netdata" ] && [ -z "${RELEASE_TEST}" ]; then
|
|
echo "::notice::Not running in the netdata/netdata repository, not queueing a release build."
|
|
echo "run=false" >> "${GITHUB_OUTPUT}"
|
|
elif [ "${EVENT_NAME}" = 'schedule' ] || [ "${EVENT_TYPE}" = 'nightly' ]; then
|
|
echo "::notice::Preparing a nightly release build."
|
|
LAST_TAG=$(git describe --abbrev=0 --tags)
|
|
COMMITS_SINCE_RELEASE=$(git rev-list "${LAST_TAG}"..HEAD --count)
|
|
NEW_VERSION="${LAST_TAG}-$((COMMITS_SINCE_RELEASE + 1))-nightly"
|
|
LAST_VERSION_COMMIT="$(git rev-list -1 HEAD packaging/version)"
|
|
HEAD_COMMIT="$(git rev-parse HEAD)"
|
|
if [ "${EVENT_NAME}" = 'schedule' ] && [ "${LAST_VERSION_COMMIT}" = "${HEAD_COMMIT}" ] && grep -qE '.*-nightly$' packaging/version; then
|
|
echo "::notice::No commits since last nightly build, not publishing a new nightly build."
|
|
echo "run=false" >> "${GITHUB_OUTPUT}"
|
|
else
|
|
echo "${NEW_VERSION}" > packaging/version || exit 1
|
|
# shellcheck disable=SC2129
|
|
echo "run=true" >> "${GITHUB_OUTPUT}"
|
|
echo "message=Update changelog and version for nightly build: ${NEW_VERSION}." >> "${GITHUB_OUTPUT}"
|
|
echo "ref=master" >> "${GITHUB_OUTPUT}"
|
|
echo "type=nightly" >> "${GITHUB_OUTPUT}"
|
|
echo "branch=master" >> "${GITHUB_OUTPUT}"
|
|
echo "version=nightly" >> "${GITHUB_OUTPUT}"
|
|
fi
|
|
elif [ "${EVENT_TYPE}" = 'patch' ] && [ "${EVENT_VERSION}" != "nightly" ]; then
|
|
echo "::notice::Preparing a patch release build."
|
|
check_version_format || exit 1
|
|
check_for_existing_tag || exit 1
|
|
branch_name="$(echo "${EVENT_VERSION}" | cut -f 1-2 -d '.')"
|
|
if ! git checkout "${branch_name}"; then
|
|
echo "::error::Could not find a branch for the ${branch_name}.x release series."
|
|
exit 1
|
|
fi
|
|
minor_matches || exit 1
|
|
major_matches || exit 1
|
|
check_newer_patch_version || exit 1
|
|
echo "${EVENT_VERSION}" > packaging/version || exit 1
|
|
# shellcheck disable=SC2129
|
|
echo "run=true" >> "${GITHUB_OUTPUT}"
|
|
echo "message=Patch release ${EVENT_VERSION}." >> "${GITHUB_OUTPUT}"
|
|
echo "ref=${EVENT_VERSION}" >> "${GITHUB_OUTPUT}"
|
|
echo "type=release" >> "${GITHUB_OUTPUT}"
|
|
echo "branch=${branch_name}" >> "${GITHUB_OUTPUT}"
|
|
echo "version=$(tr -d 'v' < packaging/version)" >> "${GITHUB_OUTPUT}"
|
|
elif [ "${EVENT_TYPE}" = 'minor' ] && [ "${EVENT_VERSION}" != "nightly" ]; then
|
|
echo "::notice::Preparing a minor release build."
|
|
check_version_format || exit 1
|
|
patch_is_zero || exit 1
|
|
major_matches || exit 1
|
|
check_newer_minor_version || exit 1
|
|
check_for_existing_tag || exit 1
|
|
branch_name="$(echo "${EVENT_VERSION}" | cut -f 1-2 -d '.')"
|
|
if [ -n "$(git branch --list "${branch_name}")" ]; then
|
|
echo "::error::A branch named ${branch_name} already exists in the repository."
|
|
exit 1
|
|
fi
|
|
echo "${EVENT_VERSION}" > packaging/version || exit 1
|
|
# shellcheck disable=SC2129
|
|
echo "run=true" >> "${GITHUB_OUTPUT}"
|
|
echo "message=Minor release ${EVENT_VERSION}." >> "${GITHUB_OUTPUT}"
|
|
echo "ref=${EVENT_VERSION}" >> "${GITHUB_OUTPUT}"
|
|
echo "type=release" >> "${GITHUB_OUTPUT}"
|
|
echo "branch=master" >> "${GITHUB_OUTPUT}"
|
|
echo "new-branch=${branch_name}" >> "${GITHUB_OUTPUT}"
|
|
echo "version=$(tr -d 'v' < packaging/version)" >> "${GITHUB_OUTPUT}"
|
|
elif [ "${EVENT_TYPE}" = 'major' ] && [ "${EVENT_VERSION}" != "nightly" ]; then
|
|
echo "::notice::Preparing a major release build."
|
|
check_version_format || exit 1
|
|
minor_is_zero || exit 1
|
|
patch_is_zero || exit 1
|
|
check_newer_major_version || exit 1
|
|
check_for_existing_tag || exit 1
|
|
echo "${EVENT_VERSION}" > packaging/version || exit 1
|
|
# shellcheck disable=SC2129
|
|
echo "run=true" >> "${GITHUB_OUTPUT}"
|
|
echo "message=Major release ${EVENT_VERSION}" >> "${GITHUB_OUTPUT}"
|
|
echo "ref=${EVENT_VERSION}" >> "${GITHUB_OUTPUT}"
|
|
echo "type=release" >> "${GITHUB_OUTPUT}"
|
|
echo "branch=master" >> "${GITHUB_OUTPUT}"
|
|
echo "version=$(tr -d 'v' < packaging/version)" >> "${GITHUB_OUTPUT}"
|
|
else
|
|
echo '::error::Unrecognized release type or invalid version.'
|
|
exit 1
|
|
fi
|