按官方文档使用流水线构建maven项目
pipeline {
agent {
docker {
image 'maven:3.8.1-adoptopenjdk-11'
args '-v /root/.m2:/root/.m2'
}
}
stages {
stage('Build') {
steps {
sh 'mvn -B -DskipTests clean package'
}
}
}
}
使用的docker maven来构建项目,其中这一段参数:
args '-v /root/.m2:/root/.m2'
是为了映射.m2目录,这样docker容器使用完销毁之后,之前下载的jar包还在,下次不用重新下载
但是遇到问题了,一直不能映射,每次都要重新下载,查阅资料无果,只能一步步看了.
进入运行中的maven容器看了下,/root/.m2下空空如也,就想着是不是默认目录不一样,去看了下docker-maven的说明,默认目录就是/root/.m2,然后又想到,是不是权限问题,就去在mvn命令加了个参数,结果换个目录就能生成了:
mvn -Dmaven.repo.local=/var/jenkins_home/.m2/repo
确认了是权限问题,jenkins是以jenkins用户启动的,所以jenkins容器中也是以jenkins用户启动maven 的,所以无法在/root下创建目录,那么以root用户启动容器即可
在流水线配置
docker {
image 'maven:3-alpine'
args '-u root --name maven -v /var/jenkins_home/maven/.m2:/root/.m2'
}
完整配置:
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-u root --name maven -v /var/jenkins_home/maven/.m2:/root/.m2'
}
}
stages {
stage('maven package') {
steps {
sh 'mvn clean compile'
}
}
stage('Restart Application') {
steps {
echo '...restart'
}
}
}
}
}
=====后续=====
改成root用户启动maven容器还是有问题,以root构建完的文件是root权限,在jenkins构建过程中会报Permission denied
所以还是老实的用jenkins用户,只是改一下maven生成的目录:
首先进入jenkins容器:
docker exec -it jenkins /bin/bash
创建repository目录:
mkdir -p /var/jenkins_home/maven/.m2/repository
然后编辑jenkins流水线,maven package的时候加上参数:
mvn -B -Dmaven.test.skip=true -Dmaven.repo.local=/var/jenkins_home/maven/.m2/repository -pl base-admin clean package -am -amd
修改后的流水线配置 :
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '''--name maven -v /var/jenkins_home/maven/.m2:/var/jenkins_home/maven/.m2
'''
}
}
stages {
stage('maven package') {
steps {
sh 'mvn -B -Dmaven.test.skip=true -Dmaven.repo.local=/var/jenkins_home/maven/.m2/repository'
}
}
}
}
总结:刚开始没找到方向,一直搞不定,其实这几个问题主要就是目录权限问题,顺着这个方向去解决问题就很简单了
在Docker环境下使用Jenkins进行Maven项目的流水线构建时,遇到了.m2目录映射问题,导致每次都需重新下载依赖。通过检查发现是权限问题,因Jenkins容器内以jenkins用户启动,无法在/root下创建目录。尝试以root用户启动容器,但构建的文件拥有root权限,引发Permission denied错误。最终解决方案是改为在jenkins用户下运行,并修改Maven的本地仓库路径为jenkins用户可写的目录,从而成功解决了权限问题。

1807

被折叠的 条评论
为什么被折叠?



