57 lines
2.8 KiB
Bash
57 lines
2.8 KiB
Bash
#!/usr/bin/env bash
|
||
# 算出这次构建的版本号。用法:
|
||
# source ci/version.sh # 得到 MOSHIRO_VERSION(不带 v)和 MOSHIRO_TAG(带 v)
|
||
# bash ci/version.sh apply # 同上,并把 MOSHIRO_VERSION 写进工作区里的 backend/Directory.Build.props 和三个 web/*/package.json(只改工作区,不提交)
|
||
#
|
||
# 规则:
|
||
# - 打 tag 发版(CI_COMMIT_TAG 是 vMAJOR.MINOR.PATCH):版本就是 tag 的版本。仓库里的 <Version> 只是占位,发版不用再提交一次 bump;
|
||
# - 其余(main 上带 [CI] 的开发构建):vMAJOR.MINOR.(PATCH+1)-dev.<N>-<提交前 7 位>,
|
||
# 基准是最近一个 v* tag,N 是这个 tag 之后的提交数。开发版本按语义化版本排在下一个正式版之前,同一个提交算出来永远一样。
|
||
# 最近的 tag 要拿得到:CI 的克隆要带 tags(见 .woodpecker/dev-image.yml 的 clone 设置);没有任何 tag 时基准是 0.0.0。
|
||
_moshiro_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||
|
||
_moshiro_compute_version() {
|
||
local tag="${CI_COMMIT_TAG:-}"
|
||
if [[ -n "$tag" ]]; then
|
||
[[ "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?$ ]] || {
|
||
echo "release must run from a vMAJOR.MINOR.PATCH tag" >&2
|
||
return 2
|
||
}
|
||
MOSHIRO_VERSION="${tag#v}"
|
||
else
|
||
local sha="${CI_COMMIT_SHA:-$(git -C "$_moshiro_root" rev-parse HEAD)}"
|
||
local last base count major minor patch
|
||
last="$(git -C "$_moshiro_root" describe --tags --abbrev=0 --match 'v[0-9]*.[0-9]*.[0-9]*' "$sha" 2>/dev/null || true)"
|
||
if [[ -n "$last" ]]; then
|
||
base="${last#v}"
|
||
base="${base%%-*}"
|
||
count="$(git -C "$_moshiro_root" rev-list --count "$last..$sha")"
|
||
else
|
||
base="0.0.0"
|
||
count="$(git -C "$_moshiro_root" rev-list --count "$sha")"
|
||
fi
|
||
IFS=. read -r major minor patch <<< "$base"
|
||
MOSHIRO_VERSION="$major.$minor.$((patch + 1))-dev.$count-${sha:0:7}"
|
||
fi
|
||
MOSHIRO_TAG="v$MOSHIRO_VERSION"
|
||
export MOSHIRO_VERSION MOSHIRO_TAG
|
||
}
|
||
|
||
# 把算出来的版本写进工作区的 backend/Directory.Build.props(所有 .NET 项目、清单、镜像标签都从那里读版本)和三个 package.json
|
||
moshiro_apply_version() {
|
||
[[ -n "${MOSHIRO_VERSION:-}" ]] || _moshiro_compute_version
|
||
sed -i "s#<Version>[^<]*</Version>#<Version>$MOSHIRO_VERSION</Version>#" "$_moshiro_root/backend/Directory.Build.props"
|
||
# 前端在构建时从 web/package.json 读版本(web/build-info.mjs),其余两个工作区包的版本也一起对上
|
||
local manifest
|
||
for manifest in web/package.json web/display/package.json web/admin/package.json; do
|
||
sed -i -E '0,/"version": "[^"]*"/s//"version": "'"$MOSHIRO_VERSION"'"/' "$_moshiro_root/$manifest"
|
||
done
|
||
}
|
||
|
||
_moshiro_compute_version
|
||
|
||
if [[ "${BASH_SOURCE[0]}" == "$0" ]]; then
|
||
if [[ "${1:-}" == apply ]]; then moshiro_apply_version; fi
|
||
echo "$MOSHIRO_VERSION"
|
||
fi
|