das ist krank und ich kann es nicht validieren
This commit is contained in:
100
.github/actions/bump-version/action.yaml
vendored
100
.github/actions/bump-version/action.yaml
vendored
@@ -6,7 +6,7 @@ inputs:
|
|||||||
required: false
|
required: false
|
||||||
default: "24"
|
default: "24"
|
||||||
release_line:
|
release_line:
|
||||||
description: Release line for dev builds (e.g. 2.4) when it cannot be derived from the branch or PR target
|
description: Release line for dev builds (e.g. 2.4 or 2.4.1) when it cannot be derived from the branch or PR target
|
||||||
required: false
|
required: false
|
||||||
default: ""
|
default: ""
|
||||||
gitea_token:
|
gitea_token:
|
||||||
@@ -68,49 +68,103 @@ runs:
|
|||||||
node -p "require('./package.json').version"
|
node -p "require('./package.json').version"
|
||||||
}
|
}
|
||||||
|
|
||||||
validate_release_line() {
|
normalize_release_base() {
|
||||||
local line="$1"
|
local value="$1"
|
||||||
[[ "${line}" =~ ^[0-9]+\.[0-9]+$ ]]
|
if [[ "${value}" =~ ^v?([0-9]+)\.([0-9]+)$ ]]; then
|
||||||
}
|
echo "${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.0"
|
||||||
|
return 0
|
||||||
extract_release_line() {
|
fi
|
||||||
local ref_name="$1"
|
if [[ "${value}" =~ ^v?([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then
|
||||||
if [[ "${ref_name}" =~ ^release/v?([0-9]+)\.([0-9]+)$ ]]; then
|
echo "${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.${BASH_REMATCH[3]}"
|
||||||
echo "${BASH_REMATCH[1]}.${BASH_REMATCH[2]}"
|
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
resolve_release_line() {
|
extract_release_base() {
|
||||||
|
local ref_name="$1"
|
||||||
|
local normalized
|
||||||
|
if [[ "${ref_name}" =~ ^release/(.+)$ ]]; then
|
||||||
|
if normalized="$(normalize_release_base "${BASH_REMATCH[1]}")"; then
|
||||||
|
echo "${normalized}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
infer_release_base_from_ancestor_release_branch() {
|
||||||
|
local best_release_base=""
|
||||||
|
local best_commit_time=0
|
||||||
|
local remote_ref
|
||||||
|
local release_branch
|
||||||
|
local release_base
|
||||||
|
local commit_time
|
||||||
|
|
||||||
|
# Best effort: not every repository has release branches.
|
||||||
|
git fetch --no-tags origin "+refs/heads/release/*:refs/remotes/origin/release/*" >/dev/null 2>&1 || true
|
||||||
|
|
||||||
|
while IFS= read -r remote_ref; do
|
||||||
|
release_branch="${remote_ref#origin/}"
|
||||||
|
if ! release_base="$(extract_release_base "${release_branch}")"; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! git merge-base --is-ancestor "$(git rev-parse "${remote_ref}")" HEAD; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
commit_time="$(git show -s --format=%ct "${remote_ref}")"
|
||||||
|
if [[ "${commit_time}" -gt "${best_commit_time}" ]]; then
|
||||||
|
best_commit_time="${commit_time}"
|
||||||
|
best_release_base="${release_base}"
|
||||||
|
fi
|
||||||
|
done < <(git for-each-ref --format='%(refname:short)' refs/remotes/origin/release/*)
|
||||||
|
|
||||||
|
if [[ -n "${best_release_base}" ]]; then
|
||||||
|
echo "${best_release_base}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve_release_base() {
|
||||||
local package_version
|
local package_version
|
||||||
|
local normalized
|
||||||
|
local inferred_release_base
|
||||||
|
|
||||||
if [[ -n "${INPUT_RELEASE_LINE}" ]]; then
|
if [[ -n "${INPUT_RELEASE_LINE}" ]]; then
|
||||||
if ! validate_release_line "${INPUT_RELEASE_LINE}"; then
|
if ! normalized="$(normalize_release_base "${INPUT_RELEASE_LINE}")"; then
|
||||||
echo "Invalid release_line input '${INPUT_RELEASE_LINE}'. Expected format: <major>.<minor>" >&2
|
echo "Invalid release_line input '${INPUT_RELEASE_LINE}'. Expected format: <major>.<minor> or <major>.<minor>.<patch>" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "${INPUT_RELEASE_LINE}"
|
echo "${normalized}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if extract_release_line "${BRANCH}" >/dev/null; then
|
if extract_release_base "${BRANCH}" >/dev/null; then
|
||||||
extract_release_line "${BRANCH}"
|
extract_release_base "${BRANCH}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "${BASE_BRANCH}" ]] && extract_release_line "${BASE_BRANCH}" >/dev/null; then
|
if [[ -n "${BASE_BRANCH}" ]] && extract_release_base "${BASE_BRANCH}" >/dev/null; then
|
||||||
extract_release_line "${BASE_BRANCH}"
|
extract_release_base "${BASE_BRANCH}"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if inferred_release_base="$(infer_release_base_from_ancestor_release_branch)"; then
|
||||||
|
echo "${inferred_release_base}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
package_version="$(read_package_version)"
|
package_version="$(read_package_version)"
|
||||||
if [[ "${package_version}" =~ ^([0-9]+)\.([0-9]+)\.[0-9]+([-.].*)?$ ]]; then
|
if [[ "${package_version}" =~ ^([0-9]+)\.([0-9]+)\.[0-9]+([-.].*)?$ ]]; then
|
||||||
echo "${BASH_REMATCH[1]}.${BASH_REMATCH[2]}"
|
echo "${BASH_REMATCH[1]}.${BASH_REMATCH[2]}.0"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Unable to determine release line for branch '${BRANCH}'. Use release/<major>.<minor>, provide inputs.release_line, or ensure package.json contains a semantic version." >&2
|
echo "Unable to determine release base for branch '${BRANCH}'. Use release/<major>.<minor>[.<patch>], provide inputs.release_line, or ensure package.json contains a semantic version." >&2
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,13 +218,11 @@ runs:
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
release/*)
|
release/*)
|
||||||
RELEASE_LINE="$(resolve_release_line)"
|
RELEASE_BASE="$(resolve_release_base)"
|
||||||
RELEASE_BASE="${RELEASE_LINE}.0"
|
|
||||||
set_version "$(next_beta_version "${RELEASE_BASE}")"
|
set_version "$(next_beta_version "${RELEASE_BASE}")"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
RELEASE_LINE="$(resolve_release_line)"
|
RELEASE_BASE="$(resolve_release_base)"
|
||||||
RELEASE_BASE="${RELEASE_LINE}.0"
|
|
||||||
set_version "$(next_dev_version "${RELEASE_BASE}")"
|
set_version "$(next_dev_version "${RELEASE_BASE}")"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
13
README.md
13
README.md
@@ -9,20 +9,21 @@ Creates or updates the version in `package.json`, commits it, creates a matching
|
|||||||
Inputs:
|
Inputs:
|
||||||
|
|
||||||
- `node_version`: Node.js version to use. Default: `24`
|
- `node_version`: Node.js version to use. Default: `24`
|
||||||
- `release_line`: optional release line for dev builds. Format: `<major>.<minor>`. Overrides branch, PR target, and `package.json`.
|
- `release_line`: optional release line for dev builds. Format: `<major>.<minor>` or `<major>.<minor>.<patch>`. Overrides branch, PR target, inferred ancestor release branch, and `package.json`.
|
||||||
- `gitea_token`: optional token used for checkout and push
|
- `gitea_token`: optional token used for checkout and push
|
||||||
|
|
||||||
Branch and tag rules:
|
Branch and tag rules:
|
||||||
|
|
||||||
- `main`: creates release tags from the latest commit message (`release/x.y.z`, `release/x.y`, `hotfix/x.y.z`) or falls back to a patch bump.
|
- `main`: creates release tags from the latest commit message (`release/x.y.z`, `release/x.y`, `hotfix/x.y.z`) or falls back to a patch bump.
|
||||||
- `release/<major>.<minor>`: creates the next beta tag for that release line, e.g. `v2.4.0-beta.3`.
|
- `release/<major>.<minor>` or `release/<major>.<minor>.<patch>`: creates the next beta tag for that release base, e.g. `v2.4.0-beta.3` or `v2.4.1-beta.3`.
|
||||||
- all other branches: create a dev tag for the resolved release line using a UTC timestamp, e.g. `v2.4.0-dev.20260314153045`.
|
- all other branches: create a dev tag for the resolved release base using a UTC timestamp, e.g. `v2.4.0-dev.20260314153045`.
|
||||||
|
|
||||||
Dev release line resolution order:
|
Dev release line resolution order:
|
||||||
|
|
||||||
- `inputs.release_line`
|
- `inputs.release_line`
|
||||||
- current branch if it matches `release/<major>.<minor>`
|
- current branch if it matches `release/<major>.<minor>` or `release/<major>.<minor>.<patch>`
|
||||||
- PR target branch if it matches `release/<major>.<minor>`
|
- PR target branch if it matches `release/<major>.<minor>` or `release/<major>.<minor>.<patch>`
|
||||||
|
- newest ancestor branch from `origin/release/*` (for feature branches created from release branches outside PR context)
|
||||||
- `major.minor` from `package.json`
|
- `major.minor` from `package.json`
|
||||||
|
|
||||||
If no release line can be resolved for a dev build, the action fails intentionally.
|
If no release line can be resolved for a dev build, the action fails intentionally.
|
||||||
@@ -38,7 +39,9 @@ Commit message examples on `main`:
|
|||||||
Branch examples:
|
Branch examples:
|
||||||
|
|
||||||
- `release/2.4` -> next `v2.4.0-beta.N`
|
- `release/2.4` -> next `v2.4.0-beta.N`
|
||||||
|
- `release/v2.4.1` -> next `v2.4.1-beta.N`
|
||||||
- feature branch in a PR to `release/2.4` -> `v2.4.0-dev.<UTC_TIMESTAMP>`
|
- feature branch in a PR to `release/2.4` -> `v2.4.0-dev.<UTC_TIMESTAMP>`
|
||||||
|
- feature branch created from `release/v2.4.1` (without PR base) -> `v2.4.1-dev.<UTC_TIMESTAMP>` when the release branch tip is an ancestor
|
||||||
- feature branch outside a PR with `package.json` version `2.4.0` -> `v2.4.0-dev.<UTC_TIMESTAMP>`
|
- feature branch outside a PR with `package.json` version `2.4.0` -> `v2.4.0-dev.<UTC_TIMESTAMP>`
|
||||||
- feature branch outside a PR with `release_line: 2.4` -> `v2.4.0-dev.<UTC_TIMESTAMP>`
|
- feature branch outside a PR with `release_line: 2.4` -> `v2.4.0-dev.<UTC_TIMESTAMP>`
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user