2024-10-14 22:51:58 +08:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
2025-05-30 11:34:03 +08:00
|
|
|
|
# ========================
|
|
|
|
|
|
# tag_generator.sh
|
|
|
|
|
|
# 用于自动识别并递增以 _sky 结尾的 tag(如 v1.5.556_sky),并生成下一个 tag。
|
|
|
|
|
|
# 递增规则:feat: 提交递增 minor,fix: 或其他提交递增 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 变量
|
|
|
|
|
|
|
2024-10-14 22:51:58 +08:00
|
|
|
|
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 数据
|
2024-10-14 22:51:58 +08:00
|
|
|
|
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 名称,按时间倒序排列(最新的在前)
|
2024-10-14 22:51:58 +08:00
|
|
|
|
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
|
|
|
|
|
|
latest_tag=$(echo "$tags" | head -n 1)
|
2025-05-30 14:36:08 +08:00
|
|
|
|
echo "DEBUG: tags=[$tags]"
|
|
|
|
|
|
echo "DEBUG: latest_tag=[$latest_tag]"
|
2025-05-30 11:34:03 +08:00
|
|
|
|
if [ -n "$latest_tag" ]; then
|
2025-05-30 14:44:46 +08:00
|
|
|
|
version_part=${latest_tag#v}
|
|
|
|
|
|
version_part=${version_part%_sky}
|
2025-05-30 14:36:08 +08:00
|
|
|
|
version_part=$(echo "$version_part" | tr -d ' \n\r')
|
|
|
|
|
|
echo "DEBUG: version_part=[$version_part]"
|
2025-05-30 14:44:46 +08:00
|
|
|
|
major=$(echo "$version_part" | awk -F. '{print $1}')
|
|
|
|
|
|
minor=$(echo "$version_part" | awk -F. '{print $2}')
|
|
|
|
|
|
patch=$(echo "$version_part" | awk -F. '{print $3}')
|
|
|
|
|
|
[ -z "$major" ] && major=1
|
|
|
|
|
|
[ -z "$minor" ] && minor=0
|
|
|
|
|
|
[ -z "$patch" ] && patch=0
|
|
|
|
|
|
next_tag="v${major}.${minor}.${patch}_sky"
|
2025-05-30 11:34:03 +08:00
|
|
|
|
else
|
|
|
|
|
|
next_tag="v1.0.0_sky"
|
|
|
|
|
|
fi
|
2024-10-14 22:51:58 +08:00
|
|
|
|
else
|
2025-05-30 11:34:03 +08:00
|
|
|
|
# 解析版本号部分(去掉 _sky 后缀和 v 前缀)
|
2025-05-30 14:44:46 +08:00
|
|
|
|
version_part=${newest_sky_tag%_sky}
|
|
|
|
|
|
version_part=${version_part#v}
|
2025-05-30 14:36:08 +08:00
|
|
|
|
version_part=$(echo "$version_part" | tr -d ' \n\r')
|
|
|
|
|
|
echo "DEBUG: version_part=[$version_part]"
|
2025-05-30 14:44:46 +08:00
|
|
|
|
major=$(echo "$version_part" | awk -F. '{print $1}')
|
|
|
|
|
|
minor=$(echo "$version_part" | awk -F. '{print $2}')
|
|
|
|
|
|
patch=$(echo "$version_part" | awk -F. '{print $3}')
|
|
|
|
|
|
[ -z "$major" ] && major=1
|
|
|
|
|
|
[ -z "$minor" ] && minor=0
|
|
|
|
|
|
[ -z "$patch" ] && patch=0
|
|
|
|
|
|
compare_json=""
|
2024-10-19 13:31:43 +08:00
|
|
|
|
if [[ "$1" == "generate_tag" ]];then
|
2025-05-30 18:22:10 +08:00
|
|
|
|
echo "generate_tag:$newest_sky_tag-to-master_sky\n"
|
|
|
|
|
|
compare_json=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$URL/projects/$PROJECT_ID/repository/compare?from=$newest_sky_tag&to=master_sky")
|
2024-10-19 13:31:43 +08:00
|
|
|
|
elif [[ "$1" == "generate_version" ]]; then
|
2025-05-30 18:22:10 +08:00
|
|
|
|
echo "generate_version:master_sky-to-$CI_COMMIT_BRANCH\n"
|
|
|
|
|
|
compare_json=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$URL/projects/$PROJECT_ID/repository/compare?from=master_sky&to=$CI_COMMIT_BRANCH")
|
2024-10-19 13:31:43 +08:00
|
|
|
|
fi
|
2024-10-14 22:51:58 +08:00
|
|
|
|
echo "compare_json:$compare_json\n"
|
2025-05-30 14:44:46 +08:00
|
|
|
|
new_patch=$patch
|
|
|
|
|
|
new_minor=$minor
|
2025-06-03 09:53:21 +08:00
|
|
|
|
seen_commits="" # 用于去重
|
2024-10-14 22:51:58 +08:00
|
|
|
|
while IFS= read -r commit_json; do
|
|
|
|
|
|
commit_id=$(echo "$commit_json" | jq -r '.id')
|
2025-06-03 09:36:51 +08:00
|
|
|
|
commit_title=$(echo "$commit_json" | jq -r '.title')
|
2024-10-14 22:51:58 +08:00
|
|
|
|
commit_message=$(echo "$commit_json" | jq -r '.message')
|
2025-06-03 09:36:51 +08:00
|
|
|
|
|
2025-06-03 09:53:21 +08:00
|
|
|
|
# commit id 去重(兼容所有 shell)
|
|
|
|
|
|
if echo "$seen_commits" | grep -q "$commit_id"; then
|
2025-06-03 09:36:51 +08:00
|
|
|
|
continue
|
|
|
|
|
|
fi
|
2025-06-03 09:53:21 +08:00
|
|
|
|
seen_commits="$seen_commits $commit_id"
|
2025-06-03 09:36:51 +08:00
|
|
|
|
|
|
|
|
|
|
# 跳过 Merge 和 Revert 提交
|
|
|
|
|
|
if [[ "$commit_title" =~ ^Merge ]] || [[ "$commit_title" =~ ^Revert ]]; then
|
|
|
|
|
|
continue
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2024-10-14 22:51:58 +08:00
|
|
|
|
echo "----$commit_message"
|
2025-06-03 09:36:51 +08:00
|
|
|
|
if [[ "$commit_message" =~ ^feat: ]] && [[ $new_minor == $minor ]]; then
|
2025-02-18 10:29:23 +08:00
|
|
|
|
((new_minor++))
|
2025-06-03 09:36:51 +08:00
|
|
|
|
elif [[ "$commit_message" =~ ^fix: ]]; then
|
2024-10-22 09:53:12 +08:00
|
|
|
|
((new_patch++))
|
2024-10-14 22:51:58 +08:00
|
|
|
|
fi
|
2025-06-03 09:36:51 +08:00
|
|
|
|
done < <(echo "$compare_json" | jq -c '.commits[] | {id: .id, title: .title, message: .message}')
|
2025-05-30 14:44:46 +08:00
|
|
|
|
next_tag="v${major}.${new_minor}.${new_patch}_sky"
|
2024-10-19 13:31:43 +08:00
|
|
|
|
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 一致,则跳过生成
|
2024-10-19 13:31:43 +08:00
|
|
|
|
if [[ "$1" == "generate_tag" ]];then
|
2025-05-30 11:34:03 +08:00
|
|
|
|
if [ "$next_tag" == "$newest_sky_tag" ]; then
|
2024-10-14 22:51:58 +08:00
|
|
|
|
echo "no change from master,skip to generate tag"
|
|
|
|
|
|
exit 0
|
|
|
|
|
|
fi
|
2025-05-30 11:34:03 +08:00
|
|
|
|
# 配置 git 用户名(可根据需要补充邮箱等)
|
2024-10-19 13:31:43 +08:00
|
|
|
|
git config user.name
|
2025-05-30 11:34:03 +08:00
|
|
|
|
# 创建并推送新 tag
|
2024-10-19 13:31:43 +08:00
|
|
|
|
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 命令,仅导出新版本号到环境变量
|
2024-10-19 13:31:43 +08:00
|
|
|
|
export NEXT_VERSION="$next_tag"
|
|
|
|
|
|
echo "generate version: $NEXT_VERSION"
|
2024-10-14 22:51:58 +08:00
|
|
|
|
fi
|
2025-05-30 11:34:03 +08:00
|
|
|
|
# 无论哪种情况,都把新 tag 写入 app_new.version 文件
|
|
|
|
|
|
# 供后续流程使用
|
|
|
|
|
|
|
2024-10-19 13:31:43 +08:00
|
|
|
|
echo "$next_tag" > app_new.version
|
|
|
|
|
|
|