23 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
Phil Jay
9e616d7ba5 Merge pull request #46 from reecetech/permissions
Add permission to write for tag/release
2026-08-10 07:49:04 +10:00
Phil Jay
cfe1cec8c0 Add permission to write for tag/release 2026-08-10 07:42:06 +10:00
Phil Jay
ca9517f82b Merge pull request #44 from reecetech/update-workflow-deps
Update workflow deps (checkout, bats-action, action-gh-release), and update BATS to v1.14.0
2026-08-07 15:34:34 +10:00
Phil Jay
d503d08693 Update to latest BATS version 2026-08-07 15:19:26 +10:00
Phil Jay
a096ae3fb1 Update to latest versions of actions 2026-08-07 15:19:16 +10:00
Phil Jay
a29aa752dc Merge pull request #41 from reecetech/fixup
Fix: wrong version variable
2024-10-14 06:23:01 +11:00
Phil Jay
f1dfe8f5a1 Update README for new version 2024-10-11 16:20:18 +11:00
Phil Jay
feaac9b904 Fix: wrong version variable 2024-10-11 16:19:40 +11:00
Phil Jay
36b965a12f Merge pull request #40 from reecetech/workflow-tweek
Update test-and-release.yml
2024-10-11 15:50:11 +11:00
Phil Jay
9a52af87bc Update test-and-release.yml
Use `v2` of `action-gh-release`

Use action directly instead of using the scripts to provide a more direct example of use
2024-10-10 18:26:44 +11:00
George Kolecsanyi
a5d65984a6 Merge pull request #38 from reecetech/fix-when-no-prefix
set prefix tag default to empty string
2024-09-03 12:30:23 +10:00
George Kolecsanyi
39ac246d0c set prefix tag default to empty string 2024-09-03 12:22:17 +10:00
7 changed files with 138 additions and 40 deletions

View File

