背景:
实现设想:
要创建自动化发布,需要准备一台测试服务器提前安装好java运行所需的环境,JDK版本最好和Windows开发机器上的版本一致,在Jenkins上配置将构建好的jar上传到测试服务器上,测试服务器自动启动构建好的jar,这些步骤只需要在Jenkins完成相关的配置即可。
一、环境准备
1、在测试机器上安装java运行环境
#解压
tar -zxvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.8.1_1.tar.gz
#配置环境变量
vim /etc/bashrc
#在文件末尾追加
JAVA_HOME=/opt/devops/java
export PATH=${JAVA_HOME}/bin:${PATH}
2、创建测试用户
#创建用户用于代码测试,指定家目录为/opt/devops/test
useradd -m test -d /opt/devops/test
#设置test用户密码等会Jenkins的SSH认证需要用到
passwd test
二、将IDEA代码提交到GitLab并在Jenkins上创建maven项目
步骤一:将IDEA上的代码提交到GitLab上
参考:
步骤二:配置Maven连接GitLab并构建jar
参考:
CI/CD—Jenkins配置Maven+GitLab自动构建jar包-CSDN博客
二、Jenkins上进行操作
1、在Jenkins上安装Publish Over SSH插件用于SSH认证
选择如下图示点击安装即可
2、 配置Publish Over SSH插件连接测试机器
2.1、选择系统管理 --> 系统配置
2.2、填写连接测试机器的信息
3、Post Steps设置
3.1、点击之前的构建的项目
3.2、选择Send files or execute commands over SSH选项
3.3、配置将Jenkins上生成的jar上传到测试服务器上的相关选项
如下正则匹配:匹配Jenkins构建生成家目录下target目录下的jar包
4、执行构建测试查看Jenkins下发的原理方便后续的配置
4.1、执行构建
4.2、观察传到测试服务器上jar包的目录结构
可以看到数据传上去之后还带有HelloWorld/target前缀,我们想要的结构就是将jar直接传到测试服务器家目录下不带有HelloWorld/target目录,如需要实现按照如下操作进行。
5、实现指定家目录、去掉Jenkins前缀、自动启动jar包的步骤
5.1、在Remove prefix中填写需要去掉的目录前缀
5.2、在Remote directory中填写Source files中配置的内容传输到家目录的具体哪个目录下
在Remote directory中填写java;表示将**/target/*.jar包传到/opt/devops/test/java目录下
6、Exec command配置测试服务器上执行的命令
#启动jar,因为jar包的版本会变所以使用通配符进行匹配
java -jar /opt/devops/test/java/*.jar >> /opt/devops/test/java/logs/java.log &
7、测试服务器上查看Jenkins自动化发布的结果
7.1、查看前缀是否已经去掉
7.2、查看jar是否传送到/opt/devops/test/java目录下
7.3、查看命令行是否已经执行
7.4、对前端内容进行访问测试
在浏览器上输入:http://192.168.72.132:8989/hello,对前端进行验证
三、Jenkins调用测试服务器上的脚本执行复杂的任务
背景: 对jar进行构建前,测试机器上可能还运行着之前程序的进程或者有一些需要其他交互的场景,所以在进行构建之前应该要先将这些运行的进程等运行处理,再进行构建部署操作这样就确保了测试环境的稳定,在进行构建时也减少了因为环境问题导致自动发布失败等问题。
1、测试服务器上编写java服务启动脚本
#!/bin/bash
TIME=$(date +"%Y-%m-%d %H:%M:%S")
JAVA_PATH=/opt/devops/test/java
JAVA_LOG=${JAVA_PATH}/logs/java.log
JavaStart ()
{
echo "
>>>>>>>>>>>>>>>>>Java Starting:${TIME}<<<<<<<<<<<<<<<<<<<
" >> ${JAVA_LOG}
PID_NUM=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|awk '{print $2}'|wc -l)
if [ ${PID_NUM} -gt 0 ];then
PID=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|awk '{print $2}')
echo "[WARING] 已经存在JAVA进程$PID,退出本次操作!!"
echo "
[WARING] 已经存在JAVA进程:$PID,退出本次操作!!
" >> ${JAVA_LOG}
exit
else
java -jar ${JAVA_PATH}/*.jar >>${JAVA_LOG} 2>>${JAVA_LOG} &
sleep 3
PID_NUM=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|awk '{print $2}')
if [ ${PID_NUM} -eq 0 ];then
echo "[ERROR] JAVA Fail To Start!!!"
echo "
[ERROR] JAVA Fail To Start!!!
" >> ${JAVA_LOG}
else
PID=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|awk '{print $2}')
echo "[INFO] JAVA-PID:${PID} Successfully Runing!!!"
echo "[INFO] JAVA-PID:${PID} Successfully Runing!!!" >> ${JAVA_LOG}
fi
fi
}
JavaStart
情况一:程序已经运行,执行此脚本会退出不再执启动命令,并将输出结果打印到日志中
情况二:java启动命令已经执行但是服务进程不存在启动失败
情况三:Java服务正常启动
2、测试服务器上编写java服务停止脚本
#!/bin/bash
TIME=$(date +"%Y-%m-%d %H:%M:%S")
JAVA_PATH=/opt/devops/test/java
JAVA_LOG=${JAVA_PATH}/logs/java.log
Main ()
{
PID_NUM=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|wc -l)
if [ ${PID_NUM} -gt 0 ];then
PID_NUM=$(ps -ef|grep ${JAVA_PATH}/*.jar|grep java|grep -v grep|awk '{print $2}')
kill -9 ${PID_NUM}
echo "[INFO] JAVA-PID:${PID_NUM} Java Has Been Stopped!!!"
if [ $? -eq 0 ];then
echo "
>>>>>>>>>>>>>>>>>Java Has Been Stopped:${TIME}<<<<<<<<<<<<<<<<<<<
" >> ${JAVA_LOG}
fi
fi
}
Main
3、在Pre Steps中添加服务停止脚本
4、在Post Steps里也添加执行启动脚本的命令
5、测试结果
自动发布连接超时解决方法
Publish over SSH超时机制
连接超时可能是因为脚本或者文件在传送 过程中运行超时