首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让Maven工件在Jenkins管道的运行中持久化?

如何让Maven工件在Jenkins管道的运行中持久化?
EN

Stack Overflow用户
提问于 2020-02-25 15:17:51
回答 2查看 1.7K关注 0票数 0

我们有一个Maven Java项目,希望在Jenkins BlueOcean管道中运行。

我跟踪了本教程。管道正在执行我们的代码。耶!

但是,每次在新的Jenkins运行下执行管道的“构建”阶段时,它都会重新下载所有maven工件。这大大增加了我们的构建时间。

我在“詹金斯-码头”集装箱开始时:

代码语言:javascript
复制
docker container run --name jenkins-docker --rm --detach \
  --privileged --network jenkins --network-alias docker \
  --env DOCKER_TLS_CERTDIR=/certs \
  --volume jenkins-docker-certs:/certs/client \
  --volume jenkins-data:/var/jenkins_home \
  --publish 2376:2376 docker:dind

和“jenkins-蓝海”集装箱,有:

代码语言:javascript
复制
docker container run --name jenkins-blueocean --rm --detach \
  --network jenkins --env DOCKER_HOST=tcp://docker:2376 \
  --env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \
  --volume jenkins-data:/var/jenkins_home \
  --volume jenkins-docker-certs:/certs/client:ro \
  --publish 8080:8080 --publish 50000:50000 jenkinsci/blueocean

那么我们的Jenkinsfile管道是:

代码语言:javascript
复制
pipeline {
    agent {
        docker {
            image 'maven:3.6.3-jdk-8' 
            args '-v /root/.m2:/root/.m2'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean package'
            }
        }
        stage('Test') { 
            steps {
                sh 'mvn test' 
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml' 
                }
            }
        }
    }
}

在这里,Jenkins启动一个新的'maven:3.6.3-jdk-8‘坞映像来运行。正如我所理解的,它还映射了一个卷来持久化.m2目录。

由于我的“jenkins”实例不会跨构建关闭,所以我希望这个.m2目录保持不变。然后,每次连续运行都可以利用下载的工件的缓存,而不需要花费5分钟重新下载它们。

有人能洞察我做错了什么吗?

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-26 05:00:49

终于弄明白了。

运行构建的docker实例不会自动具有user.home变量。因此,每次构建执行时,它都会将.m2构件存储在包含?的路径下,作为文件夹之一。类似于所描述的在这个问题上

Jenkins教程中,我能够发现Maven码头图像希望将工件下载到/root/.m2。这表明maven坞映像使用/root作为它们的主目录。

我更新了Jenkinsfile,以便在顶部包含这个指令,这样Maven Docker实例就可以正确地使用它事实上的主目录。

代码语言:javascript
复制
environment {
  JAVA_TOOL_OPTIONS = '-Duser.home=/root'
}

然后,我努力解决权限问题,试图使卷映射正确。根据Jenkins的设置,我已经创建了一个卷jenkins-data,它可以在我的“主机”Jenkins容器中作为/var/jenkins_home使用。

当我将这个卷直接映射到我的Maven docker映像中的/root目录时,一切都成功了。这与Jenkins教程设置不同,后者显示这是映射到/root/.m2上的。

中的概述

这是我工作的Jenkinsfile

代码语言:javascript
复制
    environment {
      JAVA_TOOL_OPTIONS = '-Duser.home=/root'
    }
    agent {
        docker {
            image 'maven:3.6.3-jdk-8' 
            args '-v /var/jenkins_home:/root'
        }
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn -B -DskipTests clean compile'
            }
        }
        stage('Test') { 
            steps {
                sh 'mvn -X test'
                jacoco()
            }
            post {
                always {
                    junit 'target/surefire-reports/*.xml' 
                }
            }
        }
    }
票数 0
EN

Stack Overflow用户

发布于 2020-02-25 15:46:50

编辑:我把这个问题解读为如何让构建,避免通过共享.m2文件夹下载工件。这个问题是关于如何在本地docker实例中运行maven的教程。不完全一样。

--

有几种解决办法。不要共享/持久化.m2文件夹,Maven并不是线程安全的(上次我认真研究这个问题,现在可能已经修复了)

最简单的方法是设置一个Maven镜像存储库(Nexus对此很好),并告诉您的坞Maven构建将其用作镜像。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60397856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档