Jenkins 自动部署

 

1. Jenkins maven构建工程

1.1 全局工具配置

maven配置、jdk路径

Jenkins 自动部署_第1张图片

 

Git配置:

Maven路径:

Jenkins 自动部署_第2张图片

 

gitlab token配置:

Jenkins 自动部署_第3张图片

从gitlab获取api token

Jenkins 自动部署_第4张图片

2.1 构建配置

     本文的jenkins是通过docker compose安装的,运行在docker容器中

  1. 创建新任务,选择构建一个maven项目

      Jenkins 自动部署_第5张图片

 

 2.从gitlab拉取源码

Jenkins 自动部署_第6张图片

 

 

输入gitlab项目地址,点击添加键,添加用户名、密码

Jenkins 自动部署_第7张图片

Jenkins 自动部署_第8张图片

可以选择添加子目录

3.构建触发器

Jenkins 自动部署_第9张图片

4.Build

Jenkins 自动部署_第10张图片

5.执行构建

Jenkins 自动部署_第11张图片

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 自动部署_第12张图片

Jenkins 自动部署_第13张图片

注意事项:

由于Jenkins是运行在Docker容器中的,所以构建后直接用脚本启动的应用,需要映射Docker容器端口,不映射访问不了,在Jenkins.yml文件中添加端口映射,示例如下:

ports:
-
"8082:8080"
- "8810:8810"
- "50000:50000"

 

1.4 SSH启动脚本

SSH远程启动,因为不是把应用运行在容器里,所以不需要映射应用端口

Post Steps 选择 Run only if build succeeds

Jenkins 自动部署_第14张图片

点击Add post-build step,选择 Send files or execute commands over SSH

Jenkins 自动部署_第15张图片

Jenkins 自动部署_第16张图片

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 SpringBoothttps://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

Jenkins 自动部署_第17张图片

 

 

2.2 构建后远程连接启动脚本 

 

Jenkins 自动部署_第18张图片

clean package -Dmaven.test.skip=true

 

点击Add post-build step,选择 Send files or execute commands over SSH

 

Jenkins 自动部署_第19张图片

 

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启动

Jenkins 自动部署_第20张图片

Jenkins 自动部署_第21张图片

3. Maven Docker构建工程

3.1 全局工具配置Docker路径

Docker默认安装路径:/var/lib/docker

Jenkins 自动部署_第22张图片

3.2 安装Docker插件

系统管理>插件管理,点击可选插件,搜索以下插件安装:

Docker Compose Build Step Plugin

Docker plugin

docker-build-step

Jenkins 自动部署_第23张图片

 

安装后:

Jenkins 自动部署_第24张图片

 

 

 

3.3 配置Docker连接

 

系统管理>系统设置,找到新增云按钮,新增一个云,配置Docker链接,连接服务器Docker

 

Jenkins 自动部署_第25张图片

点击Docker cloud details,配置服务器Docker地址

Docker Host URI :unix://var/run/docker.sock

 

Jenkins 自动部署_第26张图片

说明:要在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

Jenkins 自动部署_第27张图片

构建并推送镜像到仓库

clean package -Dmaven.test.skip=true docker:build -DpushImage 

3.5 构建后启动

构建成功,选择Docker Compose Build Step

Jenkins 自动部署_第28张图片

Jenkins 自动部署_第29张图片

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启动命令

Jenkins 自动部署_第30张图片

停止容器:
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)


Jenkins 自动部署_第31张图片

 

解决方式:

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路径,如下图:

Jenkins 自动部署_第32张图片

 

 

 

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

https://img-blog.csdn.net/20160901110310665?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

点击“可选插件”  然后在右边的过滤输入框中输入搜索关键字: Maven Integration 或者 Pipeline Maven Integration Plugin ,搜索到了以后,点击直接安装,安装完成后重启就好了。

https://img-blog.csdn.net/20160901110414135?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

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 自动部署_第33张图片

修改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

你可能感兴趣的:(docker,maven)