11 Commits

Author SHA1 Message Date
Phil Jay
28d33de033 Merge pull request #51 from reecetech/update-README
Document release workflow and refresh action examples
2026-08-10 16:26:47 +10:00
Phil Jay
1f38adcc34 Rework example to show tagging at the end
Closes #42
2026-08-10 16:21:09 +10:00
Phil Jay
72771d55b6 Update versions in README
Closes #50
2026-08-10 16:21:01 +10:00
Phil Jay
4ccdd6072c Generate release notes automatically 2026-08-10 16:09:55 +10:00
Phil Jay
79c9fd45a4 Merge pull request #49 from reecetech/fix-up-prefix-parsing
Treat tag prefixes as literal strings
2026-08-10 15:44:15 +10:00
Phil Jay
1b05caeb4c Treat tag prefixes as literal strings
Prevent regex metacharacters and sed delimiters in a tag prefix
from selecting unintended tags or causing lookup failures.
2026-08-10 15:22:02 +10:00
Phil Jay
f275de0d59 Expose parsing errors 2026-08-10 15:11:56 +10:00
Phil Jay
5f59cf0be0 Merge pull request #47 from reecetech/api-conventional-conflict
Support conventional commits in API mode
2026-08-10 12:46:12 +10:00
Phil Jay
26724048ca Add API call for git log 2026-08-10 12:38:33 +10:00
Phil Jay
69ceeacf75 Add integration test for API + CC error 2026-08-10 12:27:44 +10:00
Phil Jay
284d1792e3 Add test to expose issue 2026-08-10 12:19:47 +10:00
6 changed files with 120 additions and 19 deletions

View File

@@ -67,6 +67,18 @@ jobs:
shell: bash
run: '[[ "$(date +%Y.%-m)" == "$(echo "${{ steps.version-increment.outputs.VERSION }}" | cut -d "." -f 1-2)" ]]'
- name: Test conventional commit increment version (with API)
id: version-increment-conventional
run: ./version-increment.sh
env:
current_version: 1.2.3
scheme: conventional_commits
use_api: 'true'
- name: Check conventional commit increment result
shell: bash
run: '[[ -n "${{ steps.version-increment-conventional.outputs.VERSION }}" ]]'
test-action-yml: # integration testing
needs:
- lint
@@ -154,3 +166,4 @@ jobs:
draft: false
prerelease: false
tag_name: "${{ steps.version.outputs.version }}"
generate_release_notes: true

View File

@@ -1,5 +1,11 @@
# Version Increment
This action calculates the next version based on existing Git tags.
Intentionally, this action does not create tags. It's suggested to use an
action dedicated to creating tags in a step following the successful steps
that make up your test, build and releasing process. See the example below.
## Use 📄
> [!NOTE]
@@ -9,22 +15,42 @@
### Example ⌨️
```yaml
name: Build and release
on:
push:
branches:
- main
jobs:
build-release:
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v7
- name: Get next version
uses: reecetech/version-increment@2024.10.1
uses: reecetech/version-increment@2026.8.4
id: version
with:
scheme: semver
increment: patch
# Example building, using the `version` output from `version-increment`
- name: Build image
uses: docker/build-push-action@v2
uses: docker/build-push-action@v7
with:
push: false
tags: "example/application:${{ steps.version.outputs.version }}"
context: .
- name: Create tag & GitHub release
uses: softprops/action-gh-release@v3
with:
draft: false
generate_release_notes: true
prerelease: false
tag_name: ${{ steps.version.outputs.version }}
```
#### API mode 🔗
@@ -34,7 +60,7 @@ use the API mode:
```yaml
- name: Get next version
uses: reecetech/version-increment@2024.10.1
uses: reecetech/version-increment@2026.8.4
id: version
with:
use_api: true
@@ -106,7 +132,7 @@ release branch name as an input. For example:
```yaml
- name: Get next version
uses: reecetech/version-increment@2023.10.1
uses: reecetech/version-increment@2026.8.4
id: version
with:
release_branch: publish

