jenkins 构建任务 —— 通过 Publish over SSH 将项目部署到远程服务器

部门的项目都是通过jenkins构建的,之前都是jenkins和tomcat以及jdk在一个服务器上,所以构建后的项目也只是在同一个服务器不同文件夹之间调用,最近新项目尝试使用微服务,整个项目有5个微服务项,第一次使用也没什么经验,发布后发现每个小服务竟然在16G内存情况下占比达到10%左右,整个项目5个微服务占比达到了50%左右,对于一个目前并不复杂的项目来说,显然占比有点多,因为之前的服务器有多个单独的项目,占比也有50%左右,所以如果微服务跟原来的项目放在一起整个服务器内存占比瞬间超过了90%以上,这显然有隐患。

于是新申请了服务器,微服务只需要安装jdk就好了,而发现新申请的centos7 服务器竟然自带了jdk1.8(不会是之前被用过的服务器回收的吧哈哈哈哈),不过追踪jdk安装路径,竟然是放在/usr/local/java 下。。。

回归正题。jenkins发布构建项目之前已经有经验了,现在只是要远程把新项目部署到新服务器上启动执行。

需求:

jenkins构建项目后远程部署到新服务器并启动运行。

解决方案:

jenkins的构建原理:

jenkins将远程(git或svn服务器上)代码拉取到 /.../jenkins_home/workspace/目录下,该目录下的每个文件夹都对应jenkins上的一个项目,对于maven项目,拉取到代码后会执行项目下的pom.xml文件来构建项目,所以最终项目生成的可执行文件在对应项目/target文件夹下,比如,我这里的jinkins上项目是test-microservice,则对应拉取的代码存放在/.../enkins_home/workspace/test-microservice,执行构建/.../jenkins_home/workspace/test-microservice/pom.xml后生成的jar(或war)文件在/.../jenkins_home/workspace/test-microservice/target目录。

之前的操作是在构建完项目后,直接通过jenkins的构建后操作编写shell代码,将对应jar(或war)移动到tomcat下。

现在新服务器没有tomcat,只有jdk,所以要将构建完后的jar(或war)移动到新服务器,并通过shell执行java -jar 项目名.jar 启动。

第一步,将jar(或war)移动到新远程服务器。

多个服务器之间传递文件,需要用到jenkins插件 Publish Over SSH,如果之前没有安装过,需要先安装该插件。

jenkins左侧 系统管理(Manage Jenkins)-->插件管理( GlobalTool Configuration)。

 如果没安装过,则在可选插件中搜索 Publish Over SSH 安装。如果之前安装过则在“已安装”中可搜到。

 

如果没安装过,更多的时候是你当前的jenkins版本已经和推荐的 Publish Over SSH版本不匹配了,类似这样的:

这个时候,你要么更新到最新的jenkins,要么手动安装对应版本的Publish Over SSH插件。这里我选择第二种方式,手动安装Publish Over SSH。

去这里查找下载所需要的版本:http://updates.jenkins-ci.org/download/plugins/publish-over-ssh

因为我的jenkins是2017年安装的,所以找版本根据2017年的下载。下载后是一个 .hpi 文件。

在jenkins插件管理中选择“高级”——>上传插件。

上传完成后需要重启jenkins。

重启后重新进入jenkins查看插件安装成功。 


第二步:配置Publish Over SSH。

要先在jenkins所在的机器上生成秘钥。生成方式为:

ssh-keygen -t rsa         #产生公钥与私钥对

因为没加密码所以一路enter完成。此时在 用户名文件夹/.ssh/文件夹下生成两个文件:

is_rsa 为密钥文件
id_rsa.pub 为公钥文件

网上大部分文件都通过以下语句将公钥文件复制到目标服务器:

ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.51.xxx.xxx

而我直接用的复制粘贴。。。。还好后面也成功了~

!!!!!!

提示:这里大部分其他文章提示的是在目标服务器上添加 /root/.ssh/authorized_keys 文件。而我也是这么做的。。。在authorized_keys文件中追加源服务器的公钥。

!!!!!!

