pandaAnthony:jenkins+git+maven持续集成(四)

这个系列有四篇文章,自动部署分成了2篇:

  1. jenkins+git+maven持续集成(一):主要介绍Centos7下jenkins的安装
  2. jenkins+git+maven持续集成(二):主要介绍下jenkins怎么集成git+maven进行自动构建
  3. jenkins+git+maven持续集成(三):主要介绍下jenkins怎么集成进行自动部署(发布到maven私有库)
  4. jenkins+git+maven持续集成(四):主要介绍下jenkins怎么集成进行自动部署(通过SSH部署到服务器)

上一篇介绍了手动和自动发布包到maven私有库,这篇主要介绍通过SSH进行自动部署。

再回到前面的jenkinsDemo任务编辑页面,在构建的下面能看到“构建后操作”:


image.png

我们点开“增加构建后操作步骤”:


image.png

可以看到目前是没有部署到linux服务器相关选项的。

部署到linux服务器上并运行

自动构建后还有一个用得更多的操作就是部署到对应的服务器上运行。在spring boot没有广泛运用之前,大多数java程序都是打成war部署到tomcat下运行;而spring boot一般则是通过内嵌tomcat打成个独立的jar运行,如果有很多微服务的话可能会用到docker容器进行部署运行,不过那样又会涉及到docker容器编排,不仅需要了解docker,还需要了解容器编排工具k8s之类的。

这里我们用spring boot打成jar包的方式来进行部署。

1. 安装SSH插件

Jenkins默认是没有SSH插件的,需要我们自己安装。直接搜索SSH:


pandaAnthony:jenkins+git+maven持续集成(四)_第1张图片
image.png

2. 通过SSH部署

找到“Publish Over SSH”进行安装,完成后回到构建后操作:


pandaAnthony:jenkins+git+maven持续集成(四)_第2张图片
image.png

选择“Send build artifacts over SSH”:


pandaAnthony:jenkins+git+maven持续集成(四)_第3张图片
image.png

在这个界面我们可以看到SSH Publishers下是SSH Server,下方有个“Add Server”;这说明我们可以一次构建部署到多个不同的SSH Server上。
然后SSH Server的构成是2部分,一个是Name,另一个是Transfers;而Transfer又是多个Transfer Set构成的。
Transfer Set上我们能看到“Source files”、“Remove prefix”、“Remote directory”和“Exec command”。从字面上就可以初步理解这些代表什么意思:
Source files:需要传输的文件
Remove prefix:去除前缀
Remote directory:需要传输文件到哪
Exec command:执行命令

从上到下,我们需要SSH Server的Name,这是个下拉框;很明显我们目前没有配置过,点开后面的提示:


pandaAnthony:jenkins+git+maven持续集成(四)_第4张图片
image.png

需要我们在Jenkins的全局配置中进行:


pandaAnthony:jenkins+git+maven持续集成(四)_第5张图片
image.png

点击进去,直接到页面最下方:


pandaAnthony:jenkins+git+maven持续集成(四)_第6张图片
image.png

点击新增一个SSH Server,直接点开每行后面的提示:


pandaAnthony:jenkins+git+maven持续集成(四)_第7张图片
image.png

name:这里就是一个名字,根据公司要求来命名(最基本的要求是按环境来分)
Hostname:需要连接的主机域名或ip地址
Username:连接的用户名
Remote Directory:这里是基础的路径,前面Transfer Set中的是在基础路径下的

默认能看到的就是这些信息,很明显没有验证方式,我们点开高级:


pandaAnthony:jenkins+git+maven持续集成(四)_第8张图片
image.png

可以看到有个认证方式的选择框,最下方还有个测试配置的按钮;选中复选框看有些什么:


pandaAnthony:jenkins+git+maven持续集成(四)_第9张图片
image.png

发现一种是要输入密码的,一种是免密的方式;根据具体要求来定,我这里用密码的方式。


pandaAnthony:jenkins+git+maven持续集成(四)_第10张图片
image.png

测试下是否成功:


pandaAnthony:jenkins+git+maven持续集成(四)_第11张图片
image.png

看到了Success,说明配置的这个SSH Server是成功的,保存后会到任务的编辑页面。


pandaAnthony:jenkins+git+maven持续集成(四)_第12张图片
image.png

可以看到SSH Server的Name直接是刚才配置的node2了,一般会配置多个,根据自己需要部署的具体Server选择。

那么接下的Source files要怎么选择呢,这是和构建的具体结构有关的。以我选择的这个spring cloud工程为例,首先我需要做的是运行eureka工程下jar包,也就是启动eureka的注册中心。
我们来看下这个jar的位置,回到任务的主页点开工作空间:


pandaAnthony:jenkins+git+maven持续集成(四)_第13张图片
image.png

很明显我们要的jar包不是在根目录,其实这和我们本地执行maven构建是一样的,eureka的jar包是在spring-cloud-eureka/target下:


pandaAnthony:jenkins+git+maven持续集成(四)_第14张图片
image.png

pandaAnthony:jenkins+git+maven持续集成(四)_第15张图片
image.png