View File

@@ -20,19 +20,13 @@ pcre_old_calver='^(?P<major>0|[1-9]\d*)-0{0,1}(?P<minor>0|[0-9]\d*)-R(?P<patch>0
remove_prefix() {
local tag="$1"
if [[ -n "${tag_prefix:-}" ]]; then
# Escape special characters in tag_prefix
local escaped_prefix
escaped_prefix=$(printf '%s\n' "$tag_prefix" | sed 's/[][\/.^$*]/\\&/g') # special chars matched by sed: ] [ / . ^ $ *
# shellcheck disable=SC2143
if [[ -z "$(echo "${tag}" | grep "^${tag_prefix}")" ]] ; then
echo ""
return
fi
# shellcheck disable=SC2001
echo "${tag}" | sed "s|^${escaped_prefix}||" # Use | as the delimiter to avoid conflicts with /
if [[ "${tag}" == "${tag_prefix}"* ]]; then
printf '%s\n' "${tag:${#tag_prefix}}"
else
echo "${tag}"
printf '\n'
fi
else
printf '%s\n' "${tag}"
fi
}

View File

@@ -282,6 +282,34 @@ function init_repo {
[[ "$output" = *"VERSION=$(date +%Y.%-m.1)+pre.${short_ref}"* ]]
}
@test "uses the API commit message for conventional commits without a checkout" {
local no_checkout_dir="${BATS_TEST_TMPDIR}/no-checkout"
local mock_bin="${BATS_TEST_TMPDIR}/bin"
mkdir -p "${no_checkout_dir}" "${mock_bin}"
printf '%s\n' \
'#!/usr/bin/env bash' \
'printf "%s\n" "{\"commit\":{\"message\":\"feat: API-only change\"}}"' \
> "${mock_bin}/curl"
chmod +x "${mock_bin}/curl"
export PATH="${mock_bin}:${PATH}"
export current_version=1.2.3
export scheme="conventional_commits"
export use_api="true"
export github_token="test-token"
export GITHUB_REF="refs/heads/main"
export GITHUB_SHA="abcdef1234567890"
export GITHUB_API_URL="https://fake.github.example.com"
export GITHUB_REPOSITORY="gh-org/example"
run bash -c 'cd "$1" && version-increment.sh' -- "${no_checkout_dir}"
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"VERSION=1.3.0"* ]]
}
@test "increments the patch version after a fix commit (conventional commits)" {
init_repo

View File

@@ -103,6 +103,35 @@ function init_repo {
[[ "$output" = *"CURRENT_V_VERSION=v0.1.2"* ]]
}
@test "treats tag_prefix as a literal string" {
init_repo
export tag_prefix="v."
git tag v.1.2.3
git tag v1.9.9
run version-lookup.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"CURRENT_VERSION=1.2.3"* ]]
}
@test "supports a tag_prefix containing a sed delimiter" {
init_repo
export tag_prefix="foo|bar@"
git tag "foo|bar@1.2.3"
run version-lookup.sh
print_run_info
[ "$status" -eq 0 ] &&
[[ "$output" = *"CURRENT_VERSION=1.2.3"* ]]
}
@test "finds the current normal version even if there's a newer pre-release version" {
init_repo

View File

@@ -63,7 +63,18 @@ fi
## Conventional commits
if [[ "${scheme}" == 'conventional_commits' ]] ; then
# Get message from given commit
commit_message=$(git log -1 --pretty=format:%B "${git_commit_sha}")
if [[ "${use_api:-}" == 'true' ]] ; then
commit_message="$(
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}/commits/${git_commit_sha}" \
| jq -r '.commit.message'
)"
else
commit_message="$(git log -1 --pretty=format:%B "${git_commit_sha}")"
fi
# Check commit message header
found_match='false'