Docker环境下Jenkins Pipeline集成Artifactory上传Maven制品最佳实践
我来帮你梳理下Docker容器构建Maven制品后,上传到Artifactory的最佳实践方案——刚好我之前处理过几乎一模一样的场景,核心思路就是跳过重复构建,直接收集Docker里的成品上传,完全不用再跑一遍Maven。
核心逻辑拆解
你之前遇到的重复构建问题,本质是误用了Maven的deploy生命周期或者Artifactory插件的run指令——这些方式会重新触发Maven构建。而我们已经在Docker里完成了构建,只需要把容器里的制品“拿出来”,直接交给Artifactory插件上传就行。
具体实现步骤
1. 前置准备
确保你的Jenkins已经安装了两个关键插件:
- Artifactory插件:用来和Artifactory服务器交互上传制品
- Docker插件:用来操作Docker容器(或者直接在Jenkins节点上配置好Docker环境,让jenkins用户有权限执行docker命令)
2. 优化Docker构建步骤
首先在Docker里完成Maven构建,这里有两种方式确保制品能被Jenkins获取:
方式一:挂载Jenkins工作空间到容器(推荐)
直接把Jenkins的工作目录挂载到Docker容器里,构建后的target目录会直接同步到Jenkins本地,省掉拷贝步骤:
docker run --rm \ -v ${WORKSPACE}:/usr/src/maven-project \ -w /usr/src/maven-project \ maven:3.8.6-openjdk-11 \ mvn clean package -DskipTests
--rm:容器跑完自动删除,不用手动清理-v:把Jenkins当前工作空间挂载到容器内的项目目录-w:指定容器的工作目录为挂载的项目路径
方式二:从容器拷贝制品到Jenkins
如果不能挂载目录(比如容器是远程构建的),可以先给容器命名,构建完成后用docker cp拷贝制品:
# 1. 带名称启动容器构建 docker run --name maven-build-temp \ maven:3.8.6-openjdk-11 \ mvn clean package -DskipTests -f /usr/src/your-project/pom.xml # 2. 拷贝容器内的target目录到Jenkins工作空间 docker cp maven-build-temp:/usr/src/your-project/target ${WORKSPACE}/target # 3. 清理临时容器 docker rm maven-build-temp
3. 用Artifactory Pipeline插件上传制品
这一步是核心,直接用插件的upload方法,跳过Maven的deploy流程。示例Pipeline代码如下:
pipeline { agent any stages { stage('Maven Build in Docker') { steps { // 这里用上面推荐的挂载方式构建 sh ''' docker run --rm \ -v ${WORKSPACE}:/usr/src/maven-project \ -w /usr/src/maven-project \ maven:3.8.6-openjdk-11 \ mvn clean package -DskipTests ''' } } stage('Upload to Artifactory') { steps { script { // 关联Jenkins中配置好的Artifactory服务器(替换成你的服务器ID) def artifactoryServer = Artifactory.server('your-artifactory-server-id') // 定义上传规则:匹配制品,指定Artifactory目标路径 def uploadSpec = """{ "files": [ { "pattern": "${WORKSPACE}/target/*.jar", "target": "libs-release-local/com/your-company/your-project/${env.BUILD_NUMBER}/" }, { "pattern": "${WORKSPACE}/target/*.pom", "target": "libs-release-local/com/your-company/your-project/${env.BUILD_NUMBER}/" }, { "pattern": "${WORKSPACE}/target/*-sources.jar", "target": "libs-release-local/com/your-company/your-project/${env.BUILD_NUMBER}/" } ] }""" // 执行上传 artifactoryServer.upload(uploadSpec) } } } } }
关键细节优化
- 版本号动态获取:如果你的项目版本不是用构建号,而是Maven项目里的版本,可以用Maven命令提取:
然后把上传路径里的def projectVersion = sh( script: 'mvn help:evaluate -Dexpression=project.version -q -DforceStdout', returnStdout: true ).trim()${env.BUILD_NUMBER}替换成${projectVersion}。 - 多模块项目适配:如果是多模块Maven项目,把匹配规则改成
${WORKSPACE}/**/target/*.jar,或者指定具体模块的路径。 - 制品校验:上传前可以加一步校验,确保制品存在:
sh 'ls -la ${WORKSPACE}/target/*.jar'
这样整个流程就完全避免了重复构建,直接复用Docker里的构建产物,高效又可靠。
内容的提问来源于stack exchange,提问作者lanoxx
相关产品推荐
相关产品推荐

