forgeboot/.gitlab/workflows/.gitlab-ci.main.yml
gewuyou be03204a73 ci:优化自动打标签流程
- 更新 Alpine 镜像为带有 Git 的版本
-重新组织脚本步骤,提高流程清晰度
- 添加删除本地 tag 和拉取远程 tag 及 main 分支的步骤
- 优化变量获取方式,确保获取到正确的 main commit
2025-08-13 20:10:12 +08:00

133 lines
4.0 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

stages:
- tag
- publish
- reset
- mirror
variables:
GRADLE_USER_HOME: "$CI_PROJECT_DIR/.gradle"
before_script:
- rm -rf $GRADLE_USER_HOME/.tmp || true
# 🏷️ 自动打标签
tag:
stage: tag
image:
name: alpine/git:latest
entrypoint: [ "" ]
rules:
- if: '$CI_COMMIT_BRANCH == "main" && $CI_COMMIT_MESSAGE !~ /ci/i'
script:
- git config --global user.email "pipeline@${GITLAB_URL}"
- git config --global user.name "Project Pipeline Bot"
- echo "🧹 删除所有本地 tag..."
- git tag -l | xargs -r git tag -d || true
- echo "🔍 拉取远程 tag 和 main"
- git fetch --tags --force --prune
- git fetch origin main --force
- MAIN_COMMIT=$(git rev-parse origin/main)
- echo "🔗 当前 main commit -> $MAIN_COMMIT"
- git fetch --tags
- git fetch origin main
- MAIN_COMMIT=$(git rev-parse origin/main)
- echo "🔗 main commit -> $MAIN_COMMIT"
- LATEST_TAG=$(git tag --list '*' --sort=-v:refname | head -n1 || true)
- if [ -z "$LATEST_TAG" ]; then LATEST_TAG="0.0.0"; fi
- echo "🔖 最新 tag -> $LATEST_TAG"
- VERSION=${LATEST_TAG#v}
- MAJOR=$(echo "$VERSION" | cut -d. -f1)
- MINOR=$(echo "$VERSION" | cut -d. -f2)
- PATCH=$(echo "$VERSION" | cut -d. -f3)
- PATCH=$((PATCH + 1))
- if [ "$PATCH" -ge 10 ]; then PATCH=0; MINOR=$((MINOR+1)); echo "🔁 patch 达到 10进位MINOR=$MINOR, PATCH=$PATCH"; fi
- NEW_TAG="${MAJOR}.${MINOR}.${PATCH}"
- echo "🏷️ 新 tag -> $NEW_TAG"
- if git tag --points-at "$MAIN_COMMIT" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' > /dev/null; then
echo "⏭️ 已存在 tag跳过创建";
exit 0;
fi
- git tag $NEW_TAG $MAIN_COMMIT
- git push https://oauth2:${PIPELINE_BOT_TOKEN}@${GITLAB_URL}/${CI_PROJECT_PATH}.git $NEW_TAG
- echo "✅ tag $NEW_TAG 已推送"
# 添加 GitHub 远程并推送 tag
- git remote add github https://x-access-token:${GITHUB_PUSH_TOKEN}@github.com/GeWuYou/forgeboot.git
- git push github $NEW_TAG
- echo "✅ tag $NEW_TAG 已同步至 GitHub"
tags:
- java
# 📦 发布至 GitLab 与 GitHub Maven 仓库
publish:
stage: publish
needs: [ "tag" ]
rules:
- if: '$CI_COMMIT_BRANCH == "main" && $CI_COMMIT_MESSAGE !~ /ci/i'
cache:
key:
files:
- gradle/libs.versions.toml
- "**/*.gradle.kts"
prefix: lab-agent
paths:
- .gradle/caches/
- .gradle/wrapper/
- .gradle/kotlin-profile/
- .kotlin/
policy: pull-push
script:
- echo "🔧 授予 gradlew 执行权限..."
- chmod +x gradlew
- ./gradlew publishMavenJavaPublicationToGitLabRepository
- ./gradlew publishMavenJavaPublicationToGitHubRepository --continue
tags:
- java
# 🔄 重建 test 分支
reset:
stage: reset
image: alpine:latest
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
script:
- set -euo pipefail
- apk add --no-cache git
- git config --global user.email "pipeline@${GITLAB_URL}"
- git config --global user.name "Project Pipeline Bot"
- git clone --branch main https://oauth2:${PIPELINE_BOT_TOKEN}@${GITLAB_URL}/${CI_PROJECT_PATH}.git repo
- cd repo
- git checkout -B test
- git push origin test --force
- echo "✅ test 分支已重建完成"
tags:
- java
# Mirror to GitHub
mirror-to-github:
stage: mirror
image: alpine:latest
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
script:
- set -euo pipefail
- apk add --no-cache git openssh
- git config --global user.name "Project Pipeline Bot"
- git config --global user.email "pipeline@${GITLAB_URL}"
- echo "🔄 正在 clone 当前 GitLab 仓库..."
- git clone --branch main https://oauth2:${PIPELINE_BOT_TOKEN}@${GITLAB_URL}/${CI_PROJECT_PATH}.git repo
- cd repo
- echo "🔗 添加 GitHub 远程地址..."
- git remote add github https://x-access-token:${GITHUB_PUSH_TOKEN}@github.com/GeWuYou/forgeboot.git
- echo "🚀 推送 main 分支到 GitHub..."
- git push github main --force
- echo "✅ GitHub 同步完成"
tags:
- java