所以Source files的地址在我们这个例子中就是:spring-cloud-eureka/target/*.jar


pandaAnthony:jenkins+git+maven持续集成(四)_第16张图片
image.png

如果有多个的话就用逗号隔开。我们这里要的是jar包,所以jar包前面的那部分就是前缀prefix了:


pandaAnthony:jenkins+git+maven持续集成(四)_第17张图片
image.png

刚才我们配置了一个基础的Remote Directory路径/usr/local/src/temp,我打算再建个eureka的文件夹,将jar放到/usr/local/src/temp/eureka下,那么这里就只需要加个eureka了:


pandaAnthony:jenkins+git+maven持续集成(四)_第18张图片
image.png

看到提示说明如果没有在公共配置Remote Directory,这里的就是直接路径了。
接下就是我们需要执行什么命令了,注意连接后相当于用远程工具连接一样是在系统根目录的,这里我们先只考虑第一次安装,先进入对应的文件,直接运行jar了:


pandaAnthony:jenkins+git+maven持续集成(四)_第19张图片
image.png

这里其实基本相当于你手动操作时在服务器上可以进行的操作,只是将命令放到jenkins中了。
到这里,配置基本结束了;我们先保存,点击立即构建看是否能成功。


pandaAnthony:jenkins+git+maven持续集成(四)_第20张图片
image.png

在控制台我们能看到deploy到maven私有库成功了,而且也运行到了我们配置的命令;给出的提示是java命令没找到。在解决这个问题先下文件是否如我们期望地传到了node2上:


pandaAnthony:jenkins+git+maven持续集成(四)_第21张图片
image.png

可以看到已经成功了。(这里有个要注意的就是公共配置的Remote Directory路径必须是存在的,我们这里配的是/usr/local/src/temp)

为什么java命令没找呢,在node2上是可以直接运行的;是不是jenkins读取不到node2上配置的环境变量呢。这里我们尝试2种方式,一是写全路径:/usr/java/jdk1.8/bin/java -jar spring-cloud-eureka-1.0-SNAPSHOT.jar;
另一种是写个shell脚本放在eureka下去运行:sh ./install.sh,脚本内容就是java -jar spring-cloud-eureka-1.0-SNAPSHOT.jar。

先看下第一种方式:


pandaAnthony:jenkins+git+maven持续集成(四)_第22张图片
image.png

保存后运行:


pandaAnthony:jenkins+git+maven持续集成(四)_第23张图片
image.png

在控制台可以看到命令执行了,这里是eureka集群,控制台中会有些错误信息;直接看最后的结果:


pandaAnthony:jenkins+git+maven持续集成(四)_第24张图片
image.png

似乎Jenkins因为超时的原因强制关闭了连接;那么eureka启动了没有呢,我们检查下:


pandaAnthony:jenkins+git+maven持续集成(四)_第25张图片
image.png

正常启动了。通过这个我们验证了2点,Jenkins没办法找到服务器node2上环境变量,只能全路径启动;超过2分钟会关闭连接。当然这种方式肯定不是我们需要的,首先我们没必要写全路径,其次我们最后能让这个程序在后台运行不要在控制台数据这么多信息。

那我们来看第二种方式,先创建好install.sh,并授权:

chmod 777 install.sh

image.png

修改编辑页面命令为sh ./install.sh:


pandaAnthony:jenkins+git+maven持续集成(四)_第26张图片
image.png

再启动之前我们先强制kill掉刚才启动的java进程:


pandaAnthony:jenkins+git+maven持续集成(四)_第27张图片
image.png

保存后运行:


pandaAnthony:jenkins+git+maven持续集成(四)_第28张图片
image.png

发现还是不行,难道只能写全路径了吗?在网上找了个方案,在最前面加上:

source /etc/profile

pandaAnthony:jenkins+git+maven持续集成(四)_第29张图片
image.png

这次和第一次一样了,最后的结果也是一样,说明直接在编辑界面用命令行和编辑界面运行shell效果是一样的。这里最关键的地方是要运行source /etc/profile,这样才能拿到需要部署服务器的环境变量。

这和我们期望的还是有一点差距,如果是自己跑demo基本上到这里就可以了;但是公司里运行的话这样肯定不行,这是不稳定的构建。接下来我们进行改造,还是用第二种方式,在shell脚本中编写;这样的好处显而易见,Jenkins的编辑界面这里只管调用shell脚本(shell脚本可以写得很灵活,接收各种参数,这里就不扩展了)。

我们要达到的效果就是让java -jar这个命令在后台运行,这就是linux的知识了;本人对于linux只懂皮毛,百度了下个人觉得比较好的后台运行方式:

nohup command > myout.file 2>&1 &

这是指定输出文件:其中nohup将程序以忽略挂起信号的方式运行起来,末尾空格加&;如果不指定输出文件,会挂起来要ctrl + c才能进入命令行。
还有一种方式,输出到空(这里的/dev/null 是设备文件,不是普通文件,如果系统上没有不要用普通创建文件的方式去执行,会导致系统不能连接。。。):

nohup command > /dev/null 2>&1 &

经过测试可以去掉nohup:


image.png

pandaAnthony:jenkins+git+maven持续集成(四)_第30张图片
image.png

这样就比较符合了,改造下shell脚本:

source /etc/profile
echo $JAVA_HOME
java -jar spring-cloud-eureka-1.0-SNAPSHOT.jar > myout.file 2>&1 &

kill掉java进程后再重新执行构建:


pandaAnthony:jenkins+git+maven持续集成(四)_第31张图片
image.png

这样就不会将日志输出到控制台阻塞住了,直接检查下注册中心页面:


pandaAnthony:jenkins+git+maven持续集成(四)_第32张图片
image.png

检查下java进程:


pandaAnthony:jenkins+git+maven持续集成(四)_第33张图片
image.png

启动日志输出文件:


pandaAnthony:jenkins+git+maven持续集成(四)_第34张图片
image.png

SSH自动部署到服务器基本就完成了,当然实际项目中要考虑更多的问题:
比如启动过了又要部署启动怎么处理,首先要检查端口是否被占用,如果占用了就kill掉再启动;
还有就是怎么把shell脚本写得更加灵活,支持多环境配置,多端口启动等。
这些就不在这里扩展了,不过有了这些基本的知识可以避免不少坑;只需要再根据业务进行扩展和优化了。

你可能感兴趣的:(pandaAnthony:jenkins+git+maven持续集成(四))