You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:38:23