#!/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 的版本。仓库里的 只是占位,发版不用再提交一次 bump; # - 其余(main 上带 [CI] 的开发构建):vMAJOR.MINOR.(PATCH+1)-dev.-<提交前 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#[^<]*#$MOSHIRO_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