diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a584feb6..960da81d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,10 +16,10 @@ variables: - macos - flutter rules: - - if: $CI_COMMIT_BRANCH == "develop" - - if: $CI_COMMIT_BRANCH == "release" + - if: $CI_COMMIT_BRANCH == "develop_sky" + - if: $CI_COMMIT_BRANCH == "release_sky" - if: $CI_COMMIT_BRANCH =~ /feat_[a-zA-Z]+/ - - if: $CI_COMMIT_BRANCH == "canary_release" + - if: $CI_COMMIT_BRANCH == "canary_release_sky" - if: $CI_COMMIT_TAG =~ /^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z]+\.[0-9]+)?$/ .notify_rule: @@ -27,8 +27,8 @@ variables: - macos - flutter rules: - - if: $CI_COMMIT_BRANCH == "develop" - - if: $CI_COMMIT_BRANCH == "release" + - if: $CI_COMMIT_BRANCH == "develop_sky" + - if: $CI_COMMIT_BRANCH == "release_sky" - if: $CI_COMMIT_BRANCH =~ /feat_[a-zA-Z]+/ .generate_tag_rule: @@ -36,16 +36,16 @@ variables: - macos - flutter rules: - - if: $CI_COMMIT_BRANCH == "master" + - if: $CI_COMMIT_BRANCH == "master_sky" .generate_next_version_rule: tags: - macos - flutter rules: - - if: $CI_COMMIT_BRANCH == "develop" - - if: $CI_COMMIT_BRANCH == "release" - - if: $CI_COMMIT_BRANCH == "canary_release" + - if: $CI_COMMIT_BRANCH == "develop_sky" + - if: $CI_COMMIT_BRANCH == "release_sky" + - if: $CI_COMMIT_BRANCH == "canary_release_sky" - if: $CI_COMMIT_BRANCH =~ /feat_[a-zA-Z]+/ .print_env: diff --git a/android/build.sh b/android/build.sh index 4b598959..40a15413 100755 --- a/android/build.sh +++ b/android/build.sh @@ -8,8 +8,9 @@ export ENV_BUILD_WORKSPACE=${CI_PROJECT_DIR} echo "GITLAB_WORKSPACE: ${CI_PROJECT_DIR}" cd ${CI_PROJECT_DIR}/android echo "ENV_BUILD_TAG:${ENV_BUILD_TAG},ENV_BUILD_BRANCH:${ENV_BUILD_BRANCH}" -regex='^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z]+\.[0-9]+)?$' -if [[ "${ENV_BUILD_BRANCH}" == "canary_release" ]]; then +# 只支持 v1.2.3_sky 这种tag格式 +regex='^v[0-9]+\.[0-9]+\.[0-9]+_sky$' +if [[ "${ENV_BUILD_BRANCH}" == "canary_release_sky" ]]; then echo "===build canary_release: ${NEXT_VERSION}" export ENV_BUILD_TAG=${NEXT_VERSION} bundle exec fastlane release_apk flavor:xhj --verbose @@ -20,11 +21,11 @@ elif [[ $ENV_BUILD_TAG =~ $regex ]]; then bundle exec fastlane release_apk flavor:sky --verbose bundle exec fastlane release_bundle flavor:xhj_bundle --verbose bundle exec fastlane release_bundle flavor:sky --verbose -elif [[ "${ENV_BUILD_BRANCH}" == "develop" ]]; then +elif [[ "${ENV_BUILD_BRANCH}" == "develop_sky" ]]; then echo "===build dev===${NEXT_VERSION}" bundle exec fastlane beta flavor:xhj env:dev --verbose bundle exec fastlane beta flavor:sky env:dev --verbose -elif [[ "${ENV_BUILD_BRANCH}" == "release" ]] || [[ "${ENV_BUILD_BRANCH}" == "feat_devops" ]] ; then +elif [[ "${ENV_BUILD_BRANCH}" == "release_sky" || "${ENV_BUILD_BRANCH}" == "feat_devops_sky" ]] ; then echo "===build pre===${NEXT_VERSION}" bundle exec fastlane beta flavor:xhj env:pre --verbose bundle exec fastlane beta flavor:sky env:pre --verbose diff --git a/ios/build.sh b/ios/build.sh index a8a977bf..2c46b1f1 100755 --- a/ios/build.sh +++ b/ios/build.sh @@ -9,8 +9,9 @@ echo "GITLAB_WORKSPACE: ${CI_PROJECT_DIR}" cd ${CI_PROJECT_DIR}/ios #bundle exec pod install echo "ENV_BUILD_TAG:${ENV_BUILD_TAG},ENV_BUILD_BRANCH:${ENV_BUILD_BRANCH}" -regex='^v[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z]+\.[0-9]+)?$' -if [[ "${ENV_BUILD_BRANCH}" == "canary_release" ]]; then +# 只支持 v1.2.3_sky 这种tag格式 +regex='^v[0-9]+\.[0-9]+\.[0-9]+_sky$' +if [[ "${ENV_BUILD_BRANCH}" == "canary_release_sky" ]]; then echo "===build canary_release: ${NEXT_VERSION}" export ENV_BUILD_TAG=${NEXT_VERSION} bundle exec fastlane release_ipa flavor:xhj --verbose @@ -19,11 +20,11 @@ elif [[ $ENV_BUILD_TAG =~ $regex ]]; then echo "===build release===$ENV_BUILD_TAG" bundle exec fastlane release_ipa flavor:xhj --verbose bundle exec fastlane release_ipa flavor:sky --verbose -elif [[ "${ENV_BUILD_BRANCH}" == "develop" ]]; then +elif [[ "${ENV_BUILD_BRANCH}" == "develop_sky" ]]; then echo "===build dev===${NEXT_VERSION}" bundle exec fastlane beta flavor:xhj env:Dev --verbose bundle exec fastlane beta flavor:sky env:Dev --verbose -elif [[ "${ENV_BUILD_BRANCH}" == "release" ]] || [[ "${ENV_BUILD_BRANCH}" == "feat_devops" ]] ; then +elif [[ "${ENV_BUILD_BRANCH}" == "release_sky" || "${ENV_BUILD_BRANCH}" == "feat_devops_sky" ]] ; then echo "===build pre===${NEXT_VERSION}" bundle exec fastlane beta flavor:xhj env:Pre --verbose bundle exec fastlane beta flavor:sky env:Pre --verbose diff --git a/notify.sh b/notify.sh index b881f57f..0a5ecf90 100755 --- a/notify.sh +++ b/notify.sh @@ -2,13 +2,13 @@ set -e APP_PRODUCT_NAME=$APP_PRODUCT_NAME BUILD_STATUS=$1 -if [[ "${CI_COMMIT_BRANCH}" == "release" ]] ; then +if [[ "${CI_COMMIT_BRANCH}" == "release_sky" ]] ; then WECAHT_WEBHOOK_URL=$PRE_QYWECAHT_WEBHOOK_URL SKY_IOS_DOWNLOAD_URL=$PRE_SKY_IOS_DOWNLOAD_URL SKY_ANDROID_DOWNLOAD_URL=$PRE_SKY_ANDROID_DOWNLOAD_URL XHJ_IOS_DOWNLOAD_URL=$PRE_XHJ_IOS_DOWNLOAD_URL XHJ_ANDROID_DOWNLOAD_URL=$PRE_XHJ_ANDROID_DOWNLOAD_URL -elif [[ "${CI_COMMIT_BRANCH}" == "develop" ]] || [[ "${CI_COMMIT_BRANCH}" == "feat_devops" ]]; then +elif [[ "${CI_COMMIT_BRANCH}" == "develop_sky" ]] || [[ "${CI_COMMIT_BRANCH}" == "feat_devops_sky" ]]; then WECAHT_WEBHOOK_URL=$DEV_QYWECAHT_WEBHOOK_URL SKY_IOS_DOWNLOAD_URL=$DEV_SKY_IOS_DOWNLOAD_URL SKY_ANDROID_DOWNLOAD_URL=$DEV_SKY_ANDROID_DOWNLOAD_URL diff --git a/tag_generator.sh b/tag_generator.sh index 27e39182..5fd79429 100755 --- a/tag_generator.sh +++ b/tag_generator.sh @@ -1,63 +1,106 @@ #!/bin/bash -# 读取环境变量 -URL=$CI_API_V4_URL -TOKEN=$GITLAB_ACCESS_TOKEN -PROJECT_ID=$CI_PROJECT_ID -next_tag="" -newest_tag="" +# ======================== +# 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 变量 + echo "PRIVATE-TOKEN: $TOKEN $URL/projects/$PROJECT_ID/repository/tags" +# 获取项目所有 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") -#echo "tags_json:$tags_json\n" +# 提取所有 tag 名称,按时间倒序排列(最新的在前) tags=$(echo "$tags_json" | jq -r '.[].name') -tags_length=$(echo "$tags_json" | jq -r 'length') -if [ "$tags_length" -lt 1 ]; then - next_tag="v1.0.0" + +# 只保留以 _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 - newest_tag=$(echo "$tags" | head -n 1) - IFS='.' read -r major minor patch <<< "$newest_tag" - major="${major#v}" - compare_json="" + # 解析版本号部分(去掉 _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 - echo "generate_tag:$newest_tag-to-master\n" - compare_json=$(curl -s --header "PRIVATE-TOKEN: $TOKEN" "$URL/projects/$PROJECT_ID/repository/compare?from=$newest_tag&to=master") + # 生成 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 - echo "generate_version:master-to-$CI_COMMIT_BRANCH\n" + # 生成版本号时,对比 master 和当前分支之间的提交 + echo "generate_version:master-to-$CI_COMMIT_BRANCH\n" 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" - new_patch=$patch - new_minor=$minor + new_patch=$patch # 新的 patch 号 + new_minor=$minor # 新的 minor 号 + # 遍历所有 commit,根据提交信息递增版本号 while IFS= read -r commit_json; do - # 使用 jq 解析每一行的 JSON 对象 + # 解析每个 commit 的 id 和 message commit_id=$(echo "$commit_json" | jq -r '.id') commit_message=$(echo "$commit_json" | jq -r '.message') echo "----$commit_message" + # 如果有 feat: 类型提交,minor 递增(只递增一次) if [[ "$commit_message" =~ ("feat:"*) ]] && [[ $new_minor == $minor ]]; then ((new_minor++)) -# new_patch=0 -# break + # 如果有 fix: 类型提交,patch 递增 elif [[ "$commit_message" =~ ("fix:"*) ]]; then ((new_patch++)) + # 其他类型提交(非 Merge/Revert),patch 递增 elif [[ ! "$commit_message" =~ ("Merge"* | "Revert"*) ]]; then ((new_patch++)) fi done < <(echo "$compare_json" | jq -c '.commits[] | {id: .id, message: .message}') - next_tag="v$major.$new_minor.$new_patch" + # 组装新的 tag,格式为 v.._sky + next_tag="v$major.$new_minor.$new_patch_sky" fi -echo "New Tag:$newest_tag;New version: $next_tag;command: $1" + +echo "New Tag:$newest_sky_tag;New version: $next_tag;command: $1" + +# 如果是 generate_tag 命令,且新 tag 和最新 tag 一致,则跳过生成 if [[ "$1" == "generate_tag" ]];then - if [ "$next_tag" == "$newest_tag" ]; then + if [ "$next_tag" == "$newest_sky_tag" ]; then echo "no change from master,skip to generate tag" exit 0 fi + # 配置 git 用户名(可根据需要补充邮箱等) git config user.name + # 创建并推送新 tag git tag $next_tag git push -u origin $next_tag echo "generate tag: $next_tag" elif [[ "$1" == "generate_version" ]]; then + # 如果是 generate_version 命令,仅导出新版本号到环境变量 export NEXT_VERSION="$next_tag" echo "generate version: $NEXT_VERSION" fi +# 无论哪种情况,都把新 tag 写入 app_new.version 文件 +# 供后续流程使用 + echo "$next_tag" > app_new.version