@@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Run ShellCheck - name: Run ShellCheck
uses: ludeeus/action-shellcheck@2.0.0 uses: ludeeus/action-shellcheck@2.0.0
@@ -24,12 +24,12 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Setup bats - name: Setup bats
uses: bats-core/bats-action@2.0.0 uses: bats-core/bats-action@4.0.0
with: with:
bats-version: 1.11.0 bats-version: 1.14.0
- name: Test - name: Test
run: bats tests/*.bats run: bats tests/*.bats
@@ -40,7 +40,7 @@ jobs:
github_token: ${{ github.token }} github_token: ${{ github.token }}
steps: steps:
- name: Checkout code # have to checkout to have the source code available - name: Checkout code # have to checkout to have the source code available
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Remove .git directory # remove the git directory to make the testing valid - name: Remove .git directory # remove the git directory to make the testing valid
run: rm -rf .git/ run: rm -rf .git/
@@ -67,6 +67,18 @@ jobs:
shell: bash shell: bash
run: '[[ "$(date +%Y.%-m)" == "$(echo "${{ steps.version-increment.outputs.VERSION }}" | cut -d "." -f 1-2)" ]]' 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 test-action-yml: # integration testing
needs: needs:
- lint - lint
@@ -82,7 +94,7 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
steps: steps:
- name: Checkout code # have to checkout to have the source code available - name: Checkout code # have to checkout to have the source code available
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Remove .git directory # remove the git directory to make the testing valid - name: Remove .git directory # remove the git directory to make the testing valid
shell: bash shell: bash
@@ -96,7 +108,7 @@ jobs:
use_api: true use_api: true
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Get next version via Git - name: Get next version via Git
uses: ./ uses: ./
@@ -132,28 +144,26 @@ jobs:
[[ "${{ steps.version-prefix.outputs.prefixed-version }}" = "foo/bar@0.0.1"* ]] [[ "${{ steps.version-prefix.outputs.prefixed-version }}" = "foo/bar@0.0.1"* ]]
release: release:
permissions:
contents: write
needs: needs:
- test-action-yml - test-action-yml
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Lookup version - name: Get next version
id: version-lookup uses: ./
run: ./version-lookup.sh id: version
with:
- name: Increment version scheme: 'calver'
id: version-increment
run: ./version-increment.sh
env:
current_version: ${{ steps.version-lookup.outputs.CURRENT_VERSION }}
scheme: calver
- name: Release version - name: Release version
uses: softprops/action-gh-release@v1 uses: softprops/action-gh-release@v3
if: ${{ github.ref_name == github.event.repository.default_branch }} if: ${{ github.ref_name == github.event.repository.default_branch }}
with: with:
draft: false draft: false
prerelease: false prerelease: false
tag_name: "${{ steps.version-increment.outputs.VERSION }}" tag_name: "${{ steps.version.outputs.version }}"
generate_release_notes: true

View File

@@ -1,5 +1,11 @@
# Version Increment # 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 📄 ## Use 📄
> [!NOTE] > [!NOTE]
@@ -9,22 +15,42 @@
### Example ⌨️ ### Example ⌨️
```yaml ```yaml
name: Build and release
on:
push:
branches:
- main
jobs:
build-release:
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v4 uses: actions/checkout@v7
- name: Get next version - name: Get next version
uses: reecetech/version-increment@2024.4.3 uses: reecetech/version-increment@2026.8.4
id: version id: version
with: with:
scheme: semver scheme: semver
increment: patch increment: patch
# Example building, using the `version` output from `version-increment`
- name: Build image - name: Build image
uses: docker/build-push-action@v2 uses: docker/build-push-action@v7
with: with:
push: false
tags: "example/application:${{ steps.version.outputs.version }}" 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 🔗 #### API mode 🔗
@@ -34,7 +60,7 @@ use the API mode:
```yaml ```yaml
- name: Get next version - name: Get next version
uses: reecetech/version-increment@2024.4.3 uses: reecetech/version-increment@2026.8.4
id: version id: version
with: with:
use_api: true use_api: true
@@ -106,7 +132,7 @@ release branch name as an input. For example:
```yaml ```yaml
- name: Get next version - name: Get next version
uses: reecetech/version-increment@2023.10.1 uses: reecetech/version-increment@2026.8.4
id: version id: version
with: with:
release_branch: publish release_branch: publish

View File

@@ -44,7 +44,7 @@ inputs:
description: | description: |
Prefix the tag with a string (defaults to empty string). e.g. if set to `@org/product/` the action will filter by this prefix and return `@org/product/1.2.3` in `prefixed-version` output Prefix the tag with a string (defaults to empty string). e.g. if set to `@org/product/` the action will filter by this prefix and return `@org/product/1.2.3` in `prefixed-version` output
required: false required: false
default: false default: ''
outputs: outputs:
current-version: current-version:

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() { remove_prefix() {
local tag="$1" local tag="$1"
if [[ -n "${tag_prefix:-}" ]]; then if [[ -n "${tag_prefix:-}" ]]; then
# Escape special characters in tag_prefix if [[ "${tag}" == "${tag_prefix}"* ]]; then
local escaped_prefix printf '%s\n' "${tag:${#tag_prefix}}"
escaped_prefix=$(printf '%s\n' "$tag_prefix" | sed 's/[][\/.^$*]/\\&/g') # special chars matched by sed: ] [ / . ^ $ * else
printf '\n'
# shellcheck disable=SC2143
if [[ -z "$(echo "${tag}" | grep "^${tag_prefix}")" ]] ; then
echo ""
return
fi fi
# shellcheck disable=SC2001
echo "${tag}" | sed "s|^${escaped_prefix}||" # Use | as the delimiter to avoid conflicts with /
else else
echo "${tag}" printf '%s\n' "${tag}"
fi fi
} }

View File

@@ -282,6 +282,34 @@ function init_repo {
[[ "$output" = *"VERSION=$(date +%Y.%-m.1)+pre.${short_ref}"* ]] [[ "$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)" { @test "increments the patch version after a fix commit (conventional commits)" {
init_repo init_repo

View File

@@ -103,6 +103,35 @@ function init_repo {
[[ "$output" = *"CURRENT_V_VERSION=v0.1.2"* ]] [[ "$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" { @test "finds the current normal version even if there's a newer pre-release version" {
init_repo init_repo

View File

@@ -63,7 +63,18 @@ fi
## Conventional commits ## Conventional commits
if [[ "${scheme}" == 'conventional_commits' ]] ; then if [[ "${scheme}" == 'conventional_commits' ]] ; then
# Get message from given commit # 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 # Check commit message header
found_match='false' found_match='false'