签入版本
This commit is contained in:
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
x
Reference in New Issue
Block a user