前面我们介绍过:
Jenkins保姆笔记(1)——基于Java8的Jenkins安装部署
Jenkins保姆笔记(2)——基于Java8的Jenkins插件安装
本篇主要介绍基于Java8的Jenkins第一个Hello World项目,一起实践下Jenkins拉取Git代码、编译、打包、多服务器发布的过程。涉及坑和面都较多,步骤图片有多,可以说是干货满满,希望大家能因此学会Jenkins。
S1:新建项目
工作台-新建Item,如图
取个任务名称,就可以“确定”下一步了。
S2:检查插件
新建好项目后,会看到项目构建的一些相关配置。
我们不急操作,先从上到下浏览下,看有没有红色字体的提示,然后就缺啥补啥。
如果前面插件安装完整的话,这一步是不会有啥提示的。果不其然,提示我Maven有问题。
这里是说Jenkins找不到Maven,毕竟等会需要Maven干活的不是?
那么提示Jenkins needs to know where your Maven is installed.是否需要另外去服务器安装Maven呢?答案是不需要,Jenkins会帮我们自动安装的。
根据他的提示,我们点击他给的连接“the tool configuration”。进去后发现其实就是控制台——Manage Jenkins——Global Tool Configuration菜单。翻到底部
选择“新增 Maven”,写个即将新增的maven的名称,务必选择好合适的版本,我的spring boot项目的maven用了3.8.1,所以这里也选了3.8.1。
勾选“自动安装”,点击“保存”。回到刚才的项目构建的页面,发现Build的地方没有了之前Jenkins找不到maven的红色字体的警告了。
再看看还有没有其他的没有红字提示,还是按照刚才说的一步步来。大部分自动安装就行了。
S3:项目构建
一个Jenkins的项目构建过程的参数及选择项非常多,我们不一一介绍,只说下里面核心必备的一些配置。
源码管理
我们源码管理用的是Git,如果你用了SVN等也行,在开始装插件的时候,去装SVN的就行。
这里我们也需要有个3小步骤:
1,添加git地址和账号权限
选择“添加”-Jenkins就是添加git的账号权限
在我们输入完账号密码回头看,发现不对劲了,怎么又出现红色字体的警告了啊?
错误提示:
无法连接仓库:Error performing git command: git ls-remote -h
看意思是连接不上git服务器?排除防火墙问题后,我们首先考虑还是插件安装问题。
2,安装Git
尽管Jenkins有一些插件可以简化与Git的集成(如Git Plugin),但这些插件仍然依赖于服务器上的Git客户端来执行实际的Git命令。如果Jenkins服务器上没有安装Git,那么即使你安装了Git插件,Jenkins也无法成功执行Git操作,如克隆(clone)、拉取(pull)或推送(push)代码。
因此,如果你的Jenkins项目无法连接远程Git服务器并拉取项目代码,你首先应该检查Jenkins服务器上是否已经安装了Git。你可以通过以下命令来检查Git是否已安装:
git --version
如果系统提示Git未找到或未安装,则你需要使用包管理器(如yum、apt-get等)来安装Git。对于使用yum的CentOS系统,你可以使用以下命令来安装Git:
sudo yum -y install git
安装完成后,再次尝试配置你的Jenkins项目以连接Git服务器,发现还是红色依旧,不要气馁,还有一步。
3,修改Git路径
到之前我们修改Maven配置的那个菜单,也即是控制台——Manage Jenkins——Global Tool Configuration菜单,中间部分的Git栏目,发现也有红色提示:
提示:There's no such executable git in PATH: /usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin.
我们需要把这里的路径PATH修改成服务器中的Git安装目录。
找下服务中Git的安装目录:
which git
输出:
/usr/bin/git
我们就把这个路径拷贝到上图的PATH里面
保存,刷新,回到项目构建页面,发现什么了?红色提示没了。
基本上配置完Git,下面就可以不配置了。检查下还有没有其他红色提示,没有的话,我们试着“立即构建”看看效果。
修改pom.xml的路径
这里卖个关子,因为毕竟我们是以第一次构建Jenkins项目的小白视角,并不知道这里的路径要修改。我们将在S4里介绍pom.xml的路径修改。
S4:构建项目
试着构建看看:
很可惜,第一次构建前面出现了红色的X,代表失败了。不着急,点击#1,进去看看错误详情。
ERROR: No such file /var/lib/jenkins/workspace/First Job/pom.xml
Perhaps you need to specify the correct POM file path in the project configuration?
Finished: FAILURE
原来是找不到我们spring boot项目的pom路径。我们到实际路径下去看,发现在/var/lib/jenkins/workspace目录下,已经下载好了我的项目hello world了。
所以回到项目构建里,查看pom的位置,
在Jenkins拉取了Git的代码到本地后,他发现自己找不到spring boot项目的pom.xml文件了,也就没有办法进行编译和打包。
刚才我们也去服务看了,pom并不在workspace的根目录下,而在根目录/helloworld(我项目包名)/下,所以这里我们修改Root POM路径为helloworld/pom.xml,这里的helloworld改成你们的项目包名。
除了修改pom的路径,这里的Goals and options我们也可以加一些辅助的命令:
clean package -Dmaven.test.skip=true -U
用来在编译时做写清理、更新maven以及跳过测试代码的操作。
保存,发现ok了吧,好,我们保存构建配置后,再去“立即构建”看看 。
这次发现构建时间有点久,告诉你,不要着急,这可能是积极的信号,因为maven首次成功使用要down好多包的,有点费时。
果不其然,不一会,我们第二次构建成功了。
S5:启动项目
既然构建成功了,启动项目无非有2种,一种是Jenkins在构建后自动给他启动,另一种是jar包都给你打包放在服务器了,你自己去手动启动也行。
Jenkins启动脚本
在项目构建的Post Steps阶段,
新增shell命令:
#!/bin/bash
# 定义变量
JAR_PATH="$WORKSPACE/helloworld/target" # JAR 文件所在的目录
JAR_FILE="helloworld-0.0.1-SNAPSHOT.jar" # JAR 文件名
TARGET_DIR="/root/project/helloworld" # 目标目录,请确保您有足够的权限写入此目录
TARGET_JAR_PATH="$TARGET_DIR/$(basename "$JAR_FILE")" # 目标目录中的JAR文件完整路径
# 检查目标目录是否存在,如果不存在则创建它
if [ ! -d "$TARGET_DIR" ]; then
mkdir -p "$TARGET_DIR"
echo "Target directory $TARGET_DIR created."
fi
# 查找并杀死已经运行的JAR文件进程(在目标目录中的JAR文件)
echo "Stopping existing service (if any) in target directory..."
pid=$(ps -ef | grep "java -jar $TARGET_JAR_PATH" | grep -v grep | awk '{print $2}')
if [ -n "$pid" ]; then
kill -9 $pid
echo "Killed existing process $pid"
else
echo "No existing process to kill in target directory"
fi
# 检查新的JAR文件是否存在
if [ -f "$JAR_PATH/$JAR_FILE" ]; then
echo "File exists: $JAR_PATH/$JAR_FILE"
# 复制JAR文件到目标目录
cp "$JAR_PATH/$JAR_FILE" "$TARGET_JAR_PATH"
if [ $? -eq 0 ]; then
echo "JAR file copied to $TARGET_JAR_PATH successfully."
# 启动新的JAR服务
echo "Starting new Java service from target directory..."
BUILD_ID=dontKillMe
nohup java -jar "$TARGET_JAR_PATH" > "$TARGET_DIR/output.log" 2>&1 &
sleep 3 # 等待服务启动(如果需要的话)
# 再次检查服务是否启动(可选)
pid=$(ps -ef | grep "java -jar $TARGET_JAR_PATH" | grep -v grep | awk '{print $2}')
if [ -n "$pid" ]; then
echo "New service process $pid started in target directory"
#sleep 30
else
echo "Failed to start new service in target directory"
fi
else
echo "Failed to copy JAR file to $TARGET_JAR_PATH."
exit 1
fi
else
echo "File does not exist: $JAR_PATH/$JAR_FILE"
exit 1 # 文件不存在时退出脚本,通常是一个错误情况
fi
exit 0
这样可以在Jenkins打包后立刻启动项目jar服务。
里面注意有一段BUILD_ID=dontKillMe要加,否则会出现错误:Process leaked file descriptors……伴随的现象是jar程序启动后又停止。那是因为Jenkins默认会使用processTreeKiller在job build结束后杀掉了所有子进程。
手动启动脚本
我们在项目目录下,做了个manage.sh的脚本:
#!/bin/bash
JAR_NAME="helloworld-0.0.1-SNAPSHOT.jar" # 替换为你的 JAR 文件名
JAR_PATH="/target/" # 替换为你的 JAR 文件路径
LOG_FILE="helloworld.log" # 日志文件名
case "$1" in
start)
if pgrep -f $JAR_NAME > /dev/null; then
echo "$JAR_NAME is already running."
else
echo "Starting $JAR_NAME..."
nohup java -jar $JAR_PATH+$JAR_NAME > $LOG_FILE 2>&1 &
echo "$JAR_NAME started."
if pgrep -f $JAR_NAME > /dev/null; then
echo "$JAR_NAME is running."
else
echo "$JAR_NAME is not running."
fi
;;
stop)
if pgrep -f $JAR_NAME > /dev/null; then
echo "Stopping $JAR_NAME..."
pkill -f $JAR_NAME
echo "$JAR_NAME stopped."
else
echo "$JAR_NAME is not running."
fi
;;
restart)
echo "Restarting $JAR_NAME..."
$0 stop
sleep 2
$0 start
;;
status)
if pgrep -f $JAR_NAME > /dev/null; then
echo "$JAR_NAME is running."
else
echo "$JAR_NAME is not running."
fi
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
使用前,先cd到jar项目manage.sh目录下,确认可用性。
chmod +x manage.sh
然后
./manage.sh start
./manage.sh stop
./manage.sh等等
当然,我们直接简单的java -jar命令也当然可以:
nohup java -jar helloworld/target/helloworld-0.0.1-SNAPSHOT.jar > app.log 2>&1 &
自此,Jenkins完成了我们首个打包项目算是完成的差不多了,有兴趣的也可以去看看如何编译前先clean mvn,或者打包结束后发个邮件通知当事人等等功能都是很强大的。上手后大家可以自行琢磨。这里我们再讲下最后一点,多服务器分发打包。
Jenkins远程部署
我们之前的实验,实践了往Jenkins本机部署一套jar服务的过程,但是微服务基本是分布式,需要部署在多台服务器上的,莫不是要求每台服务器都安装Jenkins,然后逐个部署吗?答案不是的。我们只需要安装一台Jenkins,就可以远程部署程序到各个远程服务器上。通常被称为Jenkins远程部署或Jenkins跨服务器部署。
1,Publish Over SSH
首先我们需要检查或安装插件:Publish Over SSH,方法就略了,在本系列第二篇里有。
2,配置SSH
其次呢,我们再去Manage Jenkins——Configure System里面找到SSH单元,新增一个目标服务器的SSH连接信息,点击新增按钮,如下
照着提示填就行,Name是该SSH昵称,然后hostname是ip,username是ssh的账号,至于密码在“高级”按钮里。完事试试右下角的“Test Configuration” ,成功后进行下一步。
3,新增启动脚本
继续在本篇S5段落“Jenkins启动脚本”的后面增加一个新命令:
选择send files or execute commands over SSH
进去后大体就这么几个参数要填,主要是后面的执行脚本
#!/bin/bash
# 定义变量
JAR_PATH="project" # JAR 文件所在的目录
JAR_FILE="helloworld-0.0.1-SNAPSHOT.jar" # JAR 文件名
# 查找并杀死已经运行的 JAR 文件进程
echo "Stopping existing service..."
pid=$(ps -ef | grep "java -jar $JAR_PATH/$JAR_FILE" | grep -v grep | awk '{print $2}')
if [ -n "$pid" ]; then
kill -9 $pid
echo "Killed existing process $pid"
else
echo "No existing process to kill"
fi
# 检查新的 JAR 文件是否存在
if [ -f "$JAR_PATH/$JAR_FILE" ]; then
echo "File exists: $JAR_PATH/$JAR_FILE"
# 启动新的 JAR 服务
echo "Starting new Java service..."
nohup java -jar "$JAR_PATH/$JAR_FILE" > $JAR_PATH/output.log 2>&1 &
sleep 3 # 等待服务启动(如果需要的话)
# 再次检查服务是否启动
pid=$(ps -ef | grep "java -jar $JAR_PATH/$JAR_FILE" | grep -v grep | awk '{print $2}')
if [ -n "$pid" ]; then
echo "New service process $pid started"
else
echo "Failed to start new service"
fi
else
echo "File does not exist: $JAR_PATH/$JAR_FILE"
exit 1 # 文件不存在时退出脚本,通常是一个错误情况
fi
在脚本下面有个“高级”菜单按钮,里面的功能还是很实用的,安利一下,尤其是Flatten files,在拷贝文件到远程服务器时省略源服务器的冗余路径。
这样远程服务器的部署脚本就执行好了。
若还需要把该程序分发到另外的服务器上,继续Add Transfer Set就行,在此之前重复2,3步骤,就是一个新的SSH的端了。
Jenkins的实践先到这,咱们再见。
版权归原作者 laolitou_1024 所有, 如有侵权,请联系我们删除。