41 Commits

Author SHA1 Message Date
Phil Jay
ae1ae190dc Merge pull request #31 from reecetech/feature/support-conventional-commits
Support conventional commits
2024-04-23 17:41:08 +10:00
Phil Jay
81805365e1 Update README.md for version bump 2024-04-23 17:37:34 +10:00
Phil Jay
c6ea11748a Update README.md for conventional commits 2024-04-23 17:34:47 +10:00
Phil Jay
73ade5516c Update version-increment.sh for old comment 2024-04-23 17:17:01 +10:00
Phil Jay
352a9961c8 Update action.yml for README 2024-04-23 17:13:22 +10:00
Daniel Atanasovski
a449b75848 test: add tests for new conventional_commits scheme 2024-03-20 15:41:30 +11:00
Daniel Atanasovski
0df84379a9 feat: add new scheme conventional_commits 2024-03-20 15:41:06 +11:00
Daniel Atanasovski
0c4ebd1e55 fix: strip leading 0 in date command for CI workflow 2024-03-20 15:39:13 +11:00
Daniel Atanasovski
b920b6b45e feat: shellcheck config for simplicity 2024-03-20 15:38:23 +11:00
Phil Jay
71036b212b Merge pull request #27 from reecetech/maintenance
Remove old code blocks
2023-10-20 16:12:58 +11:00
Phil Jay
bfdbc118ba Remove transitional code
We don't have any more projects at `reecetech` that use the older
non-semver compliant calver versioning
2023-10-19 22:27:40 +11:00
Phil Jay
68bf4fe26d Remove duplicate code
The functionality is included in `shared.sh` which is sourced by this
file
2023-10-19 22:25:05 +11:00
Phil Jay
89a53df5e6 Merge pull request #26 from reecetech/use_api
Add new `use_api` feature, to allow the action to work without checking out the repo first
2023-10-19 14:36:08 +11:00
Phil Jay
aac681e0d0 Improve testing by testing the action.yml 2023-10-19 00:41:37 +11:00
Phil Jay
95f6bcc37a Update README 2023-10-19 00:24:41 +11:00
Phil Jay
8b80e08158 Add use_api feature
So that you don't _need_ to checkout (clone) the repo to the worker
2023-10-19 00:24:41 +11:00
Phil Jay
27ee2a7786 Add testing for use_api 2023-10-18 23:59:53 +11:00
Phil Jay
de5ab041fb Merge pull request #25 from reecetech/update-shellcheck-action
Update shellcheck action
2023-09-20 10:41:05 +10:00
Phil Jay
3ac8392aa4 Update to latest shellcheck
Solves for `set-output` deprecation warnings
2023-09-20 10:39:13 +10:00
Phil Jay
72c1fa6077 Bump up example version 2023-09-20 10:38:38 +10:00
Phil Jay
f21e559797 Merge pull request #24 from reecetech/swtich-to-softprops/action-gh-release
Replace out-of-date action
2023-09-20 10:36:27 +10:00
Phil Jay
4415fcb6c0 Replace out-of-date action
The update to node 16 has been un-merged for a long time: https://github.com/marvinpinto/action-automatic-releases/pull/2
2023-09-20 10:33:38 +10:00
Phil Jay
4846cbaf9d Merge pull request #23 from ps-jay/main
Introduce test for `release_branch`, & update README
2023-09-18 09:11:58 +10:00
Phil Jay
468208262a Default variable to blank string 2023-09-18 09:01:27 +10:00
Phil Jay
e5f8667dfc Add test for release_branch 2023-09-18 09:01:27 +10:00
Phil Jay
2ef15157dd Update README 2023-09-18 09:01:27 +10:00
Phil Jay
0974302def Merge pull request #22 from octoev/main
Add release branch as an input
2023-09-18 09:00:11 +10:00
Adam Short
67d70b45a4 Specify "release_branch" is not required 2023-09-05 10:15:26 +01:00
adamshortev
47e175a747 Apply suggestions from code review
Co-authored-by: Chris Bennett <110393183+oev-chrisbennett@users.noreply.github.com>
2023-08-30 11:48:14 +01:00
Adam Short
8202de8885 Give action unique name. 2023-08-30 11:17:54 +01:00
Adam Short
fa8feb816e Add release branch as an input 2023-08-25 16:46:55 +01:00
Phil Jay
1e4c88d873 Merge pull request #21 from reecetech/support-pep440
Add PEP440 compatibility mode
2023-04-27 12:00:51 +10:00
Phil Jay
d5f78b25d1 Update test cases 2023-04-27 11:59:49 +10:00
Phil Jay
bfb5689c4d Update README 2023-04-27 09:33:35 +10:00
Phil Jay
f81c317cbd Alter PEP440 handling to support both sem and cal 2023-04-27 09:10:47 +10:00
Phil Jay
bb0e075f8b Add pep440 mode 2023-04-26 16:31:08 +10:00
Phil Jay
f1fae3d6b7 Merge pull request #20 from reecetech/fix-label
Fix output name to match documentation
2023-03-10 12:49:39 +11:00
Phil Jay
77dfab16c0 Update README.md for next release 2023-03-10 12:41:56 +11:00
Phil Jay
2414f2fa44 Fix output name to match documentation 2023-03-10 12:40:51 +11:00
Phil Jay
f6d4e915f4 Merge pull request #19 from reecetech/update-ver-in-README
Update to have the latest version as the example in the README
2022-10-19 14:28:09 +11:00
Phil Jay
5f9f764060 New version available! 2022-10-19 14:26:06 +11:00
9 changed files with 508 additions and 77 deletions

