0


Jenkins保姆笔记(3)——Jenkins拉取Git代码、编译、打包、远程多服务器部署Spring Boot项目

前面我们介绍过:

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是否已安装:

  1. git --version

如果系统提示Git未找到或未安装,则你需要使用包管理器(如yum、apt-get等)来安装Git。对于使用yum的CentOS系统,你可以使用以下命令来安装Git:

  1. 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的安装目录:

  1. which git

输出:

  1. /usr/bin/git

我们就把这个路径拷贝到上图的PATH里面

保存,刷新,回到项目构建页面,发现什么了?红色提示没了。

基本上配置完Git,下面就可以不配置了。检查下还有没有其他红色提示,没有的话,我们试着“立即构建”看看效果。

修改pom.xml的路径

这里卖个关子,因为毕竟我们是以第一次构建Jenkins项目的小白视角,并不知道这里的路径要修改。我们将在S4里介绍pom.xml的路径修改。

S4:构建项目

试着构建看看:

很可惜,第一次构建前面出现了红色的X,代表失败了。不着急,点击#1,进去看看错误详情。

  1. ERROR: No such file /var/lib/jenkins/workspace/First Job/pom.xml
  2. Perhaps you need to specify the correct POM file path in the project configuration?
  3. 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我们也可以加一些辅助的命令:

  1. clean package -Dmaven.test.skip=true -U

用来在编译时做写清理、更新maven以及跳过测试代码的操作。

保存,发现ok了吧,好,我们保存构建配置后,再去“立即构建”看看 。

这次发现构建时间有点久,告诉你,不要着急,这可能是积极的信号,因为maven首次成功使用要down好多包的,有点费时。

果不其然,不一会,我们第二次构建成功了。

S5:启动项目

既然构建成功了,启动项目无非有2种,一种是Jenkins在构建后自动给他启动,另一种是jar包都给你打包放在服务器了,你自己去手动启动也行。

Jenkins启动脚本

在项目构建的Post Steps阶段,

新增shell命令:

  1. #!/bin/bash
  2. # 定义变量
  3. JAR_PATH="$WORKSPACE/helloworld/target" # JAR 文件所在的目录
  4. JAR_FILE="helloworld-0.0.1-SNAPSHOT.jar" # JAR 文件名
  5. TARGET_DIR="/root/project/helloworld" # 目标目录,请确保您有足够的权限写入此目录
  6. TARGET_JAR_PATH="$TARGET_DIR/$(basename "$JAR_FILE")" # 目标目录中的JAR文件完整路径
  7. # 检查目标目录是否存在,如果不存在则创建它
  8. if [ ! -d "$TARGET_DIR" ]; then
  9. mkdir -p "$TARGET_DIR"
  10. echo "Target directory $TARGET_DIR created."
  11. fi
  12. # 查找并杀死已经运行的JAR文件进程(在目标目录中的JAR文件)
  13. echo "Stopping existing service (if any) in target directory..."
  14. pid=$(ps -ef | grep "java -jar $TARGET_JAR_PATH" | grep -v grep | awk '{print $2}')
  15. if [ -n "$pid" ]; then
  16. kill -9 $pid
  17. echo "Killed existing process $pid"
  18. else
  19. echo "No existing process to kill in target directory"
  20. fi
  21. # 检查新的JAR文件是否存在
  22. if [ -f "$JAR_PATH/$JAR_FILE" ]; then
  23. echo "File exists: $JAR_PATH/$JAR_FILE"
  24. # 复制JAR文件到目标目录
  25. cp "$JAR_PATH/$JAR_FILE" "$TARGET_JAR_PATH"
  26. if [ $? -eq 0 ]; then
  27. echo "JAR file copied to $TARGET_JAR_PATH successfully."
  28. # 启动新的JAR服务
  29. echo "Starting new Java service from target directory..."
  30. BUILD_ID=dontKillMe
  31. nohup java -jar "$TARGET_JAR_PATH" > "$TARGET_DIR/output.log" 2>&1 &
  32. sleep 3 # 等待服务启动(如果需要的话)
  33. # 再次检查服务是否启动(可选)
  34. pid=$(ps -ef | grep "java -jar $TARGET_JAR_PATH" | grep -v grep | awk '{print $2}')
  35. if [ -n "$pid" ]; then
  36. echo "New service process $pid started in target directory"
  37. #sleep 30
  38. else
  39. echo "Failed to start new service in target directory"
  40. fi
  41. else
  42. echo "Failed to copy JAR file to $TARGET_JAR_PATH."
  43. exit 1
  44. fi
  45. else
  46. echo "File does not exist: $JAR_PATH/$JAR_FILE"
  47. exit 1 # 文件不存在时退出脚本,通常是一个错误情况
  48. fi
  49. exit 0

这样可以在Jenkins打包后立刻启动项目jar服务。

