feat: add new scheme conventional_commits

This commit is contained in:
Daniel Atanasovski
2024-03-20 15:41:06 +11:00
parent 0c4ebd1e55
commit 0df84379a9
4 changed files with 50 additions and 9 deletions

View File

@@ -8,7 +8,14 @@ branding:
inputs: inputs:
scheme: scheme:
description: 'Versioning scheme - semver, or, calver (defaults to semver)' description: |
Versioning scheme - semver, calver or conventional_commits (defaults to semver).
`conventional_commits` Will parse the last commit message to determine the increment type.
Supports the following increment types:
- patch (build, chore, ci, docs, fix, perf, refactor, revert, style, test)
- minor (feat)
- Major (any of the above types with an '!' or 'BREAKING CHANGE:' in commit body)
required: false required: false
default: 'semver' default: 'semver'
pep440: pep440:
@@ -36,14 +43,14 @@ outputs:
description: 'Current normal version detected' description: 'Current normal version detected'
value: ${{ steps.version-lookup.outputs.CURRENT_VERSION }} value: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
current-v-version: current-v-version:
description: 'Current normal version detected, prefixed with a `v` charatcter' description: 'Current normal version detected, prefixed with a `v` character'
value: ${{ steps.version-lookup.outputs.CURRENT_V_VERSION }} value: ${{ steps.version-lookup.outputs.CURRENT_V_VERSION }}
version: version:
description: 'Incremented version calculated' description: 'Incremented version calculated'
value: ${{ steps.version-increment.outputs.VERSION }} value: ${{ steps.version-increment.outputs.VERSION }}
v-version: v-version:
description: 'Incremented version calculated, prefixed with a `v` charatcter' description: 'Incremented version calculated, prefixed with a `v` charatcter'
value: ${{ steps.version-increment.outputs.V_VERSION }} value: ${{ steps.version-increment.outputs.V_VERSION }}
major-version: major-version:
description: 'Major number of the incremented version' description: 'Major number of the incremented version'
value: ${{ steps.version-increment.outputs.MAJOR_VERSION }} value: ${{ steps.version-increment.outputs.MAJOR_VERSION }}

View File

@@ -11,13 +11,21 @@ pcre_master_ver='^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9
pcre_allow_vprefix="^v{0,1}${pcre_master_ver:1}" pcre_allow_vprefix="^v{0,1}${pcre_master_ver:1}"
pcre_old_calver='^(?P<major>0|[1-9]\d*)-0{0,1}(?P<minor>0|[0-9]\d*)-R(?P<patch>0|[1-9]\d*)$' pcre_old_calver='^(?P<major>0|[1-9]\d*)-0{0,1}(?P<minor>0|[0-9]\d*)-R(?P<patch>0|[1-9]\d*)$'
##==----------------------------------------------------------------------------
## Conventional commit regexes
## see: https://www.conventionalcommits.org/en/v1.0.0/
pcre_conventional_commit_patch='^(build|chore|ci|docs|fix|perf|refactor|revert|style|test)(\([a-zA-Z0-9-]+\))?:\s.*'
pcre_conventional_commit_minor='^(feat)(\([a-zA-Z0-9-]+\))?:\s.*'
pcre_conventional_commit_breaking='^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\([a-zA-Z0-9-]+\))?!:.*|BREAKING CHANGE:'
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## Input validation ## Input validation
input_errors='false' input_errors='false'
scheme="${scheme:-semver}" scheme="${scheme:-semver}"
if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' ]] ; then if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' && "${scheme}" != 'conventional_commits' ]] ; then
echo "🛑 Value of 'scheme' is not valid, choose from 'semver' or 'calver'" 1>&2 echo "🛑 Value of 'scheme' is not valid, choose from 'semver', 'calver' or 'conventional_commits" 1>&2
input_errors='true' input_errors='true'
fi fi
@@ -40,7 +48,6 @@ if [[ "${use_api}" == 'true' ]] ; then
fi fi
fi fi
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## MacOS compatibility - for local testing ## MacOS compatibility - for local testing

View File

@@ -30,7 +30,7 @@ fi
default_branch='main' default_branch='main'
# use release_branch if not empty # use release_branch if not empty
if [[ -n "${release_branch:-}" ]] ; then if [[ -n "${release_branch:-}" ]] ; then
default_branch="${release_branch}" default_branch="${release_branch}"
elif [[ -z "${BATS_VERSION:-}" ]] ; then elif [[ -z "${BATS_VERSION:-}" ]] ; then
# if we're _not_ testing, then _actually_ check the origin # if we're _not_ testing, then _actually_ check the origin
if [[ "${use_api:-}" == 'true' ]] ; then if [[ "${use_api:-}" == 'true' ]] ; then
@@ -48,6 +48,7 @@ elif [[ -z "${BATS_VERSION:-}" ]] ; then
fi fi
current_ref="${GITHUB_REF:-}" current_ref="${GITHUB_REF:-}"
git_commit_sha=${GITHUB_SHA:-}
if [[ "${use_api:-}" == 'true' ]] ; then if [[ "${use_api:-}" == 'true' ]] ; then
# because we cannot use `rev-parse` with the API, we'll take a punt that 9 characters is enough for uniqueness # because we cannot use `rev-parse` with the API, we'll take a punt that 9 characters is enough for uniqueness
@@ -55,7 +56,33 @@ if [[ "${use_api:-}" == 'true' ]] ; then
git_commit="$(echo "${GITHUB_SHA:0:9}" | sed 's/0*//')" # Also, trim leading zeros, because semver doesn't allow that in git_commit="$(echo "${GITHUB_SHA:0:9}" | sed 's/0*//')" # Also, trim leading zeros, because semver doesn't allow that in
else # the 'pre-release version' part, but we can't use the + char else # the 'pre-release version' part, but we can't use the + char
git_commit="$(git rev-parse --short HEAD | sed 's/0*//')" # to make it 'build metadata' as that's not supported in K8s git_commit="$(git rev-parse --short HEAD | sed 's/0*//')" # to make it 'build metadata' as that's not supported in K8s
fi # labels git_commit_sha="$(git rev-parse --short HEAD)" # labels
fi
##==----------------------------------------------------------------------------
## Conventional commits
# If calver is set, raise a warning
if [[ "${scheme}" == 'conventional_commits' ]] ; then
# Get message from given commit
commit_message=$(git log -1 --pretty=format:%B "${git_commit_sha}")
# Check commit message header
found_match='false'
if [[ -n "$(echo "${commit_message}" | ${grep} -P "${pcre_conventional_commit_breaking}")" ]] ; then
increment='major'
found_match='true'
elif [[ -n "$(echo "${commit_message}" | ${grep} -P "${pcre_conventional_commit_minor}")" ]] ; then
increment='minor'
found_match='true'
elif [[ -n "$(echo "${commit_message}" | ${grep} -P "${pcre_conventional_commit_patch}")" ]] ; then
increment='patch'
found_match='true'
fi
if [[ "${found_match}" == 'false' ]] ; then
echo "⚠️ No conventional commit found, defaulting to ${increment} increment" 1>&2
fi
fi
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## Version increment ## Version increment

View File

@@ -46,7 +46,7 @@ if [[ -z "${current_version:-}" ]] ; then
echo "⚠️ No previous release version identified in git tags" echo "⚠️ No previous release version identified in git tags"
# brand new repo! (probably) # brand new repo! (probably)
case "${scheme}" in case "${scheme}" in
semver) semver | conventional_commits)
current_version="0.0.0" current_version="0.0.0"
;; ;;
calver) calver)