1. Jenkins maven构建工程
1.1 全局工具配置
maven配置、jdk路径
Git配置:
Maven路径:
gitlab token配置:
从gitlab获取api token
2.1 构建配置
本文的jenkins是通过docker compose安装的,运行在docker容器中
2.从gitlab拉取源码
输入gitlab项目地址,点击添加键,添加用户名、密码
可以选择添加子目录
3.构建触发器
4.Build
5.执行构建
6.启动脚本
BUILD_ID=dontKillMe nohup /home/jenkins/startup.sh &
1.3 构建后启动脚本
#!/bin/bash
#export BUILD_ID=dontKillMe这一句很重要,这样指定了,项目启动之后才不会被Jenkins杀掉。
export BUILD_ID=dontKillMe
#指定最后编译好的jar存放的位置
file_path=/home/jenkins/target/
#Jenkins中编译好的jar位置
jar_path=/var/jenkins_home/workspace/spring-boot-demo/target
#Jenkins中编译好的jar名称
jar_name=spring-boot-demo-0.0.1-SNAPSHOT.jar
#获取运行编译好的进程ID,便于我们在重新部署项目的时候先杀掉以前的进程
pid=$(cat /home/jenkins/spring-boot-demo.pid)
#进入指定的编译好的jar的位置
cd ${jar_path}
#将编译好的jar复制到最后指定的位置
cp ${jar_path}/${jar_name} ${file_path}
#进入最后指定存放jar的位置
cd ${file_path}
#杀掉以前可能启动的项目进程
kill -9 ${pid}
#启动jar,指定SpringBoot的profiles为test,后台启动
#java -jar -Dspring.profiles.active=test ${jar_name} &
java -jar ${jar_name} > log.file 2>&1 &
#将进程ID存入到shaw-web.pid文件中
echo $! > /home/jenkins/spring-boot-demo.pid
把上面的脚本放到Post Steps,选择执行shell,如下图:
注意事项:
由于Jenkins是运行在Docker容器中的,所以构建后直接用脚本启动的应用,需要映射Docker容器端口,不映射访问不了,在Jenkins.yml文件中添加端口映射,示例如下:
ports:
- "8082:8080"
- "8810:8810"
- "50000:50000"
1.4 SSH启动脚本
SSH远程启动,因为不是把应用运行在容器里,所以不需要映射应用端口
Post Steps 选择 Run only if build succeeds
点击Add post-build step,选择 Send files or execute commands over SSH
Source files配置:target/xxx-0.0.1-SNAPSHOT.jar 项目jar包名
Remove prefix:target/
Remote directory:/home/jenkins/ 代码应用服务器的目录地址,
Exec command:/home/jenkins /xxx.sh 应用服务器对应的脚本;执行脚本时,需要添加
BUILD_ID=DONTKILLME,防止jenkins杀死启动的tomcat进程
https://segmentfault.com/a/1190000014325300
1.SSH Server Name 就是前面配置的Publish Over SSH 的名称
2.Source files 是指源文件位置,这个位置是在jenkins的工作目录下的job文件在内 ,
(/var/lib/jenkins/workspace/cicd_demo 默认路径 cicd_demo是我的job名称,maven 编译后会在此文件内创建 target 目录, cicd-demo*.jar是构建后jar包命名前缀+版本号
见pom.xml 中 artifactId )
3.Remove prefix 删除前缀 target
4.Remote directory 远程目录,结合前面Publish Over SSH配置就是 /root/test 目录,这些配置完毕以后, jenkins 在编译成功后,就会自动把 文件 copy 到 B主机下的/root/test
5.Exec command , 我这里的操作是吧 主机 /root/test 的文件 复制到 我自己的 /usr/local/project/cicd_demo下 然后进入到此目录,执行我的 buildimage.sh 和 run.sh
1.4.1 简单启动脚本
#!/bin/bash
/home/jdk1.8.0_192/bin/java -Xms256m -Xmx256m -Dserver.port=8811 -jar /home/jenkins/target/spring-boot-demo-0.0.1-SNAPSHOT.jar > log.file 2>&1 &
说明:启动命令需要指定jdk目录,不然启动报错
1.4.2 完整启动脚本(包含停止、备份、启动)
#!/bin/bash
DATE=$(date +%Y%m%d%H%M%S)
#java 环境变量
export JAVA_HOME PATH CLASSPATH
JAVA_HOME=/home/jdk1.8.0_192
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
file_path=/home/jenkins/target/
jar_path=/home/jenkins/home/workspace/spring-boot-demo/target
jar_name=spring-boot-demo-0.0.1-SNAPSHOT.jar
cd ${file_path}
#备份目录,先判断目录存不存在,不存在创建
if [ ! -d ${file_path}/backup ];then
mkdir -p backup
fi
#移动旧的jar包到备份目录
mv $jar_name backup/$jar_name-$DATE
#移动打包好的jar包到指定目录
cp ${jar_path}/${jar_name} ${file_path}
#查找是否存在服务进程,存在关闭
pid=`ps -ef | grep $jar_name | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
echo 'stop ... ...'
kill -9 $pid
fi
echo 'starting ... ...'
#启动
#/home/jdk1.8.0_192/bin/java -Xms256m -Xmx256m -Dserver.port=8811 -jar #$file_path/$jar_name > log.file 2>&1 &
java -Xms256m -Xmx256m -Dserver.port=8811 -jar $file_path/$jar_name > log.file 2>&1 &
说明:
Windows编辑好的shell文件,放到linux报“\r”错误,需要把文件转成unix格式,使用如下命令:
dos2unix restart.sh
执行脚本前,先赋予权限
chmod +x restart.sh
执行脚本
sh restart.sh
放到jenkins上:
BUILD_ID=DONTKILLME
cd /home/jenkins
sh restart.sh
1.5 参考资料
jenkins for SpringBoot:https://www.jianshu.com/p/a7d7df97fe4b
使用jenkins持续构建、部署SpringBoot项目:https://www.jianshu.com/p/92d1eec27477
Jenkins+github+maven自动构建发布SpringBoot项目:
https://blog.csdn.net/w105021/article/details/78657382
https://blog.csdn.net/u010704600/article/details/81984110
2. maven构建,docker容器里运行
2.1 Jenkins全局工具配置docker路径
Docker默认安装路径:/var/lib/docker
2.2 构建后远程连接启动脚本
clean package -Dmaven.test.skip=true
点击Add post-build step,选择 Send files or execute commands over SSH
Exec command里输入如下脚本:
cd /home/jenkins/home/workspace/spring-boot-demo-docker/src/main
cp -r docker/ /home/jenkins/target
cd /home/jenkins/home/workspace/spring-boot-demo-docker/target
cp spring-boot-demo-0.0.1-SNAPSHOT.jar /home/jenkins/target/docker
cd /home/jenkins/target/docker
docker build -t spring-boot-demo .
docker ps
docker stop spring-boot-demo
docker-compose -f docker-compose.yml up -d
脚本说明:赋值源码里docker文件夹,把打包后的jar包赋值到docker文件夹里,使用docker build打包docker镜像;停止已经运行的镜像,docker compose启动
3. Maven Docker构建工程
3.1 全局工具配置Docker路径
Docker默认安装路径:/var/lib/docker
3.2 安装Docker插件
系统管理>插件管理,点击可选插件,搜索以下插件安装:
Docker Compose Build Step Plugin
Docker plugin
docker-build-step
安装后:
3.3 配置Docker连接
系统管理>系统设置,找到新增云按钮,新增一个云,配置Docker链接,连接服务器Docker
点击Docker cloud details,配置服务器Docker地址
Docker Host URI :unix://var/run/docker.sock
说明:要在Jenkins连接Docker,需要把Docker路径挂载到Jenkins容器里,并且Jenkins容器以root用户启动,具体原因见4.4 Jenkins容器连接Docker报权限不够
- /var/run/docker.sock:/var/run/docker.sock
3.4 构建
步骤同1.2,构建命令有点区别,采用Docker构建镜像,命令如下:
clean package -Dmaven.test.skip=true docker:build
构建并推送镜像到仓库
clean package -Dmaven.test.skip=true docker:build -DpushImage
3.5 构建后启动
构建成功,选择Docker Compose Build Step
Docker compose file:docker compose启动文件路径
例如:
/home/jenkins/home/workspace/spring-boot-demo-docker1/target/docker/docker-compose.yml
Docker compose Command:选择Stop all services,停止Docker compose文件中的服务
Docker compose Command:选择Start all services,启动Docker compose文件中的服务
注意:要使用Docker compose启动服务,需要把Docker compose路径挂载到Jenkins容器中,用whereis docker-compose命令查找Docker Compose安装路径,挂载命令如下:
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
构建后成功会执行Docker compose启动命令
停止容器:
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') //停止容器
删除容器:
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }') //删除容器
删除none镜像命令:
docker rmi $(docker images | grep "none" | awk '{print $3}')
4. 常见问题
4.1 配置maven全局路径报错
用docker 镜像搭建了jenkins,全局配置 maven路径报错
/usr/local/maven/maven is not a directory on the Jenkins master (but perhaps it exists on some agents)
解决方式:
https://www.oschina.net/question/2416689_2283419
将宿主机中maven所在路径挂载到jenkins容器中,可以把容器里的路径配置成跟容器外一样的路径
- /your/maven_home:/usr/local/maven
version: "3.1"
services:
jenkins:
image: jenkins/jenkins
container_name: jenkins
restart: always
volumes:
- /home/jenkins/home:/var/jenkins_home
- /home/apache-maven-3.6.0:/usr/local/maven
- /home/jdk1.8.0_192:/docker-java-home
- /home/repository:/home/repository
- /home/jenkins:/home/jenkins
ports:
- "8082:8080"
- "8810:8810"
- "50000:50000"
全局工具配置,配置容器里maven路径,如下图:
4.2 构建报错:找不到JAR包
org.apache.maven.project.ProjectBuildingException: Some problems were encountered while processing the POMs:
[WARNING] 'parent.relativePath' points at com.example:spring-boot-demo instead of org.springframework.boot:spring-boot-starter-parent, please verify your project structure @ line 5, column 13
[FATAL] Non-resolvable parent POM: Could not transfer artifact org.springframework.boot:spring-boot-starter-parent:pom:2.1.2.RELEASE from/to central (http://repo.maven.apache.org/maven2): /home/repository/org/springframework/boot/spring-boot-starter-parent/2.1.2.RELEASE/spring-boot-starter-parent-2.1.2.RELEASE.pom.part.lock (No such file or directory) and 'parent.relativePath' points at wrong local POM @ line 5, column 13
解决方式:
由于Jenkins运行在Docker容器中,因此需要把maven的本地仓库映射到Jenkins容器里,在Jenkins Docker compose文件中添加如下映射:
- /home/repository:/home/repository
完整文件内容:
version: "3.1"
services:
jenkins:
image: jenkins/jenkins
container_name: jenkins
restart: always
user: root
volumes:
- /home/jenkins/home:/var/jenkins_home
- /home/apache-maven-3.6.0:/usr/local/maven
- /home/jdk1.8.0_192:/docker-java-home
- /home/repository:/home/repository
- /home/jenkins:/home/jenkins
- /var/lib/docker:/var/lib/docker
- /var/run/docker.sock:/var/run/docker.sock
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
ports:
- "8082:8080"
- "8810:8810"
- "50000:50000"
4.3 新建任务没有maven项目选项
https://blog.csdn.net/pucao_cug/article/details/52397285
如果没有“创建一个Maven 项目”的选项
需要安装Maven项目插件:Maven Integration
点击“可选插件” 然后在右边的过滤输入框中输入搜索关键字: Maven Integration 或者 Pipeline Maven Integration Plugin ,搜索到了以后,点击直接安装,安装完成后重启就好了。
4.4 Jenkins容器连接docker报权限不够
Docker安装的Jenkins容器,使用docker时,报权限不够,具体错误如下:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/info: dial unix /var/run/docker.sock: connect: permission denied
解决方式:
docker 安装的jenkins默认启动用户是jenkins
[root@localhost ~]# docker exec -it jenkins /bin/bash
jenkins@f8c7d6e53fd3:/$ whereis jenkins
jenkins: /usr/local/bin/jenkins.sh /usr/share/jenkins
jenkins@f8c7d6e53fd3:/$ whoami
jenkins
jenkins@f8c7d6e53fd3:/$ ls -l /var/run/docker.sock
srw-rw----. 1 root 995 0 Jan 24 01:56 /var/run/docker.sock
修改Jenkins启动yml,以root用户运行容器,脚本如下:
version: "3.1"
services:
jenkins:
image: jenkins/jenkins
container_name: jenkins
restart: always
user: root
volumes:
- /home/jenkins/home:/var/jenkins_home
- /home/apache-maven-3.6.0:/usr/local/maven
- /home/jdk1.8.0_192:/docker-java-home
- /home/repository:/home/repository
- /home/jenkins:/home/jenkins
- /var/lib/docker:/var/lib/docker
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "8082:8080"
- "8810:8810"
- "50000:50000"
重新启动容器:
docker-compose –f Jenkins.yml down
docker-compose –f Jenkins.yml up -d
[root@localhost jenkins]# docker exec -it jenkins /bin/bash
root@31401edcd7d4:/# whoami
root
root@31401edcd7d4:/# ls -l /var/run/docker.sock
srw-rw----. 1 root 995 0 Jan 24 01:56 /var/run/docker.sock
参考:https://www.jianshu.com/p/cf2920acf51a