里面注意有一段BUILD_ID=dontKillMe要加,否则会出现错误:Process leaked file descriptors……伴随的现象是jar程序启动后又停止。那是因为Jenkins默认会使用processTreeKiller在job build结束后杀掉了所有子进程

手动启动脚本

我们在项目目录下,做了个manage.sh的脚本:

  1. #!/bin/bash
  2. JAR_NAME="helloworld-0.0.1-SNAPSHOT.jar" # 替换为你的 JAR 文件名
  3. JAR_PATH="/target/" # 替换为你的 JAR 文件路径
  4. LOG_FILE="helloworld.log" # 日志文件名
  5. case "$1" in
  6. start)
  7. if pgrep -f $JAR_NAME > /dev/null; then
  8. echo "$JAR_NAME is already running."
  9. else
  10. echo "Starting $JAR_NAME..."
  11. nohup java -jar $JAR_PATH+$JAR_NAME > $LOG_FILE 2>&1 &
  12. echo "$JAR_NAME started."
  13. if pgrep -f $JAR_NAME > /dev/null; then
  14. echo "$JAR_NAME is running."
  15. else
  16. echo "$JAR_NAME is not running."
  17. fi
  18. ;;
  19. stop)
  20. if pgrep -f $JAR_NAME > /dev/null; then
  21. echo "Stopping $JAR_NAME..."
  22. pkill -f $JAR_NAME
  23. echo "$JAR_NAME stopped."
  24. else
  25. echo "$JAR_NAME is not running."
  26. fi
  27. ;;
  28. restart)
  29. echo "Restarting $JAR_NAME..."
  30. $0 stop
  31. sleep 2
  32. $0 start
  33. ;;
  34. status)
  35. if pgrep -f $JAR_NAME > /dev/null; then
  36. echo "$JAR_NAME is running."
  37. else
  38. echo "$JAR_NAME is not running."
  39. fi
  40. ;;
  41. *)
  42. echo "Usage: $0 {start|stop|restart|status}"
  43. exit 1
  44. esac

使用前,先cd到jar项目manage.sh目录下,确认可用性。

  1. chmod +x manage.sh

然后

  1. ./manage.sh start
  2. ./manage.sh stop
  3. ./manage.sh等等

当然,我们直接简单的java -jar命令也当然可以:

  1. 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

进去后大体就这么几个参数要填,主要是后面的执行脚本

  1. #!/bin/bash
  2. # 定义变量
  3. JAR_PATH="project" # JAR 文件所在的目录
  4. JAR_FILE="helloworld-0.0.1-SNAPSHOT.jar" # JAR 文件名
  5. # 查找并杀死已经运行的 JAR 文件进程
  6. echo "Stopping existing service..."
  7. pid=$(ps -ef | grep "java -jar $JAR_PATH/$JAR_FILE" | grep -v grep | awk '{print $2}')
  8. if [ -n "$pid" ]; then
  9. kill -9 $pid
  10. echo "Killed existing process $pid"
  11. else
  12. echo "No existing process to kill"
  13. fi
  14. # 检查新的 JAR 文件是否存在
  15. if [ -f "$JAR_PATH/$JAR_FILE" ]; then
  16. echo "File exists: $JAR_PATH/$JAR_FILE"
  17. # 启动新的 JAR 服务
  18. echo "Starting new Java service..."
  19. nohup java -jar "$JAR_PATH/$JAR_FILE" > $JAR_PATH/output.log 2>&1 &
  20. sleep 3 # 等待服务启动(如果需要的话)
  21. # 再次检查服务是否启动
  22. pid=$(ps -ef | grep "java -jar $JAR_PATH/$JAR_FILE" | grep -v grep | awk '{print $2}')
  23. if [ -n "$pid" ]; then
  24. echo "New service process $pid started"
  25. else
  26. echo "Failed to start new service"
  27. fi
  28. else
  29. echo "File does not exist: $JAR_PATH/$JAR_FILE"
  30. exit 1 # 文件不存在时退出脚本,通常是一个错误情况
  31. fi

在脚本下面有个“高级”菜单按钮,里面的功能还是很实用的,安利一下,尤其是Flatten files,在拷贝文件到远程服务器时省略源服务器的冗余路径。

这样远程服务器的部署脚本就执行好了。

若还需要把该程序分发到另外的服务器上,继续Add Transfer Set就行,在此之前重复2,3步骤,就是一个新的SSH的端了。

Jenkins的实践先到这,咱们再见。

标签: jenkins git ci/cd

本文转载自: https://blog.csdn.net/laolitou_1024/article/details/140980854
版权归原作者 laolitou_1024 所有, 如有侵权,请联系我们删除。

“Jenkins保姆笔记(3)——Jenkins拉取Git代码、编译、打包、远程多服务器部署Spring Boot项目”的评论:

还没有评论