8 Commits

Author SHA1 Message Date
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
7 changed files with 215 additions and 56 deletions

View File

@@ -9,12 +9,126 @@ on:
- '**' - '**'
jobs: jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run ShellCheck
uses: ludeeus/action-shellcheck@2.0.0
with:
check_together: 'yes'
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Get next version - name: Checkout code
uses: reecetech/version-increment@use_api uses: actions/checkout@v4
id: version
- name: Setup bats
uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d # v1.2.0
with: with:
bats-version: 1.8.0
- name: Test
run: bats tests/*.bats
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 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:
- lint
- 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 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
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Lookup version
id: version-lookup
run: ./version-lookup.sh
- name: Increment version
id: version-increment
run: ./version-increment.sh
env:
current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
scheme: calver
- name: Release version
uses: softprops/action-gh-release@v1
if: ${{ github.ref_name == github.event.repository.default_branch }}
with:
draft: false
prerelease: false
tag_name: "${{ steps.version-increment.outputs.VERSION }}"

View File

@@ -1,12 +1,12 @@
# 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@2023.9.3 uses: reecetech/version-increment@2023.9.3
@@ -23,7 +23,20 @@
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@2023.10.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
@@ -37,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,
@@ -57,7 +70,7 @@ If the current latest normal version is not the current year and month, then the
year and month digits will be 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 ### Default branch vs. any other branch 🎋
**Default branch** **Default branch**
@@ -68,6 +81,17 @@ 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 The action will return a _pre-release_ version if any other branch is detected
@@ -79,7 +103,7 @@ 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 |
| :--- | :--- | :--- | :--- | | :--- | :--- | :--- | :--- |
@@ -87,8 +111,9 @@ Examples:
| 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` | | 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 | | | 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 |
| :--- | :--- | | :--- | :--- |
@@ -104,7 +129,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

@@ -26,6 +26,10 @@ inputs:
description: 'Specify a non-default branch to use for the release tag (the one without -pre)' description: 'Specify a non-default branch to use for the release tag (the one without -pre)'
required: false required: false
type: string 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:
@@ -69,7 +73,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
@@ -77,6 +83,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 }} pep440: ${{ inputs.pep440 }}
scheme: ${{ inputs.scheme }} scheme: ${{ inputs.scheme }}
release_branch: ${{ inputs.release_branch }} release_branch: ${{ inputs.release_branch }}
use_api: ${{ inputs.use_api }}

View File

@@ -27,6 +27,20 @@ if [[ "${pep440}" != 'false' && "${pep440}" != 'true' ]] ; then
input_errors='true' input_errors='true'
fi 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

@@ -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,20 +28,34 @@ fi
## Git info - branch names, commit short ref ## Git info - branch names, commit short ref
default_branch='main' default_branch='main'
# if we're _not_ testing, then _actually_ check the origin
if [[ -z "${BATS_VERSION:-}" ]] ; then
default_branch="$(git remote show origin | ${grep} 'HEAD branch' | cut -d ' ' -f 5)"
fi
# 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
# if we're _not_ testing, then _actually_ check the origin
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)"
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
# the 'pre-release version' part, but we can't use the + char if [[ "${use_api:-}" == 'true' ]] ; then
# to make it 'build metadata' as that's not supported in K8s # because we cannot use `rev-parse` with the API, we'll take a punt that 9 characters is enough for uniqueness
# labels # 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
fi # labels
##==---------------------------------------------------------------------------- ##==----------------------------------------------------------------------------
## Version increment ## Version increment

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
git fetch --quiet --force origin 'refs/tags/*:refs/tags/*' if [[ "${use_api:-}" != 'true' ]] ; then
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!