打开 系统管理——>系统设置,下拉到底部的Publish over SSH区域。

Passphrase:根据网上的资料说这里是生成秘钥时的密码,如果生成秘钥没有加密码,直接enter到底生成的,则这里不用填写。(保存后会有些·········表示空密码)。

Path to key:网上说这里填的是私钥的路径,没尝试,因为在下面填写了私钥key。

Key:私钥的值。要将前后的-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----带着。

点击SSH Servers的“增加”,新添目标服务器。

Name:你起的可以分辨服务器的名称。

Hostname:目标服务器的ip,一般服务器之间交互的话用内网ip就行。

Username:登录目标服务器的账号。

Remote Directory:将jenkins构建的文件发送到目标服务器的哪个文件夹下。

此时点击 右下角的 Test Configuration,据说有的能成功,反正我的是报错了。于是点开右下角的“高级”按钮。

Use password authentication,or use a different key,该选项貌似是必须项,因为要登录目标服务器需要验证密码啊。。。

Passphrase/Password:此处填写目标服务器的登录密码。

Path to key:据说此处填写跟上面一样的私钥路径,这里没用到所以没填。

Key:私钥的值。据说这里填写跟上面一样的Key,而且这里可以覆盖上面的,那我理解这里是不是可以直接只填写这里不填写上面呢?结果验证上面不填是会报错的,但是这里不填只填上面竟然是可以的。

Port:目标服务器的端口,默认是22,根据自己服务器端口填写,我这里不是22一直没通,后来问了it部门才知道给开的别的端口,哭泣。。。

完整的配置如下:  

最终的填写内容如上,测试通过。

PS:刚才写本篇文章,试着删掉了上面的Key,竟然测试连接也成功了????难道只有密码就可以???

如果出问题可以先在linux中用 ssh root@你的ip -p你的端口号(-p和端口号之间没有空格)测试能否远程登录成功另一台服务器。

如果jenkins报错:

jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to connect session for config [xiaochengxu]. Message [java.net.ConnectException: Connection refused (Connection refused)]]

是可能配置的ip或port或账户等不对。

如果jenkins报错:

jenkins.plugins.publish_over.BapPublisherException: Failed to connect and initialize SSH connection. Message: [Failed to connect session for config [xiaochengxu]. Message [Auth fail]]

是配置的密码不对。 

到此Publish Over SSH配置完成,记录一下。 


下面是maven项目的构建配置。

其他配置不变,只有在 Post Steps 中的配置变化了

以前在服务器本机的时候,直接选 Execute shell 然后输入要执行的语句就行,比如:nohup java -jar init.jar > init.log 2>&1 &。

现在要选 Send files or execute commands over SSH,然后配置对应的服务器信息。

 

Name:对应Publish Over SSH中的私有配置SSH Server Name

Transfer Set

Source files:jenkins项目所在目录需要远程传输的文件,比如假如我的是:test_user/target/test-1.0-SNAPSHOT.jar(相对于工作区的路径。可以填写多个,默认用,分隔, **/* 表示这个job的工作目录下所有的文件和目录。)

Remove prefix:该操作是针对上面的Source files目录,会移除匹配的目录。比如针对上面的则是test_user/target,这样远程传送后就直接在对应的目录下存放jar包,而没有多级目录。
Remote directory:远程服务器目录(假如这里的是test,那么加上 公共配置(系统配置)->私有配置->Remote Directory 最后就是 /xcxdata/test/)

Exec command:文件传输到远程服务器后要执行的语句,比如我这里是通过java启动jar包。当然也可以附带这生产环境的额外配置参数,如 nohup java -jar /data/你的.jar --config.active=prod --config.password=你的额外加密密码等 > /data/你的记录日志.log 2>&1 &

经测试,如果有多个微服务项目,可以添加多个Server。

我这里没用到高级功能,就无法做介绍啦~~

到此,整个配置完成,运行后直接在远程服务器上启动了对应的jar包服务~~

 

posted @ 2021-10-26 21:27  一 定 会 去 旅 行  阅读(5070)  评论(0编辑  收藏  举报