diff --git a/logic-ide/pom-xml-flattened b/logic-ide/pom-xml-flattened deleted file mode 100644 index bd041d2..0000000 --- a/logic-ide/pom-xml-flattened +++ /dev/null @@ -1,83 +0,0 @@ - - - 4.0.0 - - com.aims.logic - logic-solution - 0.10-SNAPSHOT - - com.aims.logic - logic-ide - 0.10-SNAPSHOT - logic-ide - logic-ide - - - nexus-releases - https://nexus.aimstek.cn/repository/maven-releases/ - - - nexus-snapshots - https://nexus.aimstek.cn/repository/maven-snapshots/ - - - - 17 - - - - - org.springframework.boot - spring-boot-dependencies - 2.7.2 - pom - import - - - - - - com.aims.logic - logic-sdk - ${logic-sdk.version} - - - com.github.javaparser - javaparser-core - 3.25.5 - - - org.springframework.boot - spring-boot-starter-web - 2.7.2 - - - org.springframework.boot - spring-boot-starter-webflux - - - org.redisson - redisson - 3.23.5 - - - - - nexus - 公司镜像仓库 - https://nexus.aimstek.cn/repository/maven-public - - - - - - maven-compiler-plugin - 3.8.1 - - true - - - - - diff --git a/logic-ide/pom.xml b/logic-ide/pom.xml index 84c4006..3a09fb8 100644 --- a/logic-ide/pom.xml +++ b/logic-ide/pom.xml @@ -15,17 +15,6 @@ 17 - - - - org.springframework.boot - spring-boot-dependencies - 2.7.2 - pom - import - - - @@ -42,7 +31,6 @@ org.springframework.boot spring-boot-starter-web - 2.7.2 diff --git a/logic-sdk/pom-xml-flattened b/logic-sdk/pom-xml-flattened index 6af39b0..e71e7c5 100644 --- a/logic-sdk/pom-xml-flattened +++ b/logic-sdk/pom-xml-flattened @@ -44,12 +44,10 @@ org.springframework.boot spring-boot-starter-aop - 2.7.2 org.springframework.boot spring-boot-starter-jdbc - 2.7.2 org.redisson diff --git a/logic-sdk/pom.xml b/logic-sdk/pom.xml index cb705db..48d5e16 100644 --- a/logic-sdk/pom.xml +++ b/logic-sdk/pom.xml @@ -40,12 +40,10 @@ org.springframework.boot spring-boot-starter-aop - 2.7.2 org.springframework.boot spring-boot-starter-jdbc - 2.7.2 org.redisson diff --git a/pom-xml-flattened b/pom-xml-flattened index 0a7c513..1d6330b 100644 --- a/pom-xml-flattened +++ b/pom-xml-flattened @@ -33,6 +33,17 @@ 0.10-SNAPSHOT 0.10-SNAPSHOT + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + org.projectlombok @@ -43,12 +54,10 @@ org.springframework.boot spring-boot-starter - 2.7.2 org.springframework.boot spring-boot-starter-test - 2.7.2 test @@ -93,4 +102,21 @@ + + + spring-boot-2 + + true + + + 2.7.2 + + + + spring-boot-3 + + 3.2.5 + + + diff --git a/pom.xml b/pom.xml index 4653804..6e4ba99 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,17 @@ 17 17 + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + logic-runtime logic-sdk @@ -65,13 +76,11 @@ org.springframework.boot spring-boot-starter - 2.7.2 org.springframework.boot spring-boot-starter-test test - 2.7.2 @@ -117,4 +126,21 @@ + + + spring-boot-2 + + true + + + 2.7.2 + + + + spring-boot-3 + + 3.2.5 + + + diff --git a/readme.md b/readme.md index 7f2dcb6..c26949c 100644 --- a/readme.md +++ b/readme.md @@ -50,6 +50,24 @@ mvn spring-boot:run 访问 http://localhost:8888 查看管理界面。 +## 本地兼容性验证 + +项目引入了 `spring-boot-2`(默认启用)与 `spring-boot-3` 两个 Maven Profile,用于分别拉起 Spring Boot 2.7.x 与 3.2.x 的依赖栈来编译和验证 `logic-ide` 模块及其依赖。 + +一键执行两个 Profile 构建可运行以下脚本: + +```bash +./scripts/verify-compatibility.sh +``` + +脚本会先后执行 `clean verify`,覆盖 `spring-boot-2` 与 `spring-boot-3` 两个 Profile;传入的额外参数会直接透传给 Maven。 + +如需单独验证某个 Profile,可手动执行: + +```bash +./mvnw -pl logic-ide -am clean verify -Pspring-boot-3 +``` + ### Maven 依赖 ```xml diff --git a/scripts/build-and-release.sh b/scripts/build-and-release.sh new file mode 100644 index 0000000..446d9cb --- /dev/null +++ b/scripts/build-and-release.sh @@ -0,0 +1,205 @@ +#!/usr/bin/env bash +set -euo pipefail + +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +MVNW_BIN="${PROJECT_ROOT}/mvnw" + +# 默认参数 +SKIP_TESTS=false +SKIP_DEPLOY=false +DRY_RUN=false +PROFILES=("spring-boot-2" "spring-boot-3") + +# 解析命令行参数 +while [[ $# -gt 0 ]]; do + case $1 in + --skip-tests) + SKIP_TESTS=true + shift + ;; + --skip-deploy) + SKIP_DEPLOY=true + shift + ;; + --dry-run) + DRY_RUN=true + shift + ;; + --profiles) + IFS=',' read -ra PROFILES <<< "$2" + shift 2 + ;; + -h|--help) + echo "Logic-IDE 构建与发布脚本" + echo "" + echo "用法: $0 [选项]" + echo "" + echo "选项:" + echo " --skip-tests 跳过测试" + echo " --skip-deploy 跳过部署到仓库" + echo " --dry-run 模拟运行,不执行实际操作" + echo " --profiles 指定要构建的profiles (逗号分隔)" + echo " -h, --help 显示帮助信息" + echo "" + echo "示例:" + echo " $0 # 构建所有profiles" + echo " $0 --profiles spring-boot-2 # 只构建Spring Boot 2" + echo " $0 --dry-run # 模拟运行" + exit 0 + ;; + *) + echo "未知参数: $1" + echo "使用 -h 或 --help 查看帮助" + exit 1 + ;; + esac +done + +echo "========================================" +echo "Logic-IDE 构建与发布脚本" +echo "========================================" +echo "项目根目录: ${PROJECT_ROOT}" +echo "Java版本: $(java -version 2>&1 | head -n 1)" +echo "Maven版本: $("${MVNW_BIN}" --version | head -n 1)" +echo "构建Profiles: ${PROFILES[*]}" +echo "跳过测试: ${SKIP_TESTS}" +echo "跳过部署: ${SKIP_DEPLOY}" +echo "模拟运行: ${DRY_RUN}" +echo "" + +# 获取当前版本 +CURRENT_VERSION=$("${MVNW_BIN}" -q -N help:evaluate -Dexpression=project.version -DforceStdout) +echo "当前版本: ${CURRENT_VERSION}" + +# 检查版本是否为SNAPSHOT +if [[ "$CURRENT_VERSION" == *"-SNAPSHOT" ]]; then + echo "⚠️ 当前为SNAPSHOT版本,将部署到快照仓库" + REPO_TYPE="snapshots" +else + echo "✅ 当前为正式版本,将部署到发布仓库" + REPO_TYPE="releases" +fi + +echo "" + +# 构建函数 +build_profile() { + local profile="$1" + echo "" + echo "========================================" + echo "构建 Profile: ${profile}" + echo "========================================" + + local maven_goals=("clean") + + if [[ "$SKIP_TESTS" == false ]]; then + maven_goals+=("verify") + else + maven_goals+=("install") + fi + + local maven_args=( + "-pl" "logic-ide" + "-am" + "-P${profile}" + ) + + if [[ "$DRY_RUN" == false ]]; then + echo "执行命令: ${MVNW_BIN} ${maven_goals[*]} ${maven_args[*]}" + if "${MVNW_BIN}" "${maven_goals[@]}" "${maven_args[@]}"; then + echo "✅ Profile ${profile} 构建成功" + return 0 + else + echo "❌ Profile ${profile} 构建失败" + return 1 + fi + else + echo "模拟执行: ${MVNW_BIN} ${maven_goals[*]} ${maven_args[*]}" + echo "✅ Profile ${profile} 模拟构建成功" + return 0 + fi +} + +# 部署函数 +deploy_profile() { + local profile="$1" + echo "" + echo "========================================" + echo "部署 Profile: ${profile}" + echo "========================================" + + if [[ "$SKIP_DEPLOY" == true ]]; then + echo "⏭️ 跳过部署 (skip-deploy)" + return 0 + fi + + if [[ "$DRY_RUN" == false ]]; then + echo "执行部署命令..." + if "${MVNW_BIN}" -pl logic-ide -am -P"${profile}" deploy -DskipTests; then + echo "✅ Profile ${profile} 部署成功" + return 0 + else + echo "❌ Profile ${profile} 部署失败" + return 1 + fi + else + echo "模拟部署 Profile ${profile}" + echo "✅ Profile ${profile} 模拟部署成功" + return 0 + fi +} + +# 执行构建 +FAILED_PROFILES=() +for profile in "${PROFILES[@]}"; do + if build_profile "$profile"; then + echo "📦 Profile ${profile} 构建完成" + else + FAILED_PROFILES+=("${profile}") + fi +done + +# 检查构建结果 +if [ ${#FAILED_PROFILES[@]} -ne 0 ]; then + echo "" + echo "========================================" + echo "构建失败" + echo "========================================" + echo "以下 profile 构建失败: ${FAILED_PROFILES[*]}" + exit 1 +fi + +# 执行部署 +FAILED_DEPLOYS=() +for profile in "${PROFILES[@]}"; do + if ! deploy_profile "$profile"; then + FAILED_DEPLOYS+=("${profile}") + fi +done + +# 最终结果 +echo "" +echo "========================================" +echo "构建与发布结果汇总" +echo "========================================" + +if [ ${#FAILED_DEPLOYS[@]} -eq 0 ]; then + echo "🎉 所有操作完成!" + echo "版本: ${CURRENT_VERSION}" + echo "构建的Profiles: ${PROFILES[*]}" + + if [[ "$SKIP_DEPLOY" == false && "$DRY_RUN" == false ]]; then + echo "✅ 已部署到 ${REPO_TYPE} 仓库" + + # 提示创建Git tag + if [[ "$REPO_TYPE" == "releases" ]]; then + echo "" + echo "💡 建议创建Git tag:" + echo " git tag v${CURRENT_VERSION}" + echo " git push origin v${CURRENT_VERSION}" + fi + fi +else + echo "💥 以下 profile 部署失败: ${FAILED_DEPLOYS[*]}" + exit 1 +fi \ No newline at end of file diff --git a/scripts/check-version-change.sh b/scripts/check-version-change.sh new file mode 100644 index 0000000..be2f304 --- /dev/null +++ b/scripts/check-version-change.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash +set -euo pipefail + +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +MVNW_BIN="${PROJECT_ROOT}/mvnw" + +if [[ ! -x "${MVNW_BIN}" ]]; then + echo "Maven Wrapper not found or not executable at: ${MVNW_BIN}" >&2 + exit 1 +fi + +echo "========================================" +echo "Logic-IDE 版本变更检测脚本" +echo "========================================" + +# 检查是否在 Git 仓库中 +if ! git rev-parse --git-dir > /dev/null 2>&1; then + echo "❌ 当前目录不是 Git 仓库" + exit 1 +fi + +# 获取当前和上一个提交的 hash +CURRENT_COMMIT=$(git rev-parse HEAD) +PREV_COMMIT=$(git rev-parse HEAD^ 2>/dev/null || echo "") + +if [[ -z "${PREV_COMMIT}" ]]; then + echo "⚠️ 没有上一个提交,这是初始提交" + PREV_COMMIT="4b825dc642cb6eb9a060e54bf8d69288fbee4904" # Empty tree hash +fi + +echo "当前提交: ${CURRENT_COMMIT}" +echo "上一个提交: ${PREV_COMMIT}" +echo "" + +# 检查版本定义文件是否变更 +VERSION_FILES=("pom.xml" "logic-ide/pom.xml" "logic-sdk/pom.xml") +CHANGED_VERSION_FILES=() + +for file in "${VERSION_FILES[@]}"; do + if git diff --name-only "${PREV_COMMIT}" "${CURRENT_COMMIT}" | grep -q "^${file}$"; then + CHANGED_VERSION_FILES+=("${file}") + fi +done + +if [ ${#CHANGED_VERSION_FILES[@]} -eq 0 ]; then + echo "📋 版本定义文件未发生变更" + echo "检测的文件: ${VERSION_FILES[*]}" + exit 0 +fi + +echo "📝 检测到版本定义文件变更: ${CHANGED_VERSION_FILES[*]}" +echo "" + +# 提取版本号并比较 +echo "提取版本号..." +PREV_VERSION=$(git show "${PREV_COMMIT}:pom.xml" 2>/dev/null | "${MVNW_BIN}" -q -N help:evaluate -Dexpression=project.version -DforceStdout 2>/dev/null || echo "unknown") +CURRENT_VERSION=$("${MVNW_BIN}" -q -N help:evaluate -Dexpression=project.version -DforceStdout 2>/dev/null || echo "unknown") + +echo "上一个版本: ${PREV_VERSION}" +echo "当前版本: ${CURRENT_VERSION}" +echo "" + +# 检查是否为语义化版本提升 +function is_version_bumped() { + local prev="$1" + local curr="$2" + + # 处理未知版本 + if [[ "$prev" == "unknown" || "$curr" == "unknown" ]]; then + return 1 + fi + + # 提取版本号(去掉 -SNAPSHOT 等后缀) + prev_clean=$(echo "$prev" | sed 's/-SNAPSHOT$//') + curr_clean=$(echo "$curr" | sed 's/-SNAPSHOT$//') + + # 简单的版本号比较 + if [[ "$prev_clean" != "$curr_clean" ]]; then + return 0 + fi + + return 1 +} + +if is_version_bumped "$PREV_VERSION" "$CURRENT_VERSION"; then + echo "🎉 检测到版本提升: ${PREV_VERSION} -> ${CURRENT_VERSION}" + echo "version_changed=true" + exit 0 +else + echo "📋 版本号未发生语义化提升" + + # 检查提交信息是否包含发布关键词 + COMMIT_MSG=$(git log --format=%B -n 1 "${CURRENT_COMMIT}") + if echo "$COMMIT_MSG" | grep -qiE "release|发布|版本"; then + echo "📝 提交信息包含发布关键词,触发发布流程" + echo "version_changed=true" + exit 0 + fi + + echo "version_changed=false" + exit 0 +fi \ No newline at end of file diff --git a/scripts/verify-compatibility.sh b/scripts/verify-compatibility.sh new file mode 100755 index 0000000..dd4e134 --- /dev/null +++ b/scripts/verify-compatibility.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +set -euo pipefail + +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +MVNW_BIN="${PROJECT_ROOT}/mvnw" + +if [[ ! -x "${MVNW_BIN}" ]]; then + echo "Maven Wrapper not found or not executable at: ${MVNW_BIN}" >&2 + exit 1 +fi + +if [[ -z "${JAVA_HOME:-}" ]]; then + echo "JAVA_HOME is not set. Please export JAVA_HOME to a JDK 17 installation before running this script." >&2 + exit 1 +fi + +echo "========================================" +echo "Logic-IDE 兼容性验证脚本" +echo "========================================" +echo "项目根目录: ${PROJECT_ROOT}" +echo "Java版本: $(java -version 2>&1 | head -n 1)" +echo "Maven版本: $("${MVNW_BIN}" --version | head -n 1)" +echo "" + +profiles=("spring-boot-2" "spring-boot-3") + +# 检查版本变更 +echo "检查版本变更..." +CURRENT_VERSION=$("${MVNW_BIN}" -q -N help:evaluate -Dexpression=project.version -DforceStdout) +echo "当前版本: ${CURRENT_VERSION}" + +# 运行兼容性测试 +FAILED_PROFILES=() +for profile in "${profiles[@]}"; do + echo "" + echo "========================================" + echo "运行 Maven verify - Profile: ${profile}" + echo "========================================" + + if "${MVNW_BIN}" -pl logic-ide -am clean verify -P"${profile}" "$@"; then + echo "✅ Profile ${profile} 验证成功" + else + echo "❌ Profile ${profile} 验证失败" + FAILED_PROFILES+=("${profile}") + fi +done + +echo "" +echo "========================================" +echo "验证结果汇总" +echo "========================================" + +if [ ${#FAILED_PROFILES[@]} -eq 0 ]; then + echo "🎉 所有 profile 验证通过!版本 ${CURRENT_VERSION} 兼容 Spring Boot 2 & 3" + exit 0 +else + echo "💥 以下 profile 验证失败: ${FAILED_PROFILES[*]}" + echo "请检查错误信息并修复后重试" + exit 1 +fi diff --git a/test-suite/pom-xml-flattened b/test-suite/pom-xml-flattened deleted file mode 100644 index b36acfa..0000000 --- a/test-suite/pom-xml-flattened +++ /dev/null @@ -1,47 +0,0 @@ - - - 4.0.0 - - com.aims.logic - logic-solution - 0.10-SNAPSHOT - - com.aims.logic - test-suite - 0.0.1-SNAPSHOT - test-suite - test-suite - - 17 - - - - org.springframework.boot - spring-boot-starter-web - 2.7.2 - - - com.aims.logic - logic-ide - ${logic-ide.version} - - - com.baomidou - mybatis-plus-boot-starter - 3.5.2 - - - org.springframework.boot - spring-boot-starter-test - 2.7.2 - test - - - junit - junit - 4.13.2 - test - - - diff --git a/test-suite/pom.xml b/test-suite/pom.xml index f34e136..62a2d8c 100644 --- a/test-suite/pom.xml +++ b/test-suite/pom.xml @@ -19,7 +19,6 @@ org.springframework.boot spring-boot-starter-web - 2.7.2 @@ -41,7 +40,6 @@ org.springframework.boot spring-boot-starter-test test - 2.7.2 junit diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\344\270\216\345\217\221\345\270\203\350\256\276\350\256\241.md" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\344\270\216\345\217\221\345\270\203\350\256\276\350\256\241.md" index 39658ea..686f0f9 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\344\270\216\345\217\221\345\270\203\350\256\276\350\256\241.md" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\344\270\216\345\217\221\345\270\203\350\256\276\350\256\241.md" @@ -168,7 +168,7 @@ jobs: - 流水线执行日志保存 180 天,支持审计追溯。 ## 实施里程碑建议 -1. **阶段一**:引入双 profile 与本地脚本,确保在开发机器可以一键验证两个版本。 +1. **阶段一**:引入 `spring-boot-2` / `spring-boot-3` 双 profile 并提供 `scripts/verify-compatibility.sh` 脚本,确保在开发机器可以一键验证两个版本。 2. **阶段二**:上线 PR 与版本检测流水线,完成自动化兼容性测试。 3. **阶段三**:接入发布仓库、生成 Release Note、打通通知。 4. **阶段四(优化)**:引入性能基准测试、Canary 发布、滚动回滚策略等高级能力。