Reintroduce RC builds for releases branches (#4381)
* Extend tag generation functionality - Add `IS_RELEASE_BUILD` env variable to indicate release builds - Set default suffix to RC for releases/v branches - Set default suffix to DB for develop branch - Set default suffix to `branch_name` for all other branches - Add -s flag for manual suffix - Make sure tags have the right min_version and pre_release_version in their CMakeLists.txt - Make sure RC builds have the right min_version - Write variables to GITHUB_ENV if run from workflow - improve variable names * Reintroduce RC builds - `is_release_build` is ignored except if the workflow executes on a `releases/v` branch - `is_release_build` is false by default and creates RC builds that increment when a new commit is detected - simplify workflow by using environment variables * rename artifacts_build_deploy to build_deploy * fix: use lowercase output --------- Co-authored-by: homebot <homebot@users.noreply.github.com> Co-authored-by: gr0vity <gr0vity.dev@gmail.com>
This commit is contained in:
parent
f109cb1ee9
commit
77a3512d18
2 changed files with 202 additions and 192 deletions
|
|
@ -3,6 +3,11 @@ on:
|
|||
schedule:
|
||||
- cron: "0 0 * * 3,6"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
is_release_build:
|
||||
description: 'Is this a release build?'
|
||||
required: false
|
||||
default: 'false'
|
||||
|
||||
env:
|
||||
artifact: 1
|
||||
|
|
@ -11,28 +16,27 @@ jobs:
|
|||
prepare_build:
|
||||
runs-on: ubuntu-22.04
|
||||
outputs:
|
||||
CI_TAG: ${{ steps.tag_set.outputs.CI_TAG }}
|
||||
TAG_CREATED: ${{ steps.tag_set.outputs.tag_created }}
|
||||
ci_tag: ${{ steps.set_vars.outputs.ci_tag }}
|
||||
tag_created: ${{ steps.set_vars.outputs.tag_created }}
|
||||
steps:
|
||||
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
||||
with:
|
||||
ref: ${{ github.ref }}
|
||||
- name: Set the tag and version
|
||||
id: tag_set
|
||||
run: |
|
||||
output_var_file="variable_list.txt"
|
||||
ci/actions/generate_next_git_tag.sh -c -o "${output_var_file}"
|
||||
CI_TAG=$(grep 'build_tag' ${output_var_file} | cut -d= -f2)
|
||||
echo "CI_TAG=${CI_TAG}" >> $GITHUB_OUTPUT
|
||||
TAG_CREATED=$(grep 'tag_created' ${output_var_file} | cut -d= -f2)
|
||||
echo "TAG_CREATED=${TAG_CREATED}" >> $GITHUB_OUTPUT
|
||||
ci/actions/generate_next_git_tag.sh -c
|
||||
env:
|
||||
GITHUB_ACTOR: ${{ github.actor }}
|
||||
IS_RELEASE_BUILD: ${{ github.event.inputs.is_release_build || 'false' }}
|
||||
- name: Set output
|
||||
id: set_vars
|
||||
run: |
|
||||
echo "ci_tag=$CI_TAG" >> $GITHUB_OUTPUT
|
||||
echo "tag_created=$TAG_CREATED" >> $GITHUB_OUTPUT
|
||||
|
||||
|
||||
osx_job:
|
||||
needs: prepare_build
|
||||
if: ${{ needs.prepare_build.outputs.TAG_CREATED == 'true' }}
|
||||
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
|
||||
runs-on: macOS-14
|
||||
timeout-minutes: 90
|
||||
strategy:
|
||||
|
|
@ -43,7 +47,7 @@ jobs:
|
|||
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
||||
with:
|
||||
submodules: "recursive"
|
||||
ref: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
ref: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
repository: ${{ github.repository }}
|
||||
- name: Prepare
|
||||
run: ci/prepare/macos/prepare.sh
|
||||
|
|
@ -51,12 +55,12 @@ jobs:
|
|||
run: ci/build-deploy.sh "/tmp/qt/lib/cmake/Qt5";
|
||||
env:
|
||||
NETWORK: ${{ matrix.network }}
|
||||
CI_TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
- name: Deploy Artifact
|
||||
run: ci/actions/deploy.sh
|
||||
env:
|
||||
NETWORK: ${{ matrix.network }}
|
||||
TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
S3_BUCKET_NAME: ${{ vars.S3_BUCKET_NAME }}
|
||||
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
|
|
@ -66,7 +70,7 @@ jobs:
|
|||
|
||||
linux_job:
|
||||
needs: prepare_build
|
||||
if: ${{ needs.prepare_build.outputs.TAG_CREATED == 'true' }}
|
||||
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 90
|
||||
strategy:
|
||||
|
|
@ -76,7 +80,7 @@ jobs:
|
|||
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
||||
with:
|
||||
submodules: "recursive"
|
||||
ref: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
ref: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
repository: ${{ github.repository }}
|
||||
- name: Prepare
|
||||
run: sudo -E ci/prepare/linux/prepare.sh
|
||||
|
|
@ -84,13 +88,13 @@ jobs:
|
|||
run: ci/build-deploy.sh "/usr/lib/x86_64-linux-gnu/cmake/Qt5"
|
||||
env:
|
||||
NETWORK: ${{ matrix.network }}
|
||||
CI_TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
|
||||
- name: Deploy Artifact
|
||||
run: ci/actions/deploy.sh
|
||||
env:
|
||||
NETWORK: ${{ matrix.network }}
|
||||
TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
S3_BUCKET_NAME: ${{ vars.S3_BUCKET_NAME }}
|
||||
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
|
|
@ -100,7 +104,7 @@ jobs:
|
|||
|
||||
linux_rpm_job:
|
||||
needs: prepare_build
|
||||
if: ${{ needs.prepare_build.outputs.TAG_CREATED == 'true' }}
|
||||
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 90
|
||||
strategy:
|
||||
|
|
@ -125,7 +129,7 @@ jobs:
|
|||
docker run -v ${GITHUB_WORKSPACE}:/workspace -v ${GITHUB_WORKSPACE}/artifacts:/root/rpmbuild \
|
||||
local/nano-env:rhel /bin/bash -c " \
|
||||
NETWORK=${{ matrix.network }} \
|
||||
TAG=${{ needs.prepare_build.outputs.CI_TAG }} \
|
||||
TAG=${{ needs.prepare_build.outputs.ci_tag }} \
|
||||
REPO_TO_BUILD=${{ github.repository }} \
|
||||
RPM_RELEASE=1 \
|
||||
ci/build-rhel.sh"
|
||||
|
|
@ -135,7 +139,7 @@ jobs:
|
|||
env:
|
||||
LINUX_RPM: 1
|
||||
NETWORK: ${{ matrix.network }}
|
||||
# TAG: ${{ needs.prepare_build.outputs.CI_TAG }} # (not used in the deploy script if LINUX_RPM==1 )
|
||||
# TAG: ${{ needs.prepare_build.outputs.ci_tag }} # (not used in the deploy script if LINUX_RPM==1 )
|
||||
S3_BUCKET_NAME: ${{ vars.S3_BUCKET_NAME }}
|
||||
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
|
|
@ -145,7 +149,7 @@ jobs:
|
|||
|
||||
linux_docker_job:
|
||||
needs: prepare_build
|
||||
if: ${{ needs.prepare_build.outputs.TAG_CREATED == 'true' }}
|
||||
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 90
|
||||
strategy:
|
||||
|
|
@ -155,13 +159,13 @@ jobs:
|
|||
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
||||
with:
|
||||
submodules: "recursive"
|
||||
ref: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
ref: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
repository: ${{ github.repository }}
|
||||
- name: Build Docker
|
||||
run: ci/actions/linux/docker-build.sh
|
||||
env:
|
||||
NETWORK: ${{ matrix.network }}
|
||||
CI_TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
DOCKER_REGISTRY: ${{ vars.DOCKER_REGISTRY }}
|
||||
- name: Check if secrets.DOCKER_PASSWORD exists
|
||||
run: echo "DOCKER_PASSWORD_EXISTS=${{ secrets.DOCKER_PASSWORD != '' }}" >> $GITHUB_ENV
|
||||
|
|
@ -169,7 +173,7 @@ jobs:
|
|||
if: env.DOCKER_PASSWORD_EXISTS == 'true'
|
||||
run: ci/actions/linux/docker-deploy.sh
|
||||
env:
|
||||
CI_TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
NETWORK: ${{ matrix.network }}
|
||||
DOCKER_REGISTRY: ${{ vars.DOCKER_REGISTRY }}
|
||||
DOCKER_USER: ${{ vars.DOCKER_USER }}
|
||||
|
|
@ -177,7 +181,7 @@ jobs:
|
|||
- name: Deploy Docker (ghcr.io)
|
||||
run: ci/actions/linux/ghcr-deploy.sh
|
||||
env:
|
||||
CI_TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
NETWORK: ${{ matrix.network }}
|
||||
DOCKER_REGISTRY: ghcr.io
|
||||
DOCKER_USER: ${{ github.repository_owner }}
|
||||
|
|
@ -186,7 +190,7 @@ jobs:
|
|||
|
||||
windows_job:
|
||||
needs: prepare_build
|
||||
if: ${{ needs.prepare_build.outputs.TAG_CREATED == 'true' }}
|
||||
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
|
||||
runs-on: windows-latest
|
||||
timeout-minutes: 90
|
||||
strategy:
|
||||
|
|
@ -196,7 +200,7 @@ jobs:
|
|||
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
||||
with:
|
||||
submodules: "recursive"
|
||||
ref: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
ref: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
repository: ${{ github.repository }}
|
||||
- name: Prepare
|
||||
run: ci/prepare/windows/prepare.ps1
|
||||
|
|
@ -209,7 +213,7 @@ jobs:
|
|||
run: ci/actions/windows/deploy.ps1
|
||||
env:
|
||||
NETWORK: ${{ matrix.network }}
|
||||
TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
||||
TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||
S3_BUCKET_NAME: ${{ vars.S3_BUCKET_NAME }}
|
||||
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||
|
|
@ -1,220 +1,224 @@
|
|||
#!/bin/bash
|
||||
|
||||
# This script creates the next tag for the current branch by incrementing the version_pre_release by 1
|
||||
# A new tag is only created if a new commit has been detected compared to the previous tag.
|
||||
# The tag has the following format V${current_version_major}.${current_version_minor}${branch_name}
|
||||
# ${branch_name} is converted to "DB" if the script operates on develop branch. (e.g first tag for V26: V26.0DB1)
|
||||
# if -c flag is provided, version_pre_release in CMakeLists.txt is incremented and a new tag is created and pushed to origin
|
||||
# if -o is provided, "build_tag" , "version_pre_release" and "tag_created" are written to file
|
||||
# If it executes on a release-branch :
|
||||
# --> if there is no new commit, the same tag is generated again
|
||||
# --> If there is a new commit compared to the previous tag, we would increment the minor version by 1 and build the new binaries & docker images
|
||||
# Script Description
|
||||
|
||||
#!/bin/bash
|
||||
# Purpose:
|
||||
# This script generates a new Git tag based on the current branch and previously generated tags.
|
||||
# It creates a new tag only if there's a new commit compared to the previous tag.
|
||||
|
||||
# Tag Format:
|
||||
# General: V{MAJOR}.{MINOR}{tag_suffix}{increment}
|
||||
# For releases/v branch: V{MAJOR}.{MINOR}
|
||||
|
||||
# Options:
|
||||
# $IS_RELEASE_BUILD : Indicates a release build. In this case, {tag_suffix} is ignored.
|
||||
# New commit: Increments the {MINOR} version.
|
||||
# -s {tag_suffix} : overwrites tag_suffix derived from the branch name. Derived tag_suffixes are :
|
||||
# DB for develop branch (e.g. V26.0DB1)
|
||||
# RC for releases/v branch (e.g. V26.0RC1)
|
||||
# {branch_name} for other branches (e.g. V26.0current_git_branch1)
|
||||
# -c : Create and push the tag to origin.
|
||||
# -o {output} : Write results to the specified output file.
|
||||
|
||||
set -e
|
||||
set -x
|
||||
set -x
|
||||
output=""
|
||||
create=false
|
||||
tag_created="false"
|
||||
push_tag=false
|
||||
is_release_build=${IS_RELEASE_BUILD:-false}
|
||||
tag_suffix=""
|
||||
|
||||
while getopts ":o:c" opt; do
|
||||
case ${opt} in
|
||||
o )
|
||||
output=$OPTARG
|
||||
;;
|
||||
c )
|
||||
create=true
|
||||
;;
|
||||
\? )
|
||||
echo "Invalid Option: -$OPTARG" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
: )
|
||||
echo "Invalid Option: -$OPTARG requires an argument" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
while getopts ":o:cs:" opt; do
|
||||
case ${opt} in
|
||||
o)
|
||||
output=$OPTARG
|
||||
;;
|
||||
c)
|
||||
push_tag=true
|
||||
;;
|
||||
s)
|
||||
tag_suffix=$OPTARG
|
||||
;;
|
||||
\?)
|
||||
echo "Invalid Option: -$OPTARG" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
:)
|
||||
echo "Invalid Option: -$OPTARG requires an argument" 1>&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND -1))
|
||||
shift $((OPTIND - 1))
|
||||
|
||||
is_release_build() {
|
||||
[[ $is_release_branch == true && $is_release_build == true ]]
|
||||
}
|
||||
|
||||
is_release_branch_and_release_tag_exists() {
|
||||
[[ $is_release_branch == true && $exists_tag_current_release == true ]]
|
||||
}
|
||||
|
||||
get_tag_suffix() {
|
||||
local branch_name=$1
|
||||
local version_major=$2
|
||||
local tag_suffix=${branch_name//[^a-zA-Z0-9]/_}
|
||||
local existing_suffix=$1
|
||||
local branch_name=$2
|
||||
|
||||
if [[ "$branch_name" == "develop" ]]; then
|
||||
tag_suffix="DB"
|
||||
# If tag_suffix is already provided, return it
|
||||
if [[ -n "$existing_suffix" ]]; then
|
||||
echo "$existing_suffix"
|
||||
return
|
||||
fi
|
||||
|
||||
echo $tag_suffix
|
||||
# Replace non-alphanumeric characters with underscores
|
||||
local new_tag_suffix=${branch_name//[^a-zA-Z0-9]/_}
|
||||
|
||||
# Specific rules for certain branch names
|
||||
if [[ "$branch_name" == "develop" ]]; then
|
||||
new_tag_suffix="DB"
|
||||
elif [[ "$branch_name" =~ ^releases/v[0-9]+ ]]; then
|
||||
new_tag_suffix="RC"
|
||||
fi
|
||||
echo $new_tag_suffix
|
||||
}
|
||||
|
||||
get_next_tag_number() {
|
||||
local last_tag_number=$1
|
||||
local increment=$2
|
||||
echo $((last_tag_number + increment))
|
||||
}
|
||||
|
||||
get_next_minor_version() {
|
||||
local current_minor=$1
|
||||
local increment=$2
|
||||
echo $((current_minor + increment))
|
||||
}
|
||||
|
||||
get_new_release_tag() {
|
||||
local version_major=$1
|
||||
local next_minor=$2
|
||||
echo "V${version_major}.${next_minor}"
|
||||
}
|
||||
|
||||
get_new_other_tag() {
|
||||
local base_version=$1
|
||||
local next_tag_number=$2
|
||||
echo "${base_version}${next_tag_number}"
|
||||
}
|
||||
|
||||
update_output_file() {
|
||||
update_output() {
|
||||
#Responsible for either writing to file (-o flag) or to $GITHUB_ENV (when run from a workflow)
|
||||
local new_tag=$1
|
||||
local next_number=$2
|
||||
local tag_created=$3
|
||||
local tag_type=$4
|
||||
local tag_created=$2
|
||||
|
||||
if [[ -n "$output" ]]; then
|
||||
echo "build_tag =$new_tag" > $output
|
||||
echo "$tag_type =$next_number" >> $output
|
||||
echo "tag_created =$tag_created" >> $output
|
||||
# Output to the specified file if -o is used
|
||||
echo "CI_TAG=${new_tag}" >"$output"
|
||||
echo "TAG_CREATED=${tag_created}" >>"$output"
|
||||
elif [[ $GITHUB_ACTIONS == 'true' ]]; then
|
||||
# Set environment variables if -o is not used
|
||||
echo "CI_TAG=${new_tag}" >>$GITHUB_ENV
|
||||
echo "TAG_CREATED=${tag_created}" >>$GITHUB_ENV
|
||||
else
|
||||
echo "Not running in a GitHub Actions environment. No action taken for CI_TAG, CI_TAG_NUMBER, TAG_CREATED."
|
||||
fi
|
||||
}
|
||||
|
||||
update_cmake_lists() {
|
||||
local tag_type=$1
|
||||
local next_number=$2
|
||||
local tag_types=("$@") # Array of tag types
|
||||
local variable_to_update=""
|
||||
|
||||
if [[ "$tag_type" == "version_pre_release" ]]; then
|
||||
variable_to_update="CPACK_PACKAGE_VERSION_PRE_RELEASE"
|
||||
elif [[ "$tag_type" == "version_minor" ]]; then
|
||||
variable_to_update="CPACK_PACKAGE_VERSION_MINOR"
|
||||
fi
|
||||
for tag_type in "${tag_types[@]}"; do
|
||||
case "$tag_type" in
|
||||
"version_pre_release")
|
||||
variable_to_update="CPACK_PACKAGE_VERSION_PRE_RELEASE"
|
||||
new_tag_number=${tag_next_suffix_number}
|
||||
;;
|
||||
"version_minor")
|
||||
variable_to_update="CPACK_PACKAGE_VERSION_MINOR"
|
||||
new_tag_number=${tag_next_minor_number}
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ -n "$variable_to_update" ]]; then
|
||||
echo "Update ${variable_to_update} to $next_number"
|
||||
sed -i.bak "s/set(${variable_to_update} \"[0-9]*\")/set(${variable_to_update} \"${next_number}\")/g" CMakeLists.txt
|
||||
rm CMakeLists.txt.bak
|
||||
fi
|
||||
if [[ -n "$variable_to_update" ]]; then
|
||||
echo "Update ${variable_to_update} to $new_tag_number"
|
||||
sed -i.bak "s/set(${variable_to_update} \"[0-9]*\")/set(${variable_to_update} \"${new_tag_number}\")/g" CMakeLists.txt
|
||||
rm CMakeLists.txt.bak
|
||||
fi
|
||||
done
|
||||
git add CMakeLists.txt
|
||||
}
|
||||
|
||||
function create_commit() {
|
||||
git diff --cached --quiet
|
||||
local has_changes=$? # store exit status of the last command
|
||||
local has_changes=$? # store exit status of the last command
|
||||
if [[ $has_changes -eq 0 ]]; then # no changes
|
||||
echo "No changes to commit"
|
||||
echo "false"
|
||||
else # changes detected
|
||||
git commit -m "Update CMakeLists.txt"
|
||||
git commit -m "Update CMakeLists.txt" >/dev/null 2>&1
|
||||
echo "true"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Fetch all existing tags
|
||||
git fetch --tags -f
|
||||
|
||||
# Fetch the last commit hash of the current branch
|
||||
current_branch_name=$(git rev-parse --abbrev-ref HEAD)
|
||||
current_commit_hash=$(git rev-parse HEAD)
|
||||
|
||||
# Fetch branch name
|
||||
branch_name=$(git rev-parse --abbrev-ref HEAD)
|
||||
|
||||
# Determine if it's a release branch or not
|
||||
is_release_branch=$(echo "$branch_name" | grep -q "releases/v$current_version_major" && echo true || echo false)
|
||||
|
||||
|
||||
# Fetch major and minor version numbers from CMakeLists.txt
|
||||
current_version_major=$(grep "CPACK_PACKAGE_VERSION_MAJOR" CMakeLists.txt | grep -o "[0-9]\+")
|
||||
current_version_minor=$(grep "CPACK_PACKAGE_VERSION_MINOR" CMakeLists.txt | grep -o "[0-9]\+")
|
||||
declare -a cmake_versions_to_update
|
||||
|
||||
# Initialize tag suffix and next number and increment
|
||||
tag_suffix=""
|
||||
next_number=0
|
||||
increment=1
|
||||
|
||||
if [[ $is_release_branch == true ]]; then
|
||||
|
||||
tag_type="version_minor"
|
||||
# Find existing tags for the release branch
|
||||
existing_release_tags=$(git tag --list "V${current_version_major}.*" | grep -E "V${current_version_major}\.[0-9]+$" || true)
|
||||
|
||||
# Check if any tag exists for the release branch
|
||||
if [[ -z "$existing_release_tags" ]]; then
|
||||
# No tag exists yet, use current minor version without incrementing
|
||||
tag_created="true"
|
||||
increment=0
|
||||
else
|
||||
# Some tags already exist
|
||||
# Get the commit hash of the latest tag
|
||||
last_tag=$(echo "$existing_release_tags" | sort -V | tail -n1)
|
||||
last_tag_commit_hash=$(git rev-list -n 1 $last_tag)
|
||||
|
||||
if [[ "$current_commit_hash" == "$last_tag_commit_hash" ]]; then
|
||||
# The commit hash of the HEAD is the same as the last tag, hence no new commits. No need to increment
|
||||
tag_created="true"
|
||||
increment=0
|
||||
else
|
||||
# There is a new commit, hence increment the minor version by 1
|
||||
tag_created="true"
|
||||
increment=1
|
||||
fi
|
||||
fi
|
||||
next_number=$(get_next_minor_version $current_version_minor $increment)
|
||||
new_tag=$(get_new_release_tag $current_version_major $next_number)
|
||||
is_release_branch=$(echo "$current_branch_name" | grep -q "releases/v$current_version_major" && echo true || echo false)
|
||||
tag_current_release="V${current_version_major}.${current_version_minor}"
|
||||
exists_tag_current_release=$(git tag --list "${tag_current_release}" | grep -qE "${tag_current_release}$" && echo true || echo false)
|
||||
|
||||
# Determine the tag type and base version format
|
||||
if is_release_build; then
|
||||
cmake_versions_to_update+=("version_minor")
|
||||
tag_base="${tag_current_release}"
|
||||
else
|
||||
# Non-release branches handling
|
||||
tag_type="version_pre_release"
|
||||
|
||||
tag_suffix=$(get_tag_suffix $branch_name $current_version_major)
|
||||
base_version="V${current_version_major}.${current_version_minor}${tag_suffix}"
|
||||
existing_tags=$(git tag --list "${base_version}*" | grep -E "${base_version}[0-9]+$" || true)
|
||||
|
||||
if [[ -n "$existing_tags" ]]; then
|
||||
last_tag=$(echo "$existing_tags" | sort -V | tail -n1)
|
||||
last_tag_number=$(echo "$last_tag" | awk -F"${tag_suffix}" '{print $2}')
|
||||
last_tag_commit_hash=$(git rev-list -n 2 $last_tag | tail -n 1) #ignore the commit that updates the version_pre_release
|
||||
|
||||
if [[ "$current_commit_hash" == "$last_tag_commit_hash" ]]; then
|
||||
echo "No new commits since the last tag. No new tag will be created."
|
||||
tag_created="false"
|
||||
else
|
||||
tag_created="true"
|
||||
next_number=$(get_next_tag_number $last_tag_number $increment)
|
||||
fi
|
||||
else
|
||||
tag_created="true"
|
||||
next_number=1 #replace the default 99
|
||||
if is_release_branch_and_release_tag_exists; then
|
||||
# Make sure RC builds have release_build_minor_version + 1
|
||||
current_version_minor=$((current_version_minor + 1))
|
||||
cmake_versions_to_update+=("version_minor")
|
||||
fi
|
||||
new_tag=$(get_new_other_tag $base_version $next_number)
|
||||
cmake_versions_to_update+=("version_pre_release")
|
||||
tag_suffix=$(get_tag_suffix "$tag_suffix" "$current_branch_name")
|
||||
tag_base="V${current_version_major}.${current_version_minor}${tag_suffix}"
|
||||
fi
|
||||
tag_next_suffix_number=1 # Will be overwritten if a previous tag exists
|
||||
tag_next_minor_number=${current_version_minor} # Default value if no previous tag exists
|
||||
|
||||
# Fetch existing tags based on the base version
|
||||
existing_tags=$(git tag --list "${tag_base}*" | grep -E "${tag_base}[0-9]*$" || true)
|
||||
should_create_tag="true"
|
||||
|
||||
# Get next tag if a previous tag exists:
|
||||
if [[ -n "$existing_tags" ]]; then
|
||||
most_recent_tag=$(echo "$existing_tags" | sort -V | tail -n1)
|
||||
|
||||
if is_release_build; then
|
||||
# Increment the minor version for release builds (-r flag is set) or RC builds if the release tag exists
|
||||
tag_next_minor_number=$((current_version_minor + 1))
|
||||
else
|
||||
tag_next_minor_number=${current_version_minor}
|
||||
fi
|
||||
|
||||
# Increment the suffix number based on the existing tags
|
||||
if [[ -n "$tag_suffix" && -n "$most_recent_tag" ]]; then
|
||||
tag_max_suffix_number=$(echo "$most_recent_tag" | awk -F"${tag_suffix}" '{print $2}')
|
||||
tag_next_suffix_number=$((tag_max_suffix_number + 1))
|
||||
fi
|
||||
# Else if no previous tag matching tag_base exists, use default values set above
|
||||
fi
|
||||
|
||||
update_output_file $new_tag $next_number $tag_created $tag_type
|
||||
# Check if the current commit is included in the last tag
|
||||
tags_containing_current_commit=$(git tag --contains "$current_commit_hash")
|
||||
if [[ -n "$most_recent_tag" ]] && echo "$tags_containing_current_commit" | grep -q "$most_recent_tag"; then
|
||||
should_create_tag="false"
|
||||
fi
|
||||
|
||||
# Generate the new tag name
|
||||
if is_release_build; then
|
||||
# tag_suffix is ignored for release builds
|
||||
new_tag="V${current_version_major}.${tag_next_minor_number}"
|
||||
else
|
||||
new_tag="${tag_base}${tag_next_suffix_number}"
|
||||
fi
|
||||
|
||||
update_output $new_tag $should_create_tag
|
||||
|
||||
# Skip tag creation if no new commits
|
||||
if [[ "$tag_created" == "true" ]]; then
|
||||
echo "$new_tag"
|
||||
if [[ "$should_create_tag" == "true" ]]; then
|
||||
echo "Tag '$new_tag' ready to be created"
|
||||
else
|
||||
echo "No new commits. Tag '$new_tag' will not be created."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ $create == true ]]; then
|
||||
if [[ $push_tag == true ]]; then
|
||||
# Stash current changes
|
||||
git config user.name "${GITHUB_ACTOR}"
|
||||
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
|
||||
|
||||
# Update variable in CMakeLists.txt
|
||||
update_cmake_lists "$tag_type" "$next_number"
|
||||
update_cmake_lists "${cmake_versions_to_update[@]}"
|
||||
|
||||
commit_made=$(create_commit)
|
||||
|
||||
|
|
@ -222,15 +226,17 @@ if [[ $create == true ]]; then
|
|||
git push origin "$new_tag" -f
|
||||
echo "The tag $new_tag has been created and pushed."
|
||||
|
||||
# If it's a release branch, also push the commit to the branch
|
||||
if [[ $is_release_branch == true ]]; then
|
||||
git push origin "$branch_name" -f
|
||||
echo "The commit has been pushed to the $branch_name branch."
|
||||
fi
|
||||
# If it's a release build, also push the commit to the branch
|
||||
if is_release_build; then
|
||||
git push origin "$current_branch_name" -f
|
||||
echo "The commit has been pushed to the $current_branch_name branch."
|
||||
|
||||
# Only reset local branch if a commit was made and it's not a "releases" branch.
|
||||
if [[ "$commit_made" == "true" && $is_release_branch == false ]]; then
|
||||
elif [[ "$commit_made" == "true" ]]; then
|
||||
# Resets the last commit on non-release branches after tagging, keeping the current branch clean.
|
||||
git reset --hard HEAD~1
|
||||
echo "The commit used for the tag does not exist on any branch."
|
||||
fi
|
||||
fi
|
||||
|
||||
else
|
||||
echo "Tag was not created. Run the script with -c option to create and push the tag"
|
||||
fi
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue