app-starlock/tag_generator.sh

107 lines
4.6 KiB
Bash
Raw Normal View History

#!/bin/bash
2025-05-30 11:34:03 +08:00
# ========================
# tag_generator.sh
# 用于自动识别并递增以 _sky 结尾的 tag如 v1.5.556_sky),并生成下一个 tag。
# 递增规则feat: 提交递增 minorfix: 或其他提交递增 patch。
# ========================
# 读取环境变量(由 CI/CD 系统注入)
URL=$CI_API_V4_URL # GitLab API v4 地址
TOKEN=$GITLAB_ACCESS_TOKEN # GitLab 访问 Token
PROJECT_ID=$CI_PROJECT_ID # 当前项目 ID
next_tag="" # 新的 tag 变量
newest_tag="" # 最新 tag 变量
echo "PRIVATE-TOKEN: $TOKEN $URL/projects/$PROJECT_ID/repository/tags"
2025-05-30 11:34:03 +08:00
# 获取项目所有 tag 的 json 列表
# 需要 jq 工具解析 json
# tags_json 是所有 tag 的原始 json 数据
tags_json=$(curl -H "Content-Type: application/json" -H "PRIVATE-TOKEN: $TOKEN" "$URL/projects/$PROJECT_ID/repository/tags")
2025-05-30 11:34:03 +08:00
# 提取所有 tag 名称,按时间倒序排列(最新的在前)
tags=$(echo "$tags_json" | jq -r '.[].name')
2025-05-30 11:34:03 +08:00
# 只保留以 _sky 结尾的 tag即只处理 v1.2.3_sky 这种格式的 tag
sky_tags=$(echo "$tags" | grep '_sky$')
# 取最新的 _sky tag即第一个
newest_sky_tag=$(echo "$sky_tags" | head -n 1)
# 如果没有 _sky 结尾的 tag则从最新的 tag 提取版本号,生成 vX.Y.Z_sky
if [ -z "$newest_sky_tag" ]; then
# 取最新的 tag不管是否带_sky
latest_tag=$(echo "$tags" | head -n 1)
if [ -n "$latest_tag" ]; then
# 提取版本号部分去掉前缀v和后缀_sky等
version_part=${latest_tag#v} # 去掉v
version_part=${version_part%_sky} # 去掉_sky如果有
IFS='.' read -r major minor patch <<< "$version_part"
next_tag="v$major.$minor.$patch_sky"
else
next_tag="v1.0.0_sky"
fi
else
2025-05-30 11:34:03 +08:00
# 解析版本号部分(去掉 _sky 后缀和 v 前缀)
# 例如 v1.5.556_sky -> 1.5.556
version_part=${newest_sky_tag%_sky} # 去掉 _sky 后缀
version_part=${version_part#v} # 去掉 v 前缀
IFS='.' read -r major minor patch <<< "$version_part" # 拆分出主、次、修订号
compare_json="" # 用于存储 commit 对比结果
# 判断命令参数,决定对比范围
if [[ "$1" == "generate_tag" ]];then
2025-05-30 11:34:03 +08:00
# 生成 tag 时,对比最新 _sky tag 和 master 之间的提交
echo "generate_tag:$newest_sky_tag-to-master\n"
compare_json=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$URL/projects/$PROJECT_ID/repository/compare?from=$newest_sky_tag&to=master")
elif [[ "$1" == "generate_version" ]]; then
2025-05-30 11:34:03 +08:00
# 生成版本号时,对比 master 和当前分支之间的提交
echo "generate_version:master-to-$CI_COMMIT_BRANCH\n"
2025-05-17 16:32:39 +08:00
compare_json=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$URL/projects/$PROJECT_ID/repository/compare?from=master&to=$CI_COMMIT_BRANCH")
fi
echo "compare_json:$compare_json\n"
2025-05-30 11:34:03 +08:00
new_patch=$patch # 新的 patch 号
new_minor=$minor # 新的 minor 号
# 遍历所有 commit根据提交信息递增版本号
while IFS= read -r commit_json; do
2025-05-30 11:34:03 +08:00
# 解析每个 commit 的 id 和 message
commit_id=$(echo "$commit_json" | jq -r '.id')
commit_message=$(echo "$commit_json" | jq -r '.message')
echo "----$commit_message"
2025-05-30 11:34:03 +08:00
# 如果有 feat: 类型提交minor 递增(只递增一次)
2025-02-18 10:29:23 +08:00
if [[ "$commit_message" =~ ("feat:"*) ]] && [[ $new_minor == $minor ]]; then
((new_minor++))
2025-05-30 11:34:03 +08:00
# 如果有 fix: 类型提交patch 递增
2025-02-18 10:29:23 +08:00
elif [[ "$commit_message" =~ ("fix:"*) ]]; then
((new_patch++))
2025-05-30 11:34:03 +08:00
# 其他类型提交(非 Merge/Revertpatch 递增
2025-02-18 10:29:23 +08:00
elif [[ ! "$commit_message" =~ ("Merge"* | "Revert"*) ]]; then
((new_patch++))
fi
done < <(echo "$compare_json" | jq -c '.commits[] | {id: .id, message: .message}')
2025-05-30 11:34:03 +08:00
# 组装新的 tag格式为 v<major>.<minor>.<patch>_sky
next_tag="v$major.$new_minor.$new_patch_sky"
fi
2025-05-30 11:34:03 +08:00
echo "New Tag:$newest_sky_tag;New version: $next_tag;command: $1"
# 如果是 generate_tag 命令,且新 tag 和最新 tag 一致,则跳过生成
if [[ "$1" == "generate_tag" ]];then
2025-05-30 11:34:03 +08:00
if [ "$next_tag" == "$newest_sky_tag" ]; then
echo "no change from master,skip to generate tag"
exit 0
fi
2025-05-30 11:34:03 +08:00
# 配置 git 用户名(可根据需要补充邮箱等)
git config user.name
2025-05-30 11:34:03 +08:00
# 创建并推送新 tag
git tag $next_tag
git push -u origin $next_tag
echo "generate tag: $next_tag"
elif [[ "$1" == "generate_version" ]]; then
2025-05-30 11:34:03 +08:00
# 如果是 generate_version 命令,仅导出新版本号到环境变量
export NEXT_VERSION="$next_tag"
echo "generate version: $NEXT_VERSION"
fi
2025-05-30 11:34:03 +08:00
# 无论哪种情况,都把新 tag 写入 app_new.version 文件
# 供后续流程使用
echo "$next_tag" > app_new.version