View File

@@ -13,10 +13,10 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Run ShellCheck - name: Run ShellCheck
uses: ludeeus/action-shellcheck@94e0aab03ca135d11a35e5bfc14e6746dc56e7e9 # v1.1.0 uses: ludeeus/action-shellcheck@2.0.0
with: with:
check_together: 'yes' check_together: 'yes'
@@ -24,7 +24,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Setup bats - name: Setup bats
uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d # v1.2.0 uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d # v1.2.0
@@ -34,14 +34,85 @@ jobs:
- name: Test - name: Test
run: bats tests/*.bats run: bats tests/*.bats
release: test-api-mode: # requires github API, didn't want to mock it
runs-on: ubuntu-latest
env:
github_token: ${{ github.token }}
steps:
- name: Checkout code # have to checkout to have the source code available
uses: actions/checkout@v4
- name: Remove .git directory # remove the git directory to make the testing valid
run: rm -rf .git/
- name: Test lookup version (with API)
id: version-lookup
env:
use_api: 'true'
run: ./version-lookup.sh
- name: Check lookup result
shell: bash
run: '[[ -n "${{ steps.version-lookup.outputs.CURRENT_VERSION }}" ]]'
- name: Test increment version (with API)
id: version-increment
run: ./version-increment.sh
env:
current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
scheme: calver
use_api: 'true'
- name: Check increment result
shell: bash
run: '[[ "$(date +%Y.%-m)" == "$(echo "${{ steps.version-increment.outputs.VERSION }}" | cut -d "." -f 1-2)" ]]'
test-action-yml: # integration testing
needs: needs:
- lint - lint
- test - test
- test-api-mode
runs-on: ubuntu-latest
steps:
- name: Checkout code # have to checkout to have the source code available
uses: actions/checkout@v4
- name: Remove .git directory # remove the git directory to make the testing valid
run: rm -rf .git/
- name: Get next version via API
uses: ./
id: version-via-api
with:
scheme: 'calver'
use_api: true
- name: Checkout code
uses: actions/checkout@v4
- name: Get next version via Git
uses: ./
id: version-via-git
with:
scheme: 'calver'
use_api: false
- name: Check results agree
shell: bash
run: |
[[ "${{ steps.version-via-api.outputs.current-version }}" == "${{ steps.version-via-git.outputs.current-version }}" ]]
[[ "${{ steps.version-via-api.outputs.major-version }}" == "${{ steps.version-via-git.outputs.major-version }}" ]]
[[ "${{ steps.version-via-api.outputs.minor-version }}" == "${{ steps.version-via-git.outputs.minor-version }}" ]]
[[ "${{ steps.version-via-api.outputs.patch-version }}" == "${{ steps.version-via-git.outputs.patch-version }}" ]]
# Don't test the full version or pre-version, since the number of digits is likely to be different (9 via api vs. 7 via git)
release:
needs:
- test-action-yml
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Lookup version - name: Lookup version
id: version-lookup id: version-lookup
@@ -55,10 +126,9 @@ jobs:
scheme: calver scheme: calver
- name: Release version - name: Release version
uses: marvinpinto/action-automatic-releases@919008cf3f741b179569b7a6fb4d8860689ab7f0 # v1.2.1 uses: softprops/action-gh-release@v1
if: ${{ github.ref_name == github.event.repository.default_branch }} if: ${{ github.ref_name == github.event.repository.default_branch }}
with: with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
draft: false draft: false
prerelease: false prerelease: false
automatic_release_tag: "${{ steps.version-increment.outputs.VERSION }}" tag_name: "${{ steps.version-increment.outputs.VERSION }}"

1
.shellcheckrc Normal file
View File

@@ -0,0 +1 @@
external-sources=true

View File

@@ -1,15 +1,15 @@
# Version Increment # Version Increment
## 📄 Use ## Use 📄
### ⌨️ Example ### Example ⌨️
```yaml ```yaml
- name: Checkout code - name: Checkout code
uses: actions/checkout@v2 uses: actions/checkout@v4
- name: Get next version - name: Get next version
uses: reecetech/version-increment@2022.5.1 uses: reecetech/version-increment@2023.9.3
id: version id: version
with: with:
scheme: semver scheme: semver
@@ -23,7 +23,21 @@
context: . context: .
``` ```
### 🔖 semver #### API mode 🔗
Maybe you don't want to checkout your code in the job that calculates the version number. That's okay, you can
use the API mode:
```yaml
- name: Get next version
uses: reecetech/version-increment@2024.4.1
id: version
with:
use_api: true
```
### semver 🔖
This action will detect the current latest _normal_ semantic version (semver) from the tags in This action will detect the current latest _normal_ semantic version (semver) from the tags in
a git repository. It will increment the version as directed (by default: +1 to a git repository. It will increment the version as directed (by default: +1 to
the patch digit). Both the current latest and the incremented version are the patch digit). Both the current latest and the incremented version are
@@ -36,7 +50,7 @@ e.g. `1.2.7`
See: https://semver.org/spec/v2.0.0.html See: https://semver.org/spec/v2.0.0.html
### 📅 calver (semver compliant) ### calver (semver compliant) 📅
Optionally, this action can provide semver compliant calendar versions (calver). Optionally, this action can provide semver compliant calendar versions (calver).
In this calver scheme, the semver major, minor and patch digits map to year, In this calver scheme, the semver major, minor and patch digits map to year,
@@ -52,35 +66,70 @@ e.g. `2021.6.2`
| minor | month | `6` | | minor | month | `6` |
| patch | release | `2` | The *n*th release for the month | | patch | release | `2` | The *n*th release for the month |
If the current latest normal version is not the current year and month, then the year and month digits will be If the current latest normal version is not the current year and month, then the
year and month digits will be
set to the current year and month, and the release digit will be reset to 1. set to the current year and month, and the release digit will be reset to 1.
### 🎋 Default branch vs. any other branch ### Conventional Commits (semver with smarts) 💡
If you choose the conventional commits scheme, the action will parse the last commit message _(usually the merge commit)_ to determine
the increment type for a `semver` version.
The following increment types by keyword are supported:
- patch: build, chore, ci, docs, fix, perf, refactor, revert, style, test
- minor: feat
- major: any of the above keywords followed by a '!' character, or 'BREAKING CHANGE:' in commit body
If none of the keywords are detected, then the increment specified by the `increment` input will be used (defaults to patch).
> [!TIP]
> You might like to _enforce_ conventional commits in the title of your pull requests to ensure that the merge commit has the correct
> information. Something like this action might be handy: https://github.com/marketplace/actions/conventional-commit-in-pull-requests
### Default branch vs. any other branch 🎋
**Default branch** **Default branch**
The action will return a _normal_ version if it is detected that the current commit is on the default branch (usually `main`). The action will return a _normal_ version if it is detected that the current commit
is on the default branch (usually `main`).
Examples: Examples:
* `1.2.7` * `1.2.7`
* `2021.6.2` * `2021.6.2`
You may override the branch to consider the release branch if it is not the default branch, by providing a specific
release branch name as an input. For example:
```yaml
- name: Get next version
uses: reecetech/version-increment@2023.10.1
id: version
with:
release_branch: publish
```
**Any other branch** **Any other branch**
The action will return a _pre-release_ version if any other branch is detected (e.g. `new-feature`, `bugfix/foo`, etc). The _pre-release_ portion of the version number will be the literal string `pre.` followed by the git commit ID short reference SHA (trimmed of any leading zeros). The action will return a _pre-release_ version if any other branch is detected
(e.g. `new-feature`, `bugfix/foo`, etc). The _pre-release_ portion of the version number
will be the literal string `pre.` followed by the git commit ID short reference SHA
(trimmed of any leading zeros).
Examples: Examples:
* `1.2.7-pre.41218aa78` * `1.2.7-pre.41218aa78`
* `2021.6.2-pre.32fd19841` * `2021.6.2-pre.32fd19841`
### 📥 Inputs ### Inputs 📥
| name | description | required | default | | name | description | required | default |
| :--- | :--- | :--- | :--- | | :--- | :--- | :--- | :--- |
| scheme | The versioning scheme in-use, either `semver` or `calver` | No | `semver` | | scheme | The versioning scheme in-use, either `semver`, `calver` or `conventional_commits` | No | `semver` |
| pep440 | Set to `true` for PEP440 compatibility of _pre-release_ versions by making use of the build metadata segment of semver, which maps to local version identifier in PEP440 | No | `false` |
| increment | The digit to increment, either `major`, `minor` or `patch`, ignored if `scheme` == `calver` | No | `patch` | | increment | The digit to increment, either `major`, `minor` or `patch`, ignored if `scheme` == `calver` | No | `patch` |
| release_branch | Specify a non-default branch to use for the release tag (the one without -pre) | No | |
| use_api | Use the GitHub API to discover current tags, which avoids the need for a git checkout, but requires `curl` and `jq` | No | `false` |
### 📤 Outputs ### Outputs 📤
| name | description | | name | description |
| :--- | :--- | | :--- | :--- |
@@ -96,7 +145,7 @@ Examples:
| minor-v-version | Minor 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 | | patch-v-version | Patch number of the incremented version, prefixed with a `v` character |
## 💕 Contributing ## Contributing 💕
Please raise a pull request, but note the testing tools below Please raise a pull request, but note the testing tools below

View File

@@ -8,23 +8,45 @@ 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 (e.g. the merge commit) to
determine the increment type, and supports the following increment types by keyword:
- patch (build, chore, ci, docs, fix, perf, refactor, revert, style, test)
- minor (feat)
- major (any of the above keywords followed by a '!' character, or 'BREAKING CHANGE:' in commit body)
required: false required: false
default: 'semver' default: 'semver'
pep440:
description: 'PEP440 compatibility mode - shifts the pre-release version information into build metadata instead'
required: false
default: false
increment: increment:
description: | description: |
Field to increment - major, minor, or, patch (defaults to patch) Field to increment - major, minor, or, patch (defaults to patch)
If using the `conventional_commits` scheme, this is the default increment if the parsing of the merge commit fails to
find conventional commits information
Not applicable to `calver` scheme Not applicable to `calver` scheme
required: false required: false
default: 'patch' default: 'patch'
release_branch:
description: 'Specify a non-default branch to use for the release tag (the one without -pre)'
required: false
type: string
use_api:
description: 'Use the GitHub API to discover current tags, which avoids the need for a git checkout, but requires `curl` and `jq`'
required: false
default: false
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: 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'
@@ -41,7 +63,7 @@ outputs:
patch-version: patch-version:
description: 'Patch number of the incremented version' description: 'Patch number of the incremented version'
value: ${{ steps.version-increment.outputs.PATCH_VERSION }} value: ${{ steps.version-increment.outputs.PATCH_VERSION }}
pre-release-version: pre-release-label:
description: 'Pre-release label of the incremented version' description: 'Pre-release label of the incremented version'
value: ${{ steps.version-increment.outputs.PRE_RELEASE_LABEL }} value: ${{ steps.version-increment.outputs.PRE_RELEASE_LABEL }}
major-v-version: major-v-version:
@@ -61,7 +83,9 @@ runs:
run: ${{ github.action_path }}/version-lookup.sh run: ${{ github.action_path }}/version-lookup.sh
shell: bash shell: bash
env: env:
github_token: ${{ github.token }}
scheme: ${{ inputs.scheme }} scheme: ${{ inputs.scheme }}
use_api: ${{ inputs.use_api }}
- id: version-increment - id: version-increment
run: ${{ github.action_path }}/version-increment.sh run: ${{ github.action_path }}/version-increment.sh
@@ -69,4 +93,8 @@ runs:
env: env:
current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }} current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
increment: ${{ inputs.increment }} increment: ${{ inputs.increment }}
github_token: ${{ github.token }}
pep440: ${{ inputs.pep440 }}
scheme: ${{ inputs.scheme }} scheme: ${{ inputs.scheme }}
release_branch: ${{ inputs.release_branch }}
use_api: ${{ inputs.use_api }}

View File

@@ -11,16 +11,43 @@ 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
pep440="${pep440:-false}"
if [[ "${pep440}" != 'false' && "${pep440}" != 'true' ]] ; then
echo "🛑 Value of 'pep440' is not valid, choose from 'false' or 'true'" 1>&2
input_errors='true'
fi
use_api="${use_api:-false}"
if [[ "${use_api}" != 'false' && "${use_api}" != 'true' ]] ; then
echo "🛑 Value of 'use_api' is not valid, choose from 'false' or 'true'" 1>&2
input_errors='true'
fi
if [[ "${use_api}" == 'true' ]] ; then
if [[ -z "${github_token:-}" ]] ; then
echo "🛑 'use_api' is true, but environment variable 'github_token' is not set" 1>&2
input_errors='true'
fi
fi
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## MacOS compatibility - for local testing ## MacOS compatibility - for local testing

View File

@@ -53,6 +53,18 @@ function init_repo {
[[ "$output" = *"Value of 'scheme' is not valid"* ]] [[ "$output" = *"Value of 'scheme' is not valid"* ]]
} }
@test "fails if invalid value for pep440 given" {
init_repo
export pep440="yes"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 8 ] &&
[[ "$output" = *"Value of 'pep440' is not valid"* ]]
}
@test "fails if invalid increment given" { @test "fails if invalid increment given" {
init_repo init_repo
@@ -104,6 +116,23 @@ function init_repo {
[[ "$output" = *"VERSION=1.3.0"* ]] [[ "$output" = *"VERSION=1.3.0"* ]]
} }
@test "increments the minor digit correctly (explicitly not pep440)" {
init_repo
export current_version=1.2.3
export pep404="false"
export increment="minor"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"MAJOR_VERSION=1"* ]] &&
[[ "$output" = *"MINOR_VERSION=3"* ]] &&
[[ "$output" = *"PATCH_VERSION=0"* ]] &&
[[ "$output" = *"VERSION=1.3.0"* ]]
}
@test "increments the major digit correctly (semver)" { @test "increments the major digit correctly (semver)" {
init_repo init_repo
@@ -120,6 +149,23 @@ function init_repo {
[[ "$output" = *"VERSION=2.0.0"* ]] [[ "$output" = *"VERSION=2.0.0"* ]]
} }
@test "increments the major digit correctly (pep440 mode)" {
init_repo
export current_version=1.2.3
export pep404="true"
export increment="major"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"MAJOR_VERSION=2"* ]] &&
[[ "$output" = *"MINOR_VERSION=0"* ]] &&
[[ "$output" = *"PATCH_VERSION=0"* ]] &&
[[ "$output" = *"VERSION=2.0.0"* ]]
}
@test "prefixes with v" { @test "prefixes with v" {
init_repo init_repo
@@ -174,6 +220,183 @@ function init_repo {
print_run_info print_run_info
[ "$status" -eq 0 ] && [ "$status" -eq 0 ] &&
[[ "$output" = *"PRE_RELEASE_LABEL=pre.${short_ref}"* ]] [[ "$output" = *"PRE_RELEASE_LABEL=pre.${short_ref}"* ]] &&
[[ "$output" = *"VERSION=1.2.4-pre.${short_ref}"* ]] [[ "$output" = *"VERSION=1.2.4-pre.${short_ref}"* ]]
} }
@test "does not append prerelease information if on a specified release_branch" {
init_repo
export current_version=1.2.3
export GITHUB_REF="refs/heads/releases"
export release_branch="releases"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" != *"PRE_RELEASE_LABEL=pre."* ]] &&
[[ "$output" != *"VERSION=1.2.4-pre."* ]] &&
[[ "$output" = *"VERSION=1.2.4"* ]]
}
@test "appends prerelease information in pep440 compatible way when pep440 is true" {
init_repo
export current_version=10.20.30
export pep440="true"
export GITHUB_REF="refs/heads/super-awesome-python"
export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"PRE_RELEASE_LABEL=pre.${short_ref}"* ]] &&
[[ "$output" = *"VERSION=10.20.31+pre.${short_ref}"* ]]
}
@test "appends prerelease information in pep440 compatible way when pep440 is true, and using calver scheme" {
init_repo
export current_version=2020.6.4
export scheme="calver"
export pep440="true"
export GITHUB_REF="refs/heads/super-awesome-python"
export short_ref="$(git rev-parse --short HEAD | sed 's/0*//')"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"PRE_RELEASE_LABEL=pre.${short_ref}"* ]] &&
[[ "$output" = *"VERSION=$(date +%Y.%-m.1)+pre.${short_ref}"* ]]
}
@test "increments the patch version after a fix commit (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "fix: something" > fix.txt
git add fix.txt
git commit -m "fix: something"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=1.2.4"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the patch version after a scoped fix commit (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "fix: something" > fix.txt
git add fix.txt
git commit -m "fix(api): something"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=1.2.4"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the major version after a breaking fix commit (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "fix: breaking something" > fix.txt
git add fix.txt
git commit -m "fix!: something"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=2.0.0"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the minor version after a feat commit (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "new feature" > feat.txt
git add feat.txt
git commit -m "feat: something"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=1.3.0"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the major version after a breaking feat commit (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "breaking new feature" > feat.txt
git add feat.txt
git commit -m "feat!: something"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=2.0.0"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the major version after a breaking change in the commit body (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "breaking new fix" > feat.txt
git add feat.txt
git commit -m "Fix: something
BREAKING CHANGE: really important"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=2.0.0"* ]]
[[ "$output" != *"No conventional commit found"* ]]
}
@test "increments the patch version by default if no conventional commits found and enabled (conventional commits)" {
init_repo
export current_version=1.2.3
export scheme="conventional_commits"
echo "some new change" > feat.txt
git add feat.txt
git commit -m "new change"
run ../../version-increment.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=1.2.4"* ]]
[[ "$output" = *"No conventional commit found"* ]]
}

