jar包部署,jenkins集成java

java项目的部署方式

目前市场上,部署java web的方式,主要有俩方案

1. 开发交付给运维的是一个(*.war) zip类型的压缩包,这个压缩包里包含了网站的thml,配置文件,以及java代码,运维只需要提供应用容器(tomcat)即可发布这个java网站。(集团型的中大型公司,用该方案)

2. 目前互联网公司以devops开发模式,快速迭代模型,并且java后端诞生spring Boot框架,最终开发交付的产物是(*.jar)也是zip类型的压缩包,且springboot该框架内置了应用容器(tomcat),最终运维只需要(jar -jar *.jar)即可运行java网站

war和jar部署区别

1. 运维拿到了war包,需要安装tomcat,将war包放入tomcat的webapps目录,该压缩包自动解压缩,然后即可访问

2.运维拿到了jar包,无须自己部署tomcat,直接jar -jar *.jar运行项目进程即可

3. 运维需要自己打包java源码,生成jar包
- 进入项目根目录,执行maven打包命令,maven命令是java项目的编译打包工具
- maven命令自动读取pom.xml配置文件,安装依赖关系
- 在项目根目录下执行命令:mvn clean install,会在项目根目录的target目录下生成一个jar文件
- 接着输入命令:java -jar target\springboot-0.0.1-SNAPSHOT.jar

jar包的玩法一,没有jar包,只有源码目录,用maven对源码进行打包-----------------------------------

# 1.安装maven工具
yum install maven -y

[root@db-51 /opt/springboot-test]#mvn -version
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_332, vendor: Red Hat, Inc.
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"
[root@db-51 /opt/springboot-test]#



# 2. 下载java源码
git clone https://gitee.com/yuco/springboot-test.git

#3. 进入源码目录,

[root@db-51 /opt/springboot-test]#ll
total 28
-rw-r--r-- 1 root root 9114 Feb 25 09:33 mvnw
-rw-r--r-- 1 root root 5811 Feb 25 09:33 mvnw.cmd
-rw-r--r-- 1 root root 2134 Feb 25 09:33 pom.xml
drwxr-xr-x 4 root root   30 Feb 25 09:33 src
-rw-r--r-- 1 root root  643 Feb 25 09:33 项目说明.text

# 找到maven的配置文件目录,yum安装的,默认都在etc目录下,换成阿里云的仓库
/etc/maven/settings.xml 
修改如下
   <mirror>
           <id>alimaven</id>
           <mirrorOf>central</mirrorOf>
           <name>aliyun maven</name>
           <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
       </mirror>

# 4.先打包,生成jar包,maven自动下载项目的依赖
[root@db-51 /opt/springboot-test]#mvn clean package
期望结果如下
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:14.183s
[INFO] Finished at: Fri Feb 25 09:47:31 CST 2022
[INFO] Final Memory: 32M/203M
[INFO] ------------------------------------------------------------------------

# 5.进入 target目录, 启动,运行打包的jar包,查看进程
java -jar springboot-helloword-1.jar

# 客户端访问,具体的url,要开发给你写好文档,否则你不一定知道访问啥

# 查看如果修改了源码,如何更新的逻辑?
# 运维要理解,源码编译为jar包,后续的源码更新,要再次打包

jar包的玩法二,直接发给你了一个 *.jar包,运维需安装java,运行jar包就完事

1.安装jdk

1. 可以oracle官网下载
http://www.oracle.com/technetwork/java/javase/downloads/index.html

2. 用准备好的包,解压
jdk-8u221-linux-x64.tar.gz


3. 配置jdk的环境变量,java会要求生成2特殊变量

JAVA_HOME jdk的家目录
CLASSPATH  java程序的类库目录路径,相对于JAVA_HOME而言的


[root@tomcat-10 /opt]#ll
total 199440
-rw-r--r-- 1 root root   9128610 Jul 16 15:21 apache-tomcat-8.0.27.tar.gz
drwxr-xr-x 7   10  143       245 Jul  4  2019 jdk1.8.0_221
-rw-r--r-- 1 root root 195094741 Jul 16 15:21 jdk-8u221-linux-x64.tar.gz


配置软连接
[root@tomcat-10 /opt]#ln -s  /opt/jdk1.8.0_221/  /opt/jdk8 
[root@tomcat-10 /opt]#
[root@tomcat-10 /opt]#
[root@tomcat-10 /opt]#ll
total 199440
-rw-r--r-- 1 root root   9128610 Jul 16 15:21 apache-tomcat-8.0.27.tar.gz
drwxr-xr-x 7   10  143       245 Jul  4  2019 jdk1.8.0_221
lrwxrwxrwx 1 root root        18 Jul 26 10:49 jdk8 -> /opt/jdk1.8.0_221/
-rw-r--r-- 1 root root 195094741 Jul 16 15:21 jdk-8u221-linux-x64.tar.gz


