Jenkins 部署 Java 项目

一、Java项目部署基本概述

为什么Java项目需要编译?
由于Java编写的代码是无法直接在服务器上运行,需要使用maven工具进行打包。
简单理解:Java源代码就像汽车的一堆散件,必须组装才是一辆完整的汽车。这里的组装汽车可以理解为maven编译的过程。

1、手动部署Java项目至web集群

1、搭建Nginx+Tomcat集群架构
2、开发提交Java源代码至gitlab仓库
3、手动获取Java源代码,然后使用maven进行编译
4、将编译后的war/jar包部署至Tomcat集群
5、最后通过浏览器访问测试,检测项目是否部署OK

源码->提交到gitlab(git仓库)->使用mvn手动构建->最后推送war至Tomcat。(一个完整的发布流程)

2、自动部署Java项目至Web集群

1、Jenkins安装Maven插件,使其支持Maven项目创建
2、Jenkins配置JDK路径以及Maven路径
3、Jenkins创建maven项目,然后进行构建
4、编写自动上线脚本推送至web集群,最后通过浏览器访问。
5、优化部署脚本,使其支持上线与回滚功能
6、项目相同版本可以重复构建,如果处理该问题。

二、Jenkins集成maven

在系统管理-> 插件管理,安装 Maven Integration plugin 插件:

file

可用插件,搜索 Maven In :
file

我已经安装过了,可以在已安装插件中看到:
file

三、新建任务

1、在Jenkins控制台新建任务

在Jenkins控制台新建任务,选择maven构建:
file

在构建空间,选择丢弃旧的构建,并且最大保留10个构建:
file

2、源码管理

源码管理选择git,并且以 ssh 的方式拉取代码:

git@gitee.com:kaiyi/springcloud.git

file

这里需要添加远程仓库的授权,所以,需要在Jenkins部署的服务器生产一个公钥 sshkey,然后把公钥配置在代码服务器gitee上。

bash-5.0$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/jenkins_home/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/jenkins_home/.ssh/id_rsa
Your public key has been saved in /var/jenkins_home/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:5/PwphKwMJNwdF+52325qPMvJDOH9R8lQWJVAam1R84 jenkins@761c9a4015a7
The key's randomart image is:
+---[RSA 3072]----+
|   .. .   ..o+=oo|
|  . .. . ... +.. |
|   o .  .  .o =. |
|    = .   .. o.E.|
|     + oS .oo.o.o|
|      . .o.=.o.+.|
|         .+ * ..+|
|        .  *.o ..|
|         ..+*.o. |
+----[SHA256]-----+

获取生成的公钥:

bash-5.0$ cat /var/jenkins_home/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCsn134tZiQfYrTEIju88MXrY/3Z11D6Ryfy/hIttZyMR0UQvyJV47SDsB9T7M1XtTgBxNSoLA3bhNDnKOLEA8skq4HG1mAUu3OyH4axVkUo/gximrzQzjda2e06HZCoVf1SZHdygj4P28/+Q71hTMlwvwVebQxalwUnnmb9ukk8HSHTF0roRoP2Uzc2F3Gf13qbliwvyl4WsCXZ+3dUPxi4bnJGTXzl0RI3ZTlfsj/M57olCC8JLYueBKk9AAPc4RwYgfO7E4az9IZEqgWiCwTfHQ6whXsB7Bn/oDydzupxeOCfI4qpp3VdG49W/BLMEJ6oYQ3yUmfTWOSF8VBGYepy1GfniVh62La+ksK1HaRSVXK7Tx6XVPp2AJ1xz8eqRX09Xy188gXX14yLORUG8afwhJUUQoNqFLtVgAA1BcnLbAYPkl0mJDEGynnqQNPBuCBk14FAL3gANVt7wEryntDQbUqCQhj8kmnJ0igzTmpI0JUAX5V+P2v+4z8BViHfUM= jenkins@761c9a4015a7
bash-5.0$

在gitee(github)设置公钥:
file

在Jenkins设置私钥:
点击添加:
file

在Jenkins服务器上查看刚才生成的私钥:

bash-5.0$ cat /var/jenkins_home/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
bash-5.0$

添加私钥:
file

然后点击添加,在选择Credentials,发现就没有报错了:
file

3、全局工具配置JDK和maven

jdk设置

由于我们的Jenkins是用docker创建的,所以,默认已经安装好了JDK,使用下边的命令找到Jenkins服务器的JDK路径:

 echo $JAVA_HOME
/opt/java/openjdk

file

点进去,进行全局配置设置:
file

maven设置

maven环境安装,可以选择自动安装,也可以自己手动下载好后将maven安装在Jenkins部署的服务器上,这里为了方便,选择自动安装:

file

选择 3.6.1 版本,设置好之后保存。

4、build构建设置

package -Dmaven.test.skip=true
# clean install  # 或者可以这样设置打包

file

将工程中所有目录、文件封装到一个压缩包中,Java工程:jar包;Web工程:war包。(打包成jar包或者war包由pom文件中标签决定)

这一步的动作是maven如何与jekins集成。

5、构建项目

然后点击立即构建项目,我们可以通过控制台看到构建详细日志:
file

控制台输出打印:
file

构建好之后,可以在工作空间看到代码:
file

第一次构建可能耗时比较长,因为需要下载一些相关依赖jar包

6、shell脚本

Jenkins启动成功之后执行shll脚本

#!/bin/bash

#服务名称
SERVER_NAME=springboot

# 源jar路径,mvn打包完成之后,target目录下的jar包名称,也可选择成为war包,war包可移动到Tomcat的webapps目录下运行,这里使用jar包,用java -jar 命令执行  

JAR_NAME=springboot-0.0.1-SNAPSHOT

# 源jar路径  
#/usr/local/jenkins_home/workspace--->jenkins 工作目录

#demo 项目目录
#target 打包生成jar包的目录

JAR_PATH=/var/jenkins_home/workspace/springboot/target

# 打包完成之后,把jar包移动到运行jar包的目录--->work_daemon,work_daemon这个目录需要自己提前创建
JAR_WORK_PATH=/var/jenkins_home/workspace/springboot/target

echo "查询进程id-->$SERVER_NAME"

PID=`ps -ef | grep "$SERVER_NAME" | awk '{print $2}'`

echo "得到进程ID:$PID"

echo "结束进程"

for id in $PID

do

kill -9 $id  

echo "killed $id"  

done

echo "结束进程完成"

#复制jar包到执行目录

echo "复制jar包到执行目录:cp $JAR_PATH/$JAR_NAME.jar $JAR_WORK_PATH"

cp $JAR_PATH/$JAR_NAME.jar $JAR_WORK_PATH

echo "复制jar包完成"

cd $JAR_WORK_PATH

#修改文件权限

chmod 755 $JAR_NAME.jar

Nohub  java -jar $JAR_NAME.jar

nohub 指的是后台运行,或者使用nohub &

为者常成,行者常至