Skip to content

Commit

Permalink
fix: set prerelease for bumped versions (by default)
Browse files Browse the repository at this point in the history
If using `release`-action in such a way that bump-commit is created as
successor to release-commit, release-action cannot preserve prerelease.

Therefore, add configuration option to pass-in prerelease. Adjust
actions and workflows accordingly.
  • Loading branch information
ccwienk committed Feb 21, 2025
1 parent d22288b commit 4fe36f5
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 35 deletions.
1 change: 1 addition & 0 deletions .github/actions/release/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ runs:
read-callback: ${{ inputs.version-read-callback }}
write-callback: ${{ inputs.version-write-callback }}
version-operation: ${{ inputs.next-version }}
prerelease: 'dev'
commit-message: ${{ inputs.next-version-commit-message }}
repository-operation: commit-to-head

Expand Down
29 changes: 22 additions & 7 deletions .github/actions/version/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,11 @@ inputs:
version-operation:
required: true
type: choice
default: commit-digest-as-prerelease
default: set-prerelease
description: |
how to calculate effective version. Possible values:
- noop: keep version as-is (useful in conjunction w/ passing-in `version`)
- finalise: make version final (remove build/prerelease-suffix)
- commit-digest-as-prerelease: set commit-digest as prerelease-suffix
- timestamp-as-prerelease: set unix-epoch-timestamp as prerelease-suffix
- set-prerelease: replace / set version's prerelease (e.g. 1.2.3-${prerelease})
- bump-major: increment major-version by 1
- bump-minor: increment minor-version by 1
- bump-patch: increment patch-version by 1
Expand All @@ -69,12 +67,23 @@ inputs:
pipeline-run is based (not, e.g. the commit-digest of version-change-commit)
options:
- noop
- finalise
- commit-digest-as-prerelease
- timestamp-as-prerelease
- set-prerelease
- bump-major
- bump-minor
- bump-patch
prerelease:
required: false
type: string
default: ''
description: |
the prerelease to set. value will be interpreted as a bash-expression. The following variables
are available (for convenience):
- ${commit_digest} # output of `git rev-parse @`, i.e. current head's digest
- ${epoch} # output of `rate +%s`; unix epoch in seconds
If `noop` is set as `version-operation`, passed values are ignored.
Setting prerelease to the empty string (which is the default) will "finalise" version.
repository-operation:
required: true
type: choice
Expand Down Expand Up @@ -135,13 +144,19 @@ runs:
touch /tmp/timestamp-ref
# pass variables to prerelease-template
commit_digest=$(git rev-parse @)
epoch=$(date +%s)
prerelease="${{ inputs.prerelease }}"
"${GITHUB_ACTION_PATH}/version_cli.py" \
--versionfile="${{ inputs.versionfile }}" \
--read-callback="${{ inputs.read-callback }}" \
--write-callback="${{ inputs.write-callback }}" \
--root-dir="${PWD}" \
--version="${{ inputs.version }}" \
--operation="${{ inputs.version-operation }}" \
--prerelease="${prerelease}" \
--extra-version-outfile /tmp/effective-version \
--commit-digest="${{ github.sha }}"
Expand Down
30 changes: 12 additions & 18 deletions .github/actions/version/version_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,10 @@

class VersionOperation(enum.StrEnum):
NOOP = 'noop'
FINALISE = 'finalise'
COMMIT_DIGEST_AS_PRERELEASE = 'commit-digest-as-prerelease'
SET_PRERELEASE = 'set-prerelease'
BUMP_MAJOR = 'bump-major'
BUMP_MINOR = 'bump-minor'
BUMP_PATCH = 'bump-patch'
TIMESTAMP_AS_PRERELEASE = 'timestamp-as-prerelease'


def file_exists_or_fail(*paths):
Expand Down Expand Up @@ -104,6 +102,7 @@ def parse_args():
parser.add_argument('--root-dir', default=os.getcwd())
parser.add_argument('--version', required=False, default=None)
parser.add_argument('--operation', type=VersionOperation, default=VersionOperation.NOOP)
parser.add_argument('--prerelease', default=None)
parser.add_argument('--commit-digest', default=None)
parser.add_argument('--extra-version-outfile', default=None)

Expand Down Expand Up @@ -180,34 +179,28 @@ def check_default_files(root_dir: str):
def process_version(
version: str,
operation: VersionOperation,
prerelease: str,
commit_digest: str,
):
if operation is VersionOperation.NOOP:
return version
parsed_version = version_mod.parse_to_semver(version)
if operation is VersionOperation.FINALISE:
return str(parsed_version.finalize_version())
if operation is VersionOperation.COMMIT_DIGEST_AS_PRERELEASE:
version = parsed_version.finalize_version()
return f'{version}-{commit_digest}'
if operation is VersionOperation.TIMESTAMP_AS_PRERELEASE:
version = parsed_version.finalize_version()
ts = int(time.time())
return f'{version}-{ts}'
parsed_version.prerelease = prerelease

if operation is VersionOperation.BUMP_MAJOR:
bumped = parsed_version.bump_major()
if parsed_version.prerelease:
bumped = f'{bumped}-{parsed_version.prerelease}'
if prerelease:
bumped = f'{bumped}-{prerelease}'
return bumped
if operation is VersionOperation.BUMP_MINOR:
bumped = parsed_version.bump_minor()
if parsed_version.prerelease:
bumped = f'{bumped}-{parsed_version.prerelease}'
if prerelease:
bumped = f'{bumped}-{prerelease}'
return bumped
if operation is VersionOperation.BUMP_PATCH:
bumped = parsed_version.bump_patch()
if parsed_version.prerelease:
bumped = f'{bumped}-{parsed_version.prerelease}'
if prerelease:
bumped = f'{bumped}-{prerelease}'
return bumped

raise ValueError('unexpected version-operation', operation)
Expand Down Expand Up @@ -251,6 +244,7 @@ def main():
effective_version = process_version(
version=version,
operation=parsed.operation,
prerelease=parsed.prerelease,
commit_digest=parsed.commit_digest,
)

Expand Down
18 changes: 8 additions & 10 deletions .github/workflows/build-and-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,17 @@ on:
required: false
type: boolean
default: false
version-operation:
version-prerelease:
required: true
type: string
description: |
version-operation to pass to `version` action (cannot validate allowed values here)
the prerelease-version to set for effective version (see version-action)
reasonable values:
one of:
- noop
- finalise
- commit-digest-as-prerelease
- timestamp-as-prerelease
- bump-major
- bump-minor
- bump-patch
- '' (empty string): -> finalise version
- "${commit_digest}" -> current head-commit-digest (for head-update / pullrequest-builds)
- "${epoch}" -> unix-epoch in seconds
version-commit-message:
required: false
type: string
Expand Down Expand Up @@ -109,7 +107,7 @@ jobs:
read-callback: .ci/read-version
write-callback: .ci/write-version
commit-message: ${{ inputs.version-commit-message }}
version-operation: ${{ inputs.version-operation }}
prerelease: ${{ inputs.version-prerelease }}
repository-operation: capture-commit
- name: version-setuptools
id: version-setuptools
Expand Down

0 comments on commit 4fe36f5

Please sign in to comment.