View File

@@ -110,18 +110,6 @@ function init_repo {
[[ "$output" = *"CURRENT_VERSION=$(date '+%Y.%-m.0')"* ]] [[ "$output" = *"CURRENT_VERSION=$(date '+%Y.%-m.0')"* ]]
} }
@test "converts from older calver scheme automatically" {
init_repo
git tag 2020-09-R2
run ../../version-lookup.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"CURRENT_VERSION=2020.9.2"* ]]
}
@test "strips v from the version" { @test "strips v from the version" {
init_repo init_repo

View File

@@ -28,15 +28,60 @@ fi
## Git info - branch names, commit short ref ## Git info - branch names, commit short ref
default_branch='main' default_branch='main'
# use release_branch if not empty
if [[ -n "${release_branch:-}" ]] ; then
default_branch="${release_branch}"
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 [[ -z "${BATS_VERSION:-}" ]] ; then if [[ "${use_api:-}" == 'true' ]] ; then
default_branch="$(
curl -fsSL \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${github_token}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}" \
| jq -r '.default_branch'
)"
else
default_branch="$(git remote show origin | ${grep} 'HEAD branch' | cut -d ' ' -f 5)" default_branch="$(git remote show origin | ${grep} 'HEAD branch' | cut -d ' ' -f 5)"
fi fi
fi
current_ref="${GITHUB_REF:-}" current_ref="${GITHUB_REF:-}"
git_commit="$(git rev-parse --short HEAD | sed 's/0*//')" # trim leading zeros, because semver doesn't allow that in git_commit_sha=${GITHUB_SHA:-}
# the 'pre-release version' part, but we can't use the + char
# to make it 'build metadata' as that's not supported in K8s if [[ "${use_api:-}" == 'true' ]] ; then
# labels # because we cannot use `rev-parse` with the API, we'll take a punt that 9 characters is enough for uniqueness
# shellcheck disable=SC2001
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
git_commit="$(git rev-parse --short HEAD | sed 's/0*//')" # to make it 'build metadata' as that's not supported in K8s
git_commit_sha="$(git rev-parse --short HEAD)" # labels
fi
##==----------------------------------------------------------------------------
## Conventional commits
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
@@ -75,7 +120,11 @@ fi
# add pre-release info to version if not the default branch # add pre-release info to version if not the default branch
if [[ "${current_ref}" != "refs/heads/${default_branch}" ]] ; then if [[ "${current_ref}" != "refs/heads/${default_branch}" ]] ; then
pre_release="pre.${git_commit}" pre_release="pre.${git_commit}"
if [[ "${pep440:-}" == 'true' ]] ; then
new_version="${new_version}+${pre_release}"
else
new_version="${new_version}-${pre_release}" new_version="${new_version}-${pre_release}"
fi
echo "PRE_RELEASE_LABEL=${pre_release}" >> "${GITHUB_OUTPUT}" echo "PRE_RELEASE_LABEL=${pre_release}" >> "${GITHUB_OUTPUT}"
fi fi

