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:
|
schedule:
|
||||||
- cron: "0 0 * * 3,6"
|
- cron: "0 0 * * 3,6"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
is_release_build:
|
||||||
|
description: 'Is this a release build?'
|
||||||
|
required: false
|
||||||
|
default: 'false'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
artifact: 1
|
artifact: 1
|
||||||
|
|
@ -11,28 +16,27 @@ jobs:
|
||||||
prepare_build:
|
prepare_build:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
outputs:
|
outputs:
|
||||||
CI_TAG: ${{ steps.tag_set.outputs.CI_TAG }}
|
ci_tag: ${{ steps.set_vars.outputs.ci_tag }}
|
||||||
TAG_CREATED: ${{ steps.tag_set.outputs.tag_created }}
|
tag_created: ${{ steps.set_vars.outputs.tag_created }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
||||||
with:
|
|
||||||
ref: ${{ github.ref }}
|
|
||||||
- name: Set the tag and version
|
- name: Set the tag and version
|
||||||
id: tag_set
|
id: tag_set
|
||||||
run: |
|
run: |
|
||||||
output_var_file="variable_list.txt"
|
ci/actions/generate_next_git_tag.sh -c
|
||||||
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
|
|
||||||
env:
|
env:
|
||||||
GITHUB_ACTOR: ${{ github.actor }}
|
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:
|
osx_job:
|
||||||
needs: prepare_build
|
needs: prepare_build
|
||||||
if: ${{ needs.prepare_build.outputs.TAG_CREATED == 'true' }}
|
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
|
||||||
runs-on: macOS-14
|
runs-on: macOS-14
|
||||||
timeout-minutes: 90
|
timeout-minutes: 90
|
||||||
strategy:
|
strategy:
|
||||||
|
|
@ -43,7 +47,7 @@ jobs:
|
||||||
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
||||||
with:
|
with:
|
||||||
submodules: "recursive"
|
submodules: "recursive"
|
||||||
ref: ${{ needs.prepare_build.outputs.CI_TAG }}
|
ref: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||||
repository: ${{ github.repository }}
|
repository: ${{ github.repository }}
|
||||||
- name: Prepare
|
- name: Prepare
|
||||||
run: ci/prepare/macos/prepare.sh
|
run: ci/prepare/macos/prepare.sh
|
||||||
|
|
@ -51,12 +55,12 @@ jobs:
|
||||||
run: ci/build-deploy.sh "/tmp/qt/lib/cmake/Qt5";
|
run: ci/build-deploy.sh "/tmp/qt/lib/cmake/Qt5";
|
||||||
env:
|
env:
|
||||||
NETWORK: ${{ matrix.network }}
|
NETWORK: ${{ matrix.network }}
|
||||||
CI_TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||||
- name: Deploy Artifact
|
- name: Deploy Artifact
|
||||||
run: ci/actions/deploy.sh
|
run: ci/actions/deploy.sh
|
||||||
env:
|
env:
|
||||||
NETWORK: ${{ matrix.network }}
|
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_BUCKET_NAME: ${{ vars.S3_BUCKET_NAME }}
|
||||||
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
|
@ -66,7 +70,7 @@ jobs:
|
||||||
|
|
||||||
linux_job:
|
linux_job:
|
||||||
needs: prepare_build
|
needs: prepare_build
|
||||||
if: ${{ needs.prepare_build.outputs.TAG_CREATED == 'true' }}
|
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 90
|
timeout-minutes: 90
|
||||||
strategy:
|
strategy:
|
||||||
|
|
@ -76,7 +80,7 @@ jobs:
|
||||||
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
||||||
with:
|
with:
|
||||||
submodules: "recursive"
|
submodules: "recursive"
|
||||||
ref: ${{ needs.prepare_build.outputs.CI_TAG }}
|
ref: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||||
repository: ${{ github.repository }}
|
repository: ${{ github.repository }}
|
||||||
- name: Prepare
|
- name: Prepare
|
||||||
run: sudo -E ci/prepare/linux/prepare.sh
|
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"
|
run: ci/build-deploy.sh "/usr/lib/x86_64-linux-gnu/cmake/Qt5"
|
||||||
env:
|
env:
|
||||||
NETWORK: ${{ matrix.network }}
|
NETWORK: ${{ matrix.network }}
|
||||||
CI_TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||||
|
|
||||||
- name: Deploy Artifact
|
- name: Deploy Artifact
|
||||||
run: ci/actions/deploy.sh
|
run: ci/actions/deploy.sh
|
||||||
env:
|
env:
|
||||||
NETWORK: ${{ matrix.network }}
|
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_BUCKET_NAME: ${{ vars.S3_BUCKET_NAME }}
|
||||||
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
|
@ -100,7 +104,7 @@ jobs:
|
||||||
|
|
||||||
linux_rpm_job:
|
linux_rpm_job:
|
||||||
needs: prepare_build
|
needs: prepare_build
|
||||||
if: ${{ needs.prepare_build.outputs.TAG_CREATED == 'true' }}
|
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 90
|
timeout-minutes: 90
|
||||||
strategy:
|
strategy:
|
||||||
|
|
@ -125,7 +129,7 @@ jobs:
|
||||||
docker run -v ${GITHUB_WORKSPACE}:/workspace -v ${GITHUB_WORKSPACE}/artifacts:/root/rpmbuild \
|
docker run -v ${GITHUB_WORKSPACE}:/workspace -v ${GITHUB_WORKSPACE}/artifacts:/root/rpmbuild \
|
||||||
local/nano-env:rhel /bin/bash -c " \
|
local/nano-env:rhel /bin/bash -c " \
|
||||||
NETWORK=${{ matrix.network }} \
|
NETWORK=${{ matrix.network }} \
|
||||||
TAG=${{ needs.prepare_build.outputs.CI_TAG }} \
|
TAG=${{ needs.prepare_build.outputs.ci_tag }} \
|
||||||
REPO_TO_BUILD=${{ github.repository }} \
|
REPO_TO_BUILD=${{ github.repository }} \
|
||||||
RPM_RELEASE=1 \
|
RPM_RELEASE=1 \
|
||||||
ci/build-rhel.sh"
|
ci/build-rhel.sh"
|
||||||
|
|
@ -135,7 +139,7 @@ jobs:
|
||||||
env:
|
env:
|
||||||
LINUX_RPM: 1
|
LINUX_RPM: 1
|
||||||
NETWORK: ${{ matrix.network }}
|
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_BUCKET_NAME: ${{ vars.S3_BUCKET_NAME }}
|
||||||
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
|
@ -145,7 +149,7 @@ jobs:
|
||||||
|
|
||||||
linux_docker_job:
|
linux_docker_job:
|
||||||
needs: prepare_build
|
needs: prepare_build
|
||||||
if: ${{ needs.prepare_build.outputs.TAG_CREATED == 'true' }}
|
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
timeout-minutes: 90
|
timeout-minutes: 90
|
||||||
strategy:
|
strategy:
|
||||||
|
|
@ -155,13 +159,13 @@ jobs:
|
||||||
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
||||||
with:
|
with:
|
||||||
submodules: "recursive"
|
submodules: "recursive"
|
||||||
ref: ${{ needs.prepare_build.outputs.CI_TAG }}
|
ref: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||||
repository: ${{ github.repository }}
|
repository: ${{ github.repository }}
|
||||||
- name: Build Docker
|
- name: Build Docker
|
||||||
run: ci/actions/linux/docker-build.sh
|
run: ci/actions/linux/docker-build.sh
|
||||||
env:
|
env:
|
||||||
NETWORK: ${{ matrix.network }}
|
NETWORK: ${{ matrix.network }}
|
||||||
CI_TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||||
DOCKER_REGISTRY: ${{ vars.DOCKER_REGISTRY }}
|
DOCKER_REGISTRY: ${{ vars.DOCKER_REGISTRY }}
|
||||||
- name: Check if secrets.DOCKER_PASSWORD exists
|
- name: Check if secrets.DOCKER_PASSWORD exists
|
||||||
run: echo "DOCKER_PASSWORD_EXISTS=${{ secrets.DOCKER_PASSWORD != '' }}" >> $GITHUB_ENV
|
run: echo "DOCKER_PASSWORD_EXISTS=${{ secrets.DOCKER_PASSWORD != '' }}" >> $GITHUB_ENV
|
||||||
|
|
@ -169,7 +173,7 @@ jobs:
|
||||||
if: env.DOCKER_PASSWORD_EXISTS == 'true'
|
if: env.DOCKER_PASSWORD_EXISTS == 'true'
|
||||||
run: ci/actions/linux/docker-deploy.sh
|
run: ci/actions/linux/docker-deploy.sh
|
||||||
env:
|
env:
|
||||||
CI_TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||||
NETWORK: ${{ matrix.network }}
|
NETWORK: ${{ matrix.network }}
|
||||||
DOCKER_REGISTRY: ${{ vars.DOCKER_REGISTRY }}
|
DOCKER_REGISTRY: ${{ vars.DOCKER_REGISTRY }}
|
||||||
DOCKER_USER: ${{ vars.DOCKER_USER }}
|
DOCKER_USER: ${{ vars.DOCKER_USER }}
|
||||||
|
|
@ -177,7 +181,7 @@ jobs:
|
||||||
- name: Deploy Docker (ghcr.io)
|
- name: Deploy Docker (ghcr.io)
|
||||||
run: ci/actions/linux/ghcr-deploy.sh
|
run: ci/actions/linux/ghcr-deploy.sh
|
||||||
env:
|
env:
|
||||||
CI_TAG: ${{ needs.prepare_build.outputs.CI_TAG }}
|
CI_TAG: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||||
NETWORK: ${{ matrix.network }}
|
NETWORK: ${{ matrix.network }}
|
||||||
DOCKER_REGISTRY: ghcr.io
|
DOCKER_REGISTRY: ghcr.io
|
||||||
DOCKER_USER: ${{ github.repository_owner }}
|
DOCKER_USER: ${{ github.repository_owner }}
|
||||||
|
|
@ -186,7 +190,7 @@ jobs:
|
||||||
|
|
||||||
windows_job:
|
windows_job:
|
||||||
needs: prepare_build
|
needs: prepare_build
|
||||||
if: ${{ needs.prepare_build.outputs.TAG_CREATED == 'true' }}
|
if: ${{ needs.prepare_build.outputs.tag_created == 'true' }}
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
timeout-minutes: 90
|
timeout-minutes: 90
|
||||||
strategy:
|
strategy:
|
||||||
|
|
@ -196,7 +200,7 @@ jobs:
|
||||||
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
- uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 #v3.1.0
|
||||||
with:
|
with:
|
||||||
submodules: "recursive"
|
submodules: "recursive"
|
||||||
ref: ${{ needs.prepare_build.outputs.CI_TAG }}
|
ref: ${{ needs.prepare_build.outputs.ci_tag }}
|
||||||
repository: ${{ github.repository }}
|
repository: ${{ github.repository }}
|
||||||
- name: Prepare
|
- name: Prepare
|
||||||
run: ci/prepare/windows/prepare.ps1
|
run: ci/prepare/windows/prepare.ps1
|
||||||
|
|
@ -209,7 +213,7 @@ jobs:
|
||||||
run: ci/actions/windows/deploy.ps1
|
run: ci/actions/windows/deploy.ps1
|
||||||
env:
|
env:
|
||||||
NETWORK: ${{ matrix.network }}
|
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_BUCKET_NAME: ${{ vars.S3_BUCKET_NAME }}
|
||||||
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
S3_BUILD_DIRECTORY: ${{ vars.S3_BUILD_DIRECTORY }}
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
|
@ -1,220 +1,224 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# This script creates the next tag for the current branch by incrementing the version_pre_release by 1
|
# Script Description
|
||||||
# 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
|
|
||||||
|
|
||||||
#!/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 -e
|
||||||
set -x
|
set -x
|
||||||
output=""
|
output=""
|
||||||
create=false
|
push_tag=false
|
||||||
tag_created="false"
|
is_release_build=${IS_RELEASE_BUILD:-false}
|
||||||
|
tag_suffix=""
|
||||||
|
|
||||||
while getopts ":o:c" opt; do
|
while getopts ":o:cs:" opt; do
|
||||||
case ${opt} in
|
case ${opt} in
|
||||||
o )
|
o)
|
||||||
output=$OPTARG
|
output=$OPTARG
|
||||||
;;
|
;;
|
||||||
c )
|
c)
|
||||||
create=true
|
push_tag=true
|
||||||
;;
|
;;
|
||||||
\? )
|
s)
|
||||||
echo "Invalid Option: -$OPTARG" 1>&2
|
tag_suffix=$OPTARG
|
||||||
exit 1
|
;;
|
||||||
;;
|
\?)
|
||||||
: )
|
echo "Invalid Option: -$OPTARG" 1>&2
|
||||||
echo "Invalid Option: -$OPTARG requires an argument" 1>&2
|
exit 1
|
||||||
exit 1
|
;;
|
||||||
;;
|
:)
|
||||||
esac
|
echo "Invalid Option: -$OPTARG requires an argument" 1>&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
done
|
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() {
|
get_tag_suffix() {
|
||||||
local branch_name=$1
|
local existing_suffix=$1
|
||||||
local version_major=$2
|
local branch_name=$2
|
||||||
local tag_suffix=${branch_name//[^a-zA-Z0-9]/_}
|
|
||||||
|
|
||||||
if [[ "$branch_name" == "develop" ]]; then
|
# If tag_suffix is already provided, return it
|
||||||
tag_suffix="DB"
|
if [[ -n "$existing_suffix" ]]; then
|
||||||
|
echo "$existing_suffix"
|
||||||
|
return
|
||||||
fi
|
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() {
|
update_output() {
|
||||||
local last_tag_number=$1
|
#Responsible for either writing to file (-o flag) or to $GITHUB_ENV (when run from a workflow)
|
||||||
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() {
|
|
||||||
local new_tag=$1
|
local new_tag=$1
|
||||||
local next_number=$2
|
local tag_created=$2
|
||||||
local tag_created=$3
|
|
||||||
local tag_type=$4
|
|
||||||
|
|
||||||
if [[ -n "$output" ]]; then
|
if [[ -n "$output" ]]; then
|
||||||
echo "build_tag =$new_tag" > $output
|
# Output to the specified file if -o is used
|
||||||
echo "$tag_type =$next_number" >> $output
|
echo "CI_TAG=${new_tag}" >"$output"
|
||||||
echo "tag_created =$tag_created" >> $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
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
update_cmake_lists() {
|
update_cmake_lists() {
|
||||||
local tag_type=$1
|
local tag_types=("$@") # Array of tag types
|
||||||
local next_number=$2
|
|
||||||
local variable_to_update=""
|
local variable_to_update=""
|
||||||
|
|
||||||
if [[ "$tag_type" == "version_pre_release" ]]; then
|
for tag_type in "${tag_types[@]}"; do
|
||||||
variable_to_update="CPACK_PACKAGE_VERSION_PRE_RELEASE"
|
case "$tag_type" in
|
||||||
elif [[ "$tag_type" == "version_minor" ]]; then
|
"version_pre_release")
|
||||||
variable_to_update="CPACK_PACKAGE_VERSION_MINOR"
|
variable_to_update="CPACK_PACKAGE_VERSION_PRE_RELEASE"
|
||||||
fi
|
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
|
if [[ -n "$variable_to_update" ]]; then
|
||||||
echo "Update ${variable_to_update} to $next_number"
|
echo "Update ${variable_to_update} to $new_tag_number"
|
||||||
sed -i.bak "s/set(${variable_to_update} \"[0-9]*\")/set(${variable_to_update} \"${next_number}\")/g" CMakeLists.txt
|
sed -i.bak "s/set(${variable_to_update} \"[0-9]*\")/set(${variable_to_update} \"${new_tag_number}\")/g" CMakeLists.txt
|
||||||
rm CMakeLists.txt.bak
|
rm CMakeLists.txt.bak
|
||||||
fi
|
fi
|
||||||
|
done
|
||||||
git add CMakeLists.txt
|
git add CMakeLists.txt
|
||||||
}
|
}
|
||||||
|
|
||||||
function create_commit() {
|
function create_commit() {
|
||||||
git diff --cached --quiet
|
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
|
if [[ $has_changes -eq 0 ]]; then # no changes
|
||||||
echo "No changes to commit"
|
echo "No changes to commit"
|
||||||
echo "false"
|
echo "false"
|
||||||
else # changes detected
|
else # changes detected
|
||||||
git commit -m "Update CMakeLists.txt"
|
git commit -m "Update CMakeLists.txt" >/dev/null 2>&1
|
||||||
echo "true"
|
echo "true"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# Fetch all existing tags
|
# Fetch all existing tags
|
||||||
git fetch --tags -f
|
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)
|
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_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]\+")
|
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
|
is_release_branch=$(echo "$current_branch_name" | grep -q "releases/v$current_version_major" && echo true || echo false)
|
||||||
tag_suffix=""
|
tag_current_release="V${current_version_major}.${current_version_minor}"
|
||||||
next_number=0
|
exists_tag_current_release=$(git tag --list "${tag_current_release}" | grep -qE "${tag_current_release}$" && echo true || echo false)
|
||||||
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)
|
|
||||||
|
|
||||||
|
# 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
|
else
|
||||||
# Non-release branches handling
|
if is_release_branch_and_release_tag_exists; then
|
||||||
tag_type="version_pre_release"
|
# Make sure RC builds have release_build_minor_version + 1
|
||||||
|
current_version_minor=$((current_version_minor + 1))
|
||||||
tag_suffix=$(get_tag_suffix $branch_name $current_version_major)
|
cmake_versions_to_update+=("version_minor")
|
||||||
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
|
|
||||||
fi
|
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
|
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
|
# Skip tag creation if no new commits
|
||||||
if [[ "$tag_created" == "true" ]]; then
|
if [[ "$should_create_tag" == "true" ]]; then
|
||||||
echo "$new_tag"
|
echo "Tag '$new_tag' ready to be created"
|
||||||
else
|
else
|
||||||
|
echo "No new commits. Tag '$new_tag' will not be created."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $create == true ]]; then
|
if [[ $push_tag == true ]]; then
|
||||||
# Stash current changes
|
# Stash current changes
|
||||||
git config user.name "${GITHUB_ACTOR}"
|
git config user.name "${GITHUB_ACTOR}"
|
||||||
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
|
git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
|
||||||
|
|
||||||
# Update variable in CMakeLists.txt
|
# Update variable in CMakeLists.txt
|
||||||
update_cmake_lists "$tag_type" "$next_number"
|
update_cmake_lists "${cmake_versions_to_update[@]}"
|
||||||
|
|
||||||
commit_made=$(create_commit)
|
commit_made=$(create_commit)
|
||||||
|
|
||||||
|
|
@ -222,15 +226,17 @@ if [[ $create == true ]]; then
|
||||||
git push origin "$new_tag" -f
|
git push origin "$new_tag" -f
|
||||||
echo "The tag $new_tag has been created and pushed."
|
echo "The tag $new_tag has been created and pushed."
|
||||||
|
|
||||||
# If it's a release branch, also push the commit to the branch
|
# If it's a release build, also push the commit to the branch
|
||||||
if [[ $is_release_branch == true ]]; then
|
if is_release_build; then
|
||||||
git push origin "$branch_name" -f
|
git push origin "$current_branch_name" -f
|
||||||
echo "The commit has been pushed to the $branch_name branch."
|
echo "The commit has been pushed to the $current_branch_name branch."
|
||||||
fi
|
|
||||||
|
|
||||||
# Only reset local branch if a commit was made and it's not a "releases" branch.
|
elif [[ "$commit_made" == "true" ]]; then
|
||||||
if [[ "$commit_made" == "true" && $is_release_branch == false ]]; then
|
# Resets the last commit on non-release branches after tagging, keeping the current branch clean.
|
||||||
git reset --hard HEAD~1
|
git reset --hard HEAD~1
|
||||||
echo "The commit used for the tag does not exist on any branch."
|
echo "The commit used for the tag does not exist on any branch."
|
||||||
fi
|
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