# 加入如下PATH设置

sed -i.ori '$a export JAVA_HOME=/opt/jdk8\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile



4. 检查java环境
[root@tomcat-10 /opt]#java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

二运行jar包,访问url

java -jar halo-1.1.0.jar 

jenkins部署Java项目,jar包---------------------------------------------------

项目架构

构建流水线

# 运维,通过搭建java项目的构建流水线
#  1.  gitlab 拉去java项目源码
# 2. jenkens环节,进行源码编译,打包生成 jar包
# 3. jenkins把这些jar包发到目标服务器上(web7,web8两台机器)
# 4. 分别再2机器,运行jar包就完事

构建服务器环境检查

1 java环境

[root@jenkins-100 ~]#java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

2 maven环境

[root@jenkins-100 ~]#mvn -version
-bash: mvn: command not found

准备好的maven rpm包安装

#准备好安装包,解压缩,配置PATH变量
[root@jenkins-100 /opt/maven339/apache-maven-3.3.9/bin]#ll /opt/maven339/apache-maven-3.3.9-bin.tar.gz 
-rw-r--r-- 1 root root 8491533 Jul 14 12:01 /opt/maven339/apache-maven-3.3.9-bin.tar.gz

[root@jenkins-100 /opt/maven339/apache-maven-3.3.9/bin]#tail -2 /etc/profile
export PATH=$PATH:/opt/mysql5.7.28/bin/:/opt/sonarqube-all/sonar-scanner-4.0.0.1744-linux/bin:/opt/maven339/apache-maven-3.3.9/bin:/opt/node/bin

# 查看mvn命令的环境
[root@jenkins-100 ~]#mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /opt/maven339/apache-maven-3.3.9
Java version: 1.8.0_181, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_181-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"

3 部署maven

修改maven打包工具的 依赖源地址,改为阿里云的
# 注意如何找maven的家目录

[root@jenkins-100 ~]#mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /opt/maven339/apache-maven-3.3.9
Java version: 1.8.0_181, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_181-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"


# 找到maven工具的家目录,配置文件
ls  /opt/maven339/apache-maven-3.3.9
 
146   <mirrors>
147     <!-- mirror
148      | Specifies a repository mirror site to use instead of a given repository. The repository that
149      | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
150      | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
151      |
152     <mirror>
153       <id>mirrorId</id>
154       <mirrorOf>repositoryId</mirrorOf>
155       <name>Human Readable Name for this Mirror.</name>
156       <url>http://my.repository.com/repo/path</url>
157     </mirror>
158      -->
159    <!-- 阿里云仓库 -->
160        <mirror>
161            <id>alimaven</id>
162            <mirrorOf>central</mirrorOf>
163            <name>aliyun maven</name>
164            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
165        </mirror>
166   </mirrors>
167 

jenkins检查

有很多插件默认就已经安装了,需要我们安装的并不多。

需要安装插件如下:

Git plugin
Maven Integration plugin
Publish Over SSH
DingTalk Plugin
从系统管理>插件管理>可选插件>搜索插件>勾选安装,点击直接安装即可

https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/publish-over-ssh/1.19/publish-over-ssh.hpi

这个ssh插件,版本问题直接下载不了,下载低版本然后导入即可


配置jenkins支持maven

配置jdk

配置maven

配置ssh,远程连接机器

需要jenkins额外安装 publish over ssh
远程ssh免密登录的插件

systemctl restart jenkins
重启后,配置ssh的免密登录

jenkins机器,发布jar包到web7 web8机器


先免密登录

[root@jenkins-100 ~]#ssh-copy-id root@10.0.0.7
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed


/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
		(if you think this is a mistake, you may want to use -f option)

[root@jenkins-100 ~]#
[root@jenkins-100 ~]#ssh-copy-id root@10.0.0.8
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
		(if you think this is a mistake, you may want to use -f option)


[root@jenkins-100 ~]#ssh root@10.0.0.7 "hostname"
web-7
[root@jenkins-100 ~]#ssh root@10.0.0.8 "hostname"
web-8



# 拿着jenkisn的私钥做验证

# 设置文件发到目标机器的,/opt/jenkins-sh/目录,得先创建

#先jenkins机器,进行远程检查

给jenkins配置 ssh插件的私钥即可

配置解释
公共配置:
Passphrase:不用设置
Path to keykey文件(私钥)的路径
Key:将私钥复制到这个框中
Hostname:需要连接ssh的主机名或ip地址(建议ip)
Username:用户名
Remote Directory: ssh服务,连接到目标机器的哪个目录
Name:随意起名代表这个服务,待会要根据它来选择

Author : www.xxx.cn