View File

@@ -10,39 +10,35 @@ if [[ "${input_errors}" == 'true' ]] ; then
exit 8 exit 8
fi fi
##==----------------------------------------------------------------------------
## MacOS compatibility - for local testing
export grep="grep"
if [[ "$(uname)" == "Darwin" ]] ; then
export grep="ggrep"
if ! grep --version 1>/dev/null ; then
echo "🛑 GNU grep not installed, try brew install coreutils" 1>&2
exit 9
fi
fi
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## Get tags from GitHub repo ## Get tags from GitHub repo
# Skip if testing, otherwise pull tags # Skip if testing, or if use_api is true, otherwise pull tags
if [[ -z "${BATS_VERSION:-}" ]] ; then if [[ -z "${BATS_VERSION:-}" ]] ; then
if [[ "${use_api:-}" != 'true' ]] ; then
git fetch --quiet --force origin 'refs/tags/*:refs/tags/*' git fetch --quiet --force origin 'refs/tags/*:refs/tags/*'
fi 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 | tail -n 1)" if [[ "${use_api:-}" == 'true' ]] ; then
current_version="$(
# 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) curl -fsSL \
if [[ -z "${current_version:-}" ]] ; then -H "Accept: application/vnd.github+json" \
current_version="$(git tag -l | { ${grep} -P "${pcre_old_calver}" || true; } | sort -V | tail -n 1)" -H "Authorization: Bearer ${github_token}" \
if [[ -n "${current_version:-}" ]] ; then -H "X-GitHub-Api-Version: 2022-11-28" \
# convert - to . and drop leading zeros & the R "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/git/matching-refs/tags/" \
current_version="$(echo "${current_version}" | sed -r 's/^([0-9]+)-0{0,1}([0-9]+)-R0{0,1}([0-9]+)$/\1.\2.\3/')" | jq -r '.[].ref' | sed 's|refs/tags/||g' \
fi | { ${grep} -P "${pcre_allow_vprefix}" || true; } | sed 's/^v//g' | sort -V | tail -n 1
)"
else
current_version="$(
git tag -l \
| { ${grep} -P "${pcre_allow_vprefix}" || true; } | sed 's/^v//g' | sort -V | tail -n 1
)"
fi fi
# handle no version detected - start versioning! # handle no version detected - start versioning!
@@ -50,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)