29 Commits

Author SHA1 Message Date
Asanga K
8d649fcfa3 Merge pull request #14 from reecetech/fix-git-fetch-tags-issue
[DE-4875] Forcing git fetch tags
2022-02-25 13:36:45 +11:00
karunasa
ccbbbe93a8 [DE-4875] Forcing git fetch tags
Workaround for the issue where in certain cases it's failing when a version tag has moved.
2022-02-25 09:26:09 +11:00
Asanga
ddbbe72b7f Merge pull request #13 from reecetech/exposing-convenience-version-numbers
Exposing major, minor and patch numbers as convenience outputs
2022-02-11 08:26:37 +11:00
Phil Jay
ba14b463c4 Add both "plain" and v prefix version outputs 2022-02-10 22:27:59 +11:00
Phil Jay
fde70f2da9 Add tests for new desired output 2022-02-10 22:27:23 +11:00
karunasa
8b854651df Exposing major, minor and patch numbers as outputs 2022-02-10 16:56:32 +11:00
Asanga
40611bca96 Merge pull request #12 from reecetech/using-v-outputs
Using v-* outputs in favor of string manipulation
2022-02-08 15:14:10 +11:00
Asanga
ddfcb5bc04 Updating to the latest version 2022-02-08 15:07:45 +11:00
Asanga
3d00642def Using v-* outputs in favor of string manipulation 2022-02-08 15:06:28 +11:00
Philip Jay
827489c005 Merge pull request #11 from reecetech/fixing-outputs
Fixing the outputs to match README
2022-02-08 14:55:07 +11:00
Phil Jay
ee28762c5b Update README for next version 2022-02-08 14:52:41 +11:00
Asanga
1c6699b17a Fixing the outputs to match with README 2022-02-08 14:40:16 +11:00
Philip Jay
822afeb70c Merge pull request #10 from reecetech/DE-4401-fix-for-pipefails
Avoid broken pipe exits (`141`) when `head` exits
2022-02-01 16:52:07 +11:00
Phil Jay
9492ff84fb Avoid broken pipe exits (141) when head exits
Intermittent issue, only observed on self-hosted agents on VMware (due
to multi-core processing)
2022-02-01 12:23:49 +11:00
Philip Jay
7c6e26cbd9 Merge pull request #9 from reecetech/v-prefix
Add `v` prefixed version output
2021-11-22 10:04:07 +11:00
Phil Jay
38a48eeef1 Add v prefixed version outputs
See: https://github.com/reecetech/version-increment/issues/8
2021-11-15 06:54:57 +11:00
Phil Jay
4988018178 Add tests for v prefixed version output 2021-11-15 06:54:21 +11:00
Philip Jay
3016172c72 Merge pull request #7 from reecetech/update-version-in-README
Replace with latest version
2021-11-03 13:14:27 +11:00
Phil Jay
a17b442bee Replace with latest version
2021.10.4 had a bug, we should have updated this when 2021.10.5 came
out.  Now the next version will be 2021.11.1
2021-11-01 19:08:01 +11:00
Philip Jay
406cc3a662 Merge pull request #6 from reecetech/fix-for-inputs-in-composites
Fix for inputs in composites
2021-10-22 12:00:08 +11:00
Phil Jay
a7121378a5 Fix for composite actions not having INPUT_ vars
See: https://github.com/actions/runner/issues/665
2021-10-22 11:54:47 +11:00
Phil Jay
f9aea6e594 Use latest BATS 2021-10-22 11:54:47 +11:00
Philip Jay
c0c7194013 Merge pull request #5 from reecetech/rework
Rework for slightly better input validation
2021-10-22 07:35:13 +11:00
Phil Jay
a54c16bb35 Rework for slightly better code style 2021-10-21 23:38:59 +11:00
Philip Jay
8766e6c6af Merge pull request #4 from reecetech/fixup-for-env
Fix for `env`, fix for README
2021-10-20 13:54:55 +11:00
Phil Jay
8700256121 Fix: composite runs using bash require env 2021-10-20 12:11:22 +11:00
Phil Jay
2fa6f4f0f9 Update to show version 2021-10-20 12:07:00 +11:00
Philip Jay
ef5bc12fc4 Merge pull request #2 from reecetech/fixup-action.yml
Fix metadata syntax in `action.yml` 🛠
2021-10-20 11:40:15 +11:00
Phil Jay
efc89dc7d0 Fix metadata syntax in action.yml 🛠
```
Description must be less than 125 characters.
```
2021-10-20 11:31:17 +11:00
8 changed files with 140 additions and 50 deletions

