签入版本

This commit is contained in:
gitadmin
2025-09-23 21:56:06 +08:00
parent a398663400
commit 68dcd267ba
@@ -1,396 +0,0 @@
package com.nexus.stages
/**
* 构建阶段服务 - 负责Maven项目的编译和打包,支持Nexus私库发布
*
* 主要职责:
* - 执行Maven项目的清理、编译、打包、部署操作
* - 验证构建环境和配置的有效性
* - 处理构建过程中的异常和错误
* - 提供构建结果的状态反馈
* - 支持Nexus私库发布和依赖管理
*
* 设计原则:
* - 单一职责:专注于Maven构建相关的逻辑
* - 可重用性:可以在不同的流水线项目中重用
* - 错误隔离:构建失败不会影响其他服务实例
* - 配置驱动:通过参数Map接收所有配置信息
*
* @see Serializable 实现序列化接口,支持Jenkins流水线的暂停和恢复
*/
class BuildService implements Serializable {
/**
* Jenkins pipeline脚本对象
* 用于访问Jenkins DSL方法,如sh、echo、error等
* 类型: Object (通常是Jenkins pipeline的script对象)
*/
def script
/**
* 环境配置信息
* 存储构建环境特定的配置参数
* 类型: Map<String, Object> 键值对配置映射
*/
def envConfig
/**
* 构造函数 - 初始化构建服务
*
* @param script Jenkins pipeline脚本对象(必须)
* - 用途:用于在服务中访问Jenkins DSL方法
* - 示例:在Pipeline中通过`this`传递当前脚本上下文
*
* @param envConfig 环境配置信息(可选)
* - 类型:Map<String, Object> 键值对配置映射
* - 默认值:空Map [:]
* - 内容:构建环境相关的配置参数
*/
BuildService(script, envConfig = [:]) {
this.script = script
this.envConfig = envConfig
script.echo "🔧 BuildService 初始化完成"
}
/**
* 执行构建阶段逻辑 - 增强版,支持Nexus私库发布
* 负责Maven项目的完整构建生命周期,包括清理、编译、测试、打包、部署
*
* 主要步骤:
* 1. 输出构建开始信息和配置详情
* 2. 验证环境配置的有效性
* 3. 执行Maven构建命令(包含依赖清理和Nexus部署)
* 4. 处理构建结果和异常
* 5. 生成构建报告
*
* @param params 管道参数Map,包含构建所需的所有配置信息,必须包含:
* - MAVEN_SET: String - Maven设置文件ID(Jenkins Config File ID)
* - PROFILES: String - Maven构建环境profiles(如:dev, test, prod)
* 可选字段:
* - jarFilePath: String - JAR文件输出路径(默认:target)
* - jarFile: String - 生成的JAR文件名
* - skipTests: Boolean - 是否跳过测试(默认:true)
* - goals: String - Maven执行目标
* - pomFilePath: String - POM文件路径(默认:pom.xml)
* - orgName: String - 组织名称(用于JDK服务验证)
* - availableProfiles: List - 可用的环境profile列表
* - branchConfig: Map - 分支配置信息
* - currentNexusConfig: Map - 当前Nexus配置
* - repositoryPolicy: String - 仓库策略
* - publishStrategy: Map - 发布策略配置
*
* @throws Exception 当Maven构建失败时抛出异常,中断流水线
* 异常信息包含详细的错误原因和建议解决方案
*
* @example 使用示例:
* def buildParams = [
* MAVEN_SET: "nexus-maven-dev",
* PROFILES: "dev",
* jarFilePath: "target",
* jarFile: "xiaomayi-common.jar",
* skipTests: true,
* orgName: "xiaomayi",
* availableProfiles: ["dev", "test", "prod"],
* branchConfig: [maven: [deploy: true]],
* currentNexusConfig: [url: "http://nexus/repository/maven-snapshots/"],
* repositoryPolicy: "snapshots"
* ]
* buildService.executeBuildStage(buildParams)
*/
def executeBuildStage(params) {
try {
// 输出构建开始信息和配置详情
script.echo "🏗️ 开始构建阶段..."
printBuildConfiguration(params)
// 验证环境profile的有效性(确保配置的一致性)
validateProfile(params)
// 执行Maven构建命令
executeMavenBuild(params)
// 构建成功完成,生成报告
generateBuildReport(params)
} catch (Exception e) {
// 构建失败处理
handleBuildFailure(e, params)
// 重新抛出异常,确保流水线标记为失败状态
throw e
}
}
/**
* 打印构建配置详情
* 显示所有构建相关的配置信息,便于调试和验证
*
* @param params 构建参数Map
*/
private def printBuildConfiguration(params) {
script.echo "📋 构建配置详情:"
script.echo " 🔧 Maven配置: ${params.MAVEN_SET}"
script.echo " 🌍 构建Profile: ${params.PROFILES}"
script.echo " 📦 输出路径: ${params.jarFilePath ?: 'target'}"
script.echo " 🏷️ JAR文件: ${params.jarFile ?: '未指定'}"
script.echo " ⚡ 跳过测试: ${params.skipTests ?: true}"
script.echo " 📄 POM文件: ${params.pomFilePath ?: 'pom.xml'}"
// 显示Nexus相关配置
if (params.currentNexusConfig) {
script.echo " 🔗 Nexus仓库: ${params.currentNexusConfig.url}"
script.echo " 🎯 仓库策略: ${params.repositoryPolicy ?: 'releases'}"
}
// 显示发布策略
if (params.publishStrategy) {
script.echo " 🚀 自动发布: ${params.publishStrategy.autoPublish ?: 'false'}"
script.echo " 🔏 GPG签名: ${params.publishStrategy.signArtifacts ?: 'false'}"
}
}
/**
* 执行Maven构建命令
* 使用Config File Provider动态加载Maven配置,执行完整的构建生命周期
*
* @param params 构建参数Map
*/
private def executeMavenBuild(params) {
script.echo "🔨 执行Maven构建命令..."
// 使用Config File Provider加载Maven settings.xml
script.configFileProvider([script.configFile(fileId: params.MAVEN_SET, variable: 'MAVEN_SETTINGS_XML')]) {
// 构建Maven命令参数
def mavenGoals = buildMavenGoals(params)
def mavenOptions = buildMavenOptions(params)
script.sh """
# ================================================
# 小蚂蚁核心库Maven构建脚本
# 环境: ${params.PROFILES}
# 时间: \$(date)
# ================================================
echo "🚀 开始执行Maven构建..."
# 显示Maven版本信息
/usr/local/maven/bin/mvn --version
# 显示当前工作目录和POM文件
echo "📁 工作目录: \$(pwd)"
echo "📄 POM文件: ${params.pomFilePath ?: 'pom.xml'}"
echo "🔧 Settings文件: \${MAVEN_SETTINGS_XML}"
# 执行Maven构建命令
echo "🔨 执行命令: /usr/local/maven/bin/mvn --settings \${MAVEN_SETTINGS_XML} ${mavenGoals} ${mavenOptions}"
/usr/local/maven/bin/mvn \\
--settings \${MAVEN_SETTINGS_XML} \\
-f ${params.pomFilePath ?: 'pom.xml'} \\
${mavenGoals} ${mavenOptions}
# 检查构建结果
BUILD_RESULT=\$?
if [ \$BUILD_RESULT -eq 0 ]; then
echo "✅ Maven构建成功完成!"
else
echo "❌ Maven构建失败,退出码: \$BUILD_RESULT"
exit \$BUILD_RESULT
fi
"""
}
}
/**
* 构建Maven执行目标
* 根据参数配置生成合适的Maven goals
*
* @param params 构建参数Map
* @return Maven goals字符串
*/
private def buildMavenGoals(params) {
def goals = []
// 添加依赖清理(针对小蚂蚁依赖)
goals.add("dependency:purge-local-repository -Dinclude=com.xiaomayi")
// 添加标准构建生命周期
goals.add("clean")
// 根据分支配置决定是否部署
if (params.branchConfig?.maven?.deploy) {
goals.add("deploy")
script.echo " 🚀 启用部署到Nexus仓库"
} else {
goals.add("install")
script.echo " 💾 仅安装到本地仓库"
}
goals.add("package")
return goals.join(" ")
}
/**
* 构建Maven选项参数
* 根据配置生成Maven命令行选项
*
* @param params 构建参数Map
* @return Maven选项字符串
*/
private def buildMavenOptions(params) {
def options = []
// 强制更新依赖
options.add("-U")
// 跳过测试配置
if (params.skipTests ?: true) {
options.add("-Dmaven.test.skip=true")
script.echo " ⚡ 跳过单元测试"
} else {
script.echo " ✅ 执行单元测试"
}
// 添加Maven profile(如果指定)
if (params.PROFILES) {
options.add("-P${params.PROFILES}")
}
// 添加分支配置中的额外选项
if (params.branchConfig?.maven?.options) {
options.add(params.branchConfig.maven.options)
}
return options.join(" ")
}
/**
* 生成构建报告
* 构建成功后生成详细的构建结果报告
*
* @param params 构建参数Map
*/
private def generateBuildReport(params) {
script.echo "📊 构建阶段完成报告:"
script.echo " - ✅ 依赖清理完成(com.xiaomayi)"
script.echo " - ✅ 代码编译完成"
script.echo " - ${params.skipTests ? '⚡ 单元测试跳过' : '✅ 单元测试通过'}"
script.echo " - ✅ 打包完成"
// 显示部署状态
def deployStatus = params.branchConfig?.maven?.deploy ? "已部署到Nexus" : "未部署"
script.echo " - 📦 部署状态: ${deployStatus}"
if (params.branchConfig?.maven?.deploy) {
script.echo " 🎯 目标仓库: ${params.currentNexusConfig?.url ?: '默认仓库'}"
script.echo " 📋 仓库策略: ${params.repositoryPolicy ?: 'releases'}"
}
// 显示GPG签名状态
if (params.publishStrategy?.signArtifacts) {
script.echo " - 🔏 GPG签名: 已启用(密钥: ${params.publishStrategy.gpgKeyId ?: '默认密钥'})"
}
// 显示生成的构件信息
script.echo "🎉 构建产物已生成到: ${params.jarFilePath ?: 'target'} 目录"
// 尝试列出生成的JAR文件
try {
def jarFiles = script.findFiles(glob: "${params.jarFilePath ?: 'target'}/*.jar")
if (jarFiles) {
script.echo "📦 生成的构件:"
jarFiles.each { file ->
script.echo " - ${file.name} (${file.length()} bytes)"
}
}
} catch (Exception e) {
script.echo " ℹ️ 无法列出构件文件: ${e.message}"
}
}
/**
* 处理构建失败情况
* 提供详细的错误信息和调试建议
*
* @param e 异常对象
* @param params 构建参数Map
*/
private def handleBuildFailure(Exception e, params) {
script.echo "❌ 构建阶段失败: ${e.message}"
script.echo "💡 建议检查:"
script.echo " - Maven settings.xml 配置是否正确"
script.echo " - Nexus仓库连接是否正常(地址: ${params.currentNexusConfig?.url ?: '未配置'})"
script.echo " - 网络连接是否正常(依赖下载)"
script.echo " - 代码编译是否有语法错误"
script.echo " - 单元测试是否通过"
script.echo " - 版本号冲突或依赖问题"
// 显示当前环境信息用于调试
script.echo "🔍 调试信息:"
script.echo " - 环境: ${params.PROFILES}"
script.echo " - Maven配置: ${params.MAVEN_SET}"
script.echo " - POM文件: ${params.pomFilePath ?: 'pom.xml'}"
}
/**
* 验证环境profile有效性
* 检查选择的部署环境是否在可用环境列表中,确保部署配置的正确性
*
* 主要功能:
* - 验证必要参数的存在性和有效性
* - 检查所选环境是否在可用环境列表中
* - 提供详细的错误信息和调试建议
*
* @param params 参数Map,必须包含以下字段:
* - PROFILES: String - 要验证的环境profile名称
* - availableProfiles: List<String> - 可用的环境profile列表
* - orgName: String - 组织名称(用于日志和错误消息)
*
* @throws IllegalArgumentException 当缺少必要参数或参数无效时抛出
* @throws Exception 当环境验证失败时抛出,包含详细的错误信息
*/
private def validateProfile(params) {
script.echo "🔍 开始验证环境profile有效性..."
// 参数完整性检查
if (!params.PROFILES) {
def errorMsg = "缺少必要的PROFILES参数,请指定要部署的环境"
script.echo "❌ ${errorMsg}"
throw new IllegalArgumentException(errorMsg)
}
if (!params.availableProfiles || params.availableProfiles.isEmpty()) {
def errorMsg = "缺少可用的环境profile列表,请检查配置文件中环境配置"
script.echo "❌ ${errorMsg}"
throw new IllegalArgumentException(errorMsg)
}
if (!params.orgName) {
script.echo "⚠️ 缺少组织名称参数orgName,使用默认标识"
}
// 环境有效性验证
try {
def selectedProfile = params.PROFILES.trim()
def availableProfiles = params.availableProfiles.collect { it.toString().trim() }
script.echo "📋 验证详情:"
script.echo " 🎯 选择的环境: ${selectedProfile}"
script.echo " 📊 可用环境: ${availableProfiles.join(', ')}"
if (!availableProfiles.contains(selectedProfile)) {
def errorMsg = "无效的部署环境: '${selectedProfile}'。可用环境: ${availableProfiles.join(', ')}"
script.error("环境验证失败: ${errorMsg}")
}
script.echo "✅ 环境profile验证通过: ${selectedProfile}"
} catch (Exception e) {
script.echo "❌ 环境profile验证过程中发生错误: ${e.message}"
script.echo "📋 可用环境列表: ${params.availableProfiles.join(', ')}"
throw e
}
}
}