/** * 后端服务构建工具类 * 遵循阿里开发手册、大厂CI/CD标准 * * @param config 构建配置 * - services: 服务列表 * - version: 版本号 * - settingsFile: Maven settings文件路径 * - skipTests: 是否跳过测试 * - cleanMavenCache: 是否清理Maven缓存 */ def call(Map config = [:]) { // 默认配置 def services = config.services ?: ['common-service', 'api-gateway', 'auth-service', 'user-service', 'map-service', 'order-service', 'merchant-service', 'platform-service', 'product-service', 'rider-service', 'upload-service', 'marketing-service'] def version = config.version ?: env.VERSION def settingsFile = config.settingsFile ?: "${env.WORKSPACE}/infrastructure/jenkins/settings.xml" def skipTests = config.skipTests ?: true def cleanMavenCache = config.cleanMavenCache ?: false echo "🔨 开始构建后端服务" // Maven缓存清理 if (cleanMavenCache) { echo "🧹 清理Maven缓存..." sh 'rm -rf /var/jenkins/maven-repo && mkdir -p /var/jenkins/maven-repo' echo "✅ Maven缓存已清理" } def testArg = skipTests ? '-DskipTests' : '' // 增量构建判断 if (env.INCREMENTAL_BUILD && !env.FORCE_BUILD && !env.CLEAN_BUILD) { echo "📦 增量构建模式" } else { echo "📦 全量构建模式" } // 先在根目录安装所有依赖到本地仓库 echo "📦 安装依赖到本地Maven仓库..." withEnv(["VERSION=${version}", "SETTINGS_FILE=${settingsFile}", "TEST_ARG=${testArg}"]) { def rootExitCode = sh script: ''' mvn install -DskipTests -Drevision=${VERSION} -Dnexus.username=${NEXUS_USERNAME} -Dnexus.password=${NEXUS_PASSWORD} -s ${SETTINGS_FILE} -Dmaven.test.skip=true >> ${WORKSPACE}/build.log 2>&1 ''', returnStatus: true if (rootExitCode != 0) { error("根目录Maven构建失败") } } // 并行构建服务(排除common-service,已在根目录构建) def buildServices = services - 'common-service' echo "🚀 并行构建服务: ${buildServices.join(', ')}" // 限制最大并行度为4,避免资源争抢 def parallelism = Math.min(buildServices.size(), 4) def batches = buildServices.collate(parallelism) def batchNum = 1 batches.each { batch -> echo "🔨 并行构建批次 ${batchNum}: ${batch.join(', ')}" parallel batch.collectEntries { service -> ["build-${service}": { dir("services/${service}") { withEnv(["VERSION=${version}", "TEST_ARG=${testArg}", "SETTINGS_FILE=${settingsFile}", "MAVEN_OPTS=-Xmx2g -XX:MaxMetaspaceSize=512m"]) { def exitCode = sh script: ''' mvn clean install ${TEST_ARG} -Drevision=${VERSION} -Dnexus.username=${NEXUS_USERNAME} -Dnexus.password=${NEXUS_PASSWORD} -s ${SETTINGS_FILE} >> ${WORKSPACE}/build.log 2>&1 ''', returnStatus: true if (exitCode != 0) { error("${service} 构建失败") } else { echo "✅ ${service} 构建成功" } } } }] } batchNum++ } echo "✅ 所有后端服务构建成功" }