View File

@@ -29,7 +29,7 @@ jobs:
- name: Setup bats - name: Setup bats
uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d
with: with:
bats-version: 1.2.1 bats-version: 1.4.1
- name: Test - name: Test
run: bats tests/*.bats run: bats tests/*.bats
@@ -52,7 +52,7 @@ jobs:
run: ./version-increment.sh run: ./version-increment.sh
env: env:
current_version: ${{ steps.version-lookup.outputs.current-version }} current_version: ${{ steps.version-lookup.outputs.current-version }}
INPUT_SCHEME: calver scheme: calver
- name: Release version - name: Release version
uses: marvinpinto/action-automatic-releases@919008cf3f741b179569b7a6fb4d8860689ab7f0 uses: marvinpinto/action-automatic-releases@919008cf3f741b179569b7a6fb4d8860689ab7f0

View File

@@ -5,8 +5,11 @@
### ⌨️ Example ### ⌨️ Example
```yaml ```yaml
- name: Checkout code
uses: actions/checkout@v2
- name: Get next version - name: Get next version
uses: reecetech/version-increment uses: reecetech/version-increment@2022.2.4
id: version id: version
with: with:
scheme: semver scheme: semver
@@ -79,10 +82,18 @@ Examples:
### 📤 Outputs ### 📤 Outputs
| name | description | | name | description |
| :--- | :--- | | :--- | :--- |
| current_version | The current latest version detected from the git repositories tags | | current-version | The current latest version detected from the git repositories tags |
| version | The incremented version number (e.g. the next version) | | current-v-version | The current latest version detected from the git repositories tags, prefixed with a `v` character |
| version | The incremented version number (e.g. the next version) |
| v-version | The incremented version number (e.g. the next version), prefixed with a `v` character |
| major-version | Major number of the incremented version |
| minor-version | Minor number of the incremented version |
| patch-version | Patch number of the incremented version |
| major-v-version | Major number of the incremented version, prefixed with a `v` character |
| minor-v-version | Minor number of the incremented version, prefixed with a `v` character |
| patch-v-version | Patch number of the incremented version, prefixed with a `v` character |
## 💕 Contributing ## 💕 Contributing

View File

@@ -1,11 +1,10 @@
--- ---
name: 'Version Increment' name: 'Version Increment'
description: | description: Inspects the git tags to determine the current normal version, and returns the next version number
Inspects the git tags to determine the current normal version, and returns the
next version number.
A normal version will be returned if the branch is the default branch branding:
(usually `main`), otherwise a pre-release version will be returned. icon: plus
color: purple
inputs: inputs:
scheme: scheme:
@@ -21,12 +20,36 @@ inputs:
default: 'patch' default: 'patch'
outputs: outputs:
current_version: current-version:
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:
description: 'Current normal version detected, prefixed with a `v` charatcter'
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:
description: 'Incremented version calculated, prefixed with a `v` charatcter'
value: ${{ steps.version-increment.outputs.v-version }}
major-version:
description: 'Major number of the incremented version'
value: ${{ steps.version-increment.outputs.major-version }}
minor-version:
description: 'Minor number of the incremented version'
value: ${{ steps.version-increment.outputs.minor-version }}
patch-version:
description: 'Patch number of the incremented version'
value: ${{ steps.version-increment.outputs.patch-version }}
major-v-version:
description: 'Major number of the incremented version, prefixed with a `v` charatcter'
value: ${{ steps.version-increment.outputs.major-v-version }}
minor-v-version:
description: 'Minor number of the incremented version, prefixed with a `v` charatcter'
value: ${{ steps.version-increment.outputs.minor-v-version }}
patch-v-version:
description: 'Patch number of the incremented version, prefixed with a `v` charatcter'
value: ${{ steps.version-increment.outputs.patch-v-version }}
runs: runs:
using: "composite" using: "composite"
@@ -34,9 +57,13 @@ runs:
- id: version-lookup - id: version-lookup
run: ${{ github.action_path }}/version-lookup.sh run: ${{ github.action_path }}/version-lookup.sh
shell: bash shell: bash
env:
scheme: ${{ inputs.scheme }}
- id: version-increment - id: version-increment
run: ${{ github.action_path }}/version-increment.sh run: ${{ github.action_path }}/version-increment.sh
shell: bash shell: bash
with: env:
current_version: ${{ steps.version-lookup.outputs.current-version }} current_version: ${{ steps.version-lookup.outputs.current-version }}
increment: ${{ inputs.increment }}
scheme: ${{ inputs.scheme }}

View File

@@ -2,12 +2,25 @@
# shellcheck disable=SC2034 # shellcheck disable=SC2034
set -euo pipefail set -euo pipefail
# see: https://semver.org/spec/v2.0.0.html#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string ##==----------------------------------------------------------------------------
## SemVer regexes
## see: https://semver.org/spec/v2.0.0.html#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string
pcre_semver='^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$' pcre_semver='^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$'
pcre_master_ver='^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)$' pcre_master_ver='^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)$'
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*)$'
##==----------------------------------------------------------------------------
## Input validation
input_errors='false'
scheme="${scheme:-semver}"
if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' ]] ; then
echo "🛑 Value of 'scheme' is not valid, choose from 'semver' or 'calver'" 1>&2
input_errors='true'
fi
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## MacOS compatibility - for local testing ## MacOS compatibility - for local testing

View File

@@ -25,7 +25,7 @@ function init_repo {
run ../../version-increment.sh run ../../version-increment.sh
print_run_info print_run_info
[ "$status" -eq 5 ] && [ "$status" -eq 8 ] &&
[[ "$output" = *"Environment variable 'current_version' is unset or empty"* ]] [[ "$output" = *"Environment variable 'current_version' is unset or empty"* ]]
} }
@@ -37,15 +37,14 @@ function init_repo {
run ../../version-increment.sh run ../../version-increment.sh
print_run_info print_run_info
[ "$status" -eq 6 ] && [ "$status" -eq 8 ] &&
[[ "$output" = *"Environment variable 'current_version' is not a valid normal version"* ]] [[ "$output" = *"Environment variable 'current_version' is not a valid normal version"* ]]
} }
@test "fails if invalid scheme given" { @test "fails if invalid scheme given" {
init_repo init_repo
export current_version=1.2.3 export scheme="foover"
export INPUT_SCHEME="foover"
run ../../version-increment.sh run ../../version-increment.sh
@@ -57,13 +56,12 @@ function init_repo {
@test "fails if invalid increment given" { @test "fails if invalid increment given" {
init_repo init_repo
export current_version=1.2.3 export increment="critical"
export INPUT_INCREMENT="critical"
run ../../version-increment.sh run ../../version-increment.sh
print_run_info print_run_info
[ "$status" -eq 7 ] && [ "$status" -eq 8 ] &&
[[ "$output" = *"Value of 'increment' is not valid, choose from 'major', 'minor', or 'patch'"* ]] [[ "$output" = *"Value of 'increment' is not valid, choose from 'major', 'minor', or 'patch'"* ]]
} }
@@ -71,12 +69,15 @@ function init_repo {
init_repo init_repo
export current_version=1.2.3 export current_version=1.2.3
export INPUT_INCREMENT="patch" export increment="patch"
run ../../version-increment.sh run ../../version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=major-version::1"* ]] &&
[[ "$output" = *"::set-output name=minor-version::2"* ]] &&
[[ "$output" = *"::set-output name=patch-version::4"* ]] &&
[[ "$output" = *"::set-output name=version::1.2.4"* ]] [[ "$output" = *"::set-output name=version::1.2.4"* ]]
} }
@@ -84,12 +85,15 @@ function init_repo {
init_repo init_repo
export current_version=1.2.3 export current_version=1.2.3
export INPUT_INCREMENT="minor" export increment="minor"
run ../../version-increment.sh run ../../version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=major-version::1"* ]] &&
[[ "$output" = *"::set-output name=minor-version::3"* ]] &&
[[ "$output" = *"::set-output name=patch-version::0"* ]] &&
[[ "$output" = *"::set-output name=version::1.3.0"* ]] [[ "$output" = *"::set-output name=version::1.3.0"* ]]
} }
@@ -97,20 +101,40 @@ function init_repo {
init_repo init_repo
export current_version=1.2.3 export current_version=1.2.3
export INPUT_INCREMENT="major" export increment="major"
run ../../version-increment.sh run ../../version-increment.sh
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=major-version::2"* ]] &&
[[ "$output" = *"::set-output name=minor-version::0"* ]] &&
[[ "$output" = *"::set-output name=patch-version::0"* ]] &&
[[ "$output" = *"::set-output name=version::2.0.0"* ]] [[ "$output" = *"::set-output name=version::2.0.0"* ]]
} }
@test "prefixes with v" {
init_repo
export current_version=1.2.3
export increment="major"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=version::2.0.0"* ]] &&
[[ "$output" = *"::set-output name=major-v-version::v2"* ]] &&
[[ "$output" = *"::set-output name=minor-v-version::v0"* ]] &&
[[ "$output" = *"::set-output name=patch-v-version::v0"* ]] &&
[[ "$output" = *"::set-output name=v-version::v2.0.0"* ]]
}
@test "increments to a new month (calver)" { @test "increments to a new month (calver)" {
init_repo init_repo
export current_version=2020.6.4 export current_version=2020.6.4
export INPUT_SCHEME="calver" export scheme="calver"
run ../../version-increment.sh run ../../version-increment.sh
@@ -123,7 +147,7 @@ function init_repo {
init_repo init_repo
export current_version="$(date +%Y.%-m.123)" export current_version="$(date +%Y.%-m.123)"
export INPUT_SCHEME="calver" export scheme="calver"
run ../../version-increment.sh run ../../version-increment.sh

View File

@@ -20,7 +20,7 @@ function init_repo {
@test "fails if invalid scheme given" { @test "fails if invalid scheme given" {
init_repo init_repo
export INPUT_SCHEME="foover" export scheme="foover"
run ../../version-lookup.sh run ../../version-lookup.sh
@@ -43,6 +43,19 @@ function init_repo {
[[ "$output" = *"::set-output name=current-version::0.1.2"* ]] [[ "$output" = *"::set-output name=current-version::0.1.2"* ]]
} }
@test "prefixes with a v" {
init_repo
git tag 0.1.2
run ../../version-lookup.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"::set-output name=current-version::0.1.2"* ]] &&
[[ "$output" = *"::set-output name=current-v-version::v0.1.2"* ]]
}
@test "finds the current normal version even if there's a newer pre-release version" { @test "finds the current normal version even if there's a newer pre-release version" {
init_repo init_repo
@@ -81,7 +94,7 @@ function init_repo {
@test "returns a calver if no normal version detected and calver scheme specified" { @test "returns a calver if no normal version detected and calver scheme specified" {
init_repo init_repo
export INPUT_SCHEME="calver" export scheme="calver"
run ../../version-lookup.sh run ../../version-lookup.sh

View File

@@ -6,25 +6,21 @@ script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "${script_dir}/shared.sh" source "${script_dir}/shared.sh"
if [[ -z "${current_version:-}" ]] ; then increment="${increment:-patch}"
echo "🛑 Environment variable 'current_version' is unset or empty" 1>&2
exit 5
fi
if [[ -z "$(echo "${current_version}" | ${grep} -P "${pcre_master_ver}")" ]] ; then
echo "🛑 Environment variable 'current_version' is not a valid normal version (M.m.p)" 1>&2
exit 6
fi
increment="${INPUT_INCREMENT:-patch}"
if [[ "${increment}" != 'patch' && "${increment}" != 'minor' && "${increment}" != 'major' ]] ; then if [[ "${increment}" != 'patch' && "${increment}" != 'minor' && "${increment}" != 'major' ]] ; then
echo "🛑 Value of 'increment' is not valid, choose from 'major', 'minor', or 'patch'" 1>&2 echo "🛑 Value of 'increment' is not valid, choose from 'major', 'minor', or 'patch'" 1>&2
exit 7 input_errors='true'
fi fi
scheme="${INPUT_SCHEME:-semver}" if [[ -z "${current_version:-}" ]] ; then
if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' ]] ; then echo "🛑 Environment variable 'current_version' is unset or empty" 1>&2
echo "🛑 Value of 'scheme' is not valid, choose from 'semver' or 'calver'" 1>&2 input_errors='true'
elif [[ -z "$(echo "${current_version}" | ${grep} -P "${pcre_master_ver}")" ]] ; then
echo "🛑 Environment variable 'current_version' is not a valid normal version (M.m.p)" 1>&2
input_errors='true'
fi
if [[ "${input_errors}" == 'true' ]] ; then
exit 8 exit 8
fi fi
@@ -91,3 +87,10 @@ fi
echo " The new version is ${new_version}" echo " The new version is ${new_version}"
echo "::set-output name=version::${new_version}" echo "::set-output name=version::${new_version}"
echo "::set-output name=v-version::v${new_version}"
echo "::set-output name=major-version::${version_array[0]}"
echo "::set-output name=minor-version::${version_array[1]}"
echo "::set-output name=patch-version::${version_array[2]}"
echo "::set-output name=major-v-version::v${version_array[0]}"
echo "::set-output name=minor-v-version::v${version_array[1]}"
echo "::set-output name=patch-v-version::v${version_array[2]}"

View File

@@ -6,9 +6,7 @@ script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
# shellcheck source=shared.sh # shellcheck source=shared.sh
source "${script_dir}/shared.sh" source "${script_dir}/shared.sh"
scheme="${INPUT_SCHEME:-semver}" if [[ "${input_errors}" == 'true' ]] ; then
if [[ "${scheme}" != 'semver' && "${scheme}" != 'calver' ]] ; then
echo "🛑 Value of 'scheme' is not valid, choose from 'semver' or 'calver'" 1>&2
exit 8 exit 8
fi fi
@@ -29,18 +27,18 @@ fi
# Skip if testing, otherwise pull tags # Skip if testing, otherwise pull tags
if [[ -z "${BATS_VERSION:-}" ]] ; then if [[ -z "${BATS_VERSION:-}" ]] ; then
git fetch --quiet origin 'refs/tags/*:refs/tags/*' git fetch --quiet --force origin 'refs/tags/*:refs/tags/*'
fi fi
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## Version parsing ## Version parsing
# detect current version - removing "v" from start of tag if it exists # detect current version - removing "v" from start of tag if it exists
current_version="$(git tag -l | { ${grep} -P "${pcre_allow_vprefix}" || true; } | sed 's/^v//g' | sort -V --reverse | head -n1)" current_version="$(git tag -l | { ${grep} -P "${pcre_allow_vprefix}" || true; } | sed 's/^v//g' | sort -V | tail -n 1)"
# support transition from an old reecetech calver style (yyyy-mm-Rr, where R is the literal `R`, and r is the nth release for the month) # support transition from an old reecetech calver style (yyyy-mm-Rr, where R is the literal `R`, and r is the nth release for the month)
if [[ -z "${current_version:-}" ]] ; then if [[ -z "${current_version:-}" ]] ; then
current_version="$(git tag -l | { ${grep} -P "${pcre_old_calver}" || true; } | sort -V --reverse | head -n1)" current_version="$(git tag -l | { ${grep} -P "${pcre_old_calver}" || true; } | sort -V | tail -n 1)"
if [[ -n "${current_version:-}" ]] ; then if [[ -n "${current_version:-}" ]] ; then
# convert - to . and drop leading zeros & the R # convert - to . and drop leading zeros & the R
current_version="$(echo "${current_version}" | sed -r 's/^([0-9]+)-0{0,1}([0-9]+)-R0{0,1}([0-9]+)$/\1.\2.\3/')" current_version="$(echo "${current_version}" | sed -r 's/^([0-9]+)-0{0,1}([0-9]+)-R0{0,1}([0-9]+)$/\1.\2.\3/')"
@@ -64,3 +62,4 @@ fi
echo " The current normal version is ${current_version}" echo " The current normal version is ${current_version}"
echo "::set-output name=current-version::${current_version}" echo "::set-output name=current-version::${current_version}"
echo "::set-output name=current-v-version::v${current_version}"