我们有一个Maven Java项目,希望在Jenkins BlueOcean管道中运行。
我跟踪了本教程。管道正在执行我们的代码。耶!
但是,每次在新的Jenkins运行下执行管道的“构建”阶段时,它都会重新下载所有maven工件。这大大增加了我们的构建时间。
我在“詹金斯-码头”集装箱开始时:
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-蓝海”集装箱,有:
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管道是:
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分钟重新下载它们。
有人能洞察我做错了什么吗?
提前感谢
发布于 2020-02-26 05:00:49
终于弄明白了。
运行构建的docker实例不会自动具有user.home变量。因此,每次构建执行时,它都会将.m2构件存储在包含?的路径下,作为文件夹之一。类似于所描述的在这个问题上。
从Jenkins教程中,我能够发现Maven码头图像希望将工件下载到/root/.m2。这表明maven坞映像使用/root作为它们的主目录。
我更新了Jenkinsfile,以便在顶部包含这个指令,这样Maven Docker实例就可以正确地使用它事实上的主目录。
environment {
JAVA_TOOL_OPTIONS = '-Duser.home=/root'
}然后,我努力解决权限问题,试图使卷映射正确。根据Jenkins的设置,我已经创建了一个卷jenkins-data,它可以在我的“主机”Jenkins容器中作为/var/jenkins_home使用。
当我将这个卷直接映射到我的Maven docker映像中的/root目录时,一切都成功了。这与Jenkins教程设置不同,后者显示这是映射到/root/.m2上的。
中的概述
这是我工作的Jenkinsfile
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'
}
}
}
}发布于 2020-02-25 15:46:50
编辑:我把这个问题解读为如何让构建,避免通过共享.m2文件夹下载工件。这个问题是关于如何在本地docker实例中运行maven的教程。不完全一样。
--
有几种解决办法。不要共享/持久化.m2文件夹,Maven并不是线程安全的(上次我认真研究这个问题,现在可能已经修复了)
最简单的方法是设置一个Maven镜像存储库(Nexus对此很好),并告诉您的坞Maven构建将其用作镜像。
https://stackoverflow.com/questions/60397856
复制相似问题