高级配置:
Disable exec:禁止运行命令,这个不要勾选,否则没法执行命令
Use password authentication, or use a different key:可以替换公共配置(选中展开的就是公共配置的东西,这样做扩展性很好)
Port:端口(默认22)
Timeout (ms):超时时间(毫秒)默认即可

配置完成后Test Configuration下,提示success的话就没问题。

至此,可以实现jenkins发文件目标机器 web7 web8的/opt/jenkins-sh/文件夹了

创建Jenkins任务


勾选丢弃旧的构建

git源码管理

这里直接用的导入源码

新建gitlab仓库
导入该码云的仓库即可
https://gitee.com/yuco/springboot-test.git


jenkins设置

构建触发器webhook设置




找到gitlab的代码仓库,集成jenkins的push事件

构建环境设置

最后一步动作,给jenkins的job,添加mvn的构建参数
实现java源码拉去
执行mvn命令
具体对源码的编译参数,还未设置

填入mvn的构建参数
clean install -Dmaven.test.skip=true

都是在当前job工作去下的 target目录中,得到jar包

将jar包发送给目标机器

这里的配置是jenkins 远程执行,远程机器上的一个脚本

Source files配置:arget/person-0.0.1-SNAPSHOT.jar 项目jar包名
Remove prefix:target/
Remote directory:Jenkins-in/ 应用服务器的发送目录地址
Exec command:Jenkins-in/build.sh 应用服务器对应的shell脚本

最后去
web7 web8 ,设置运行java程序的脚本

/opt/jenkins-sh/deploy-java.sh

钉钉设置

构建结果,写入到钉钉,发个通知,实际运用的效果


部署脚本开发

再web7  和 web8机器准备

mkdir -p /opt/jenkins-sh/

cat > /opt/jenkins-sh/deploy-java.sh << 'EOF'
#!/bin/bash

#格式化时间,年月日
DATE=$(date +%Y%m%d)

#设置程序目录,设置一个java项目的备份目录,因为会多次构建
# 希望保留之前的旧的版本,而不是直接覆盖

# 这个 web7 ,web8的用于,保存jar包的目录
DIR=/usr/local/app

#设置Jar名称,也就是jenkins构建maven build后的产物
# 填入你的java程序,打包后的文件名

JARFILE=springboot-helloword-1.jar



#判断是否存在backp目录,如果不存储就创建
# 如果备份目录不存在,则创建
# 再代码目录下,创建一个backup文件夹
# 旧的jar包,会放入 /usr/local/app/backup目录

if [ ! -d $DIR/backup ];then
   mkdir -p $DIR/backup
fi

# 进入到web7,或 web8的 jar包,发布目录
cd $DIR

#杀掉当前运行的旧程序
# 干掉旧的java程序
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs -i kill -9 {}

#备份旧程序
# 移动当前的jar文件 到 backup目录下,且加上时间

mv $JARFILE $DIR/backup/$JARFILE$DATE


#部署新程序
# 将jenkins发来的jar包,放入 当前的 jar包发布目录 /usr/local/app

mv -f /opt/jenkins-sh/target/$JARFILE .


# 至此就实现了,旧的jar包,放入了 /usr/local/app/bakcup/
# 新的jar包,/usr/local/app

# 然后可以启动新程序了

echo "The service will be starting"

#后台启动程序并设置Jvm参数、开启JMX、打印GC日志
# java  -jar  springboot-helloword-1.jar

# 到这,等于实现,发布脚本,实现了更新进程,备份旧得jar包
# 启动 新的进程
# 听懂111111,课下自己手写,这个代码


# 给大家模拟 一个生产环境下,会有很多的优化参数

java -server -Xms1024M -Xmx1024M -XX:PermSize=256M \
-XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails \
-Xloggc:./gc.log \
-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 \
-Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dserver.address=0.0.0.0 -Dserver.port=18888 \
-jar $JARFILE  --spring.profiles.active=dev > /nohup 2>&1>out.log &

# 如果上述java启动jar包命令,正确的话,等待30秒,查看运行日志

if [ $? = 0 ];then
        sleep 30
        tail -n 50 out.log
fi

# 进入备份目录,删除旧数据
# 此时再 /usr/local/app/

cd backup/

# 清理旧的jar包,保留有5个旧版本的备份

# 基于 ls -lt的参数,基于时间对文件排序
# 备份的jar文件超过5个了,删除最旧的那个文件
# 可以多次构建,查看脚本的执行结果

ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf

echo "starting success!!!"
EOF

给脚本加上执行权限
chmod +x /opt/jenkins-sh/deploy-java.sh

点击立即构建
测试触发push钩子

排bug 拍地雷

地雷1,jenkins的ssh远程执行脚本参数错误
错误在于,jenkins想远程执行脚本,发现脚本路径找不到,相对路径

地雷2,远程机器,执行脚本,缺少java环境

web7

web8 装java环境

posted @   不太聪明的大鹅  阅读(283)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示