「Jenkins」Jenkins自动部署Jar到远程服务器

1. 配置远程服务器SSH免密登录

  1. 本地客户端生成公私钥(一路回车默认即可),会在用户目录.ssh文件夹下创建公私钥
1
2
3
[localuser@localhost .ssh]$ ssh-keygen
[localuser@localhost .ssh]$ ls
id_rsa id_rsa.pub
  1. 上传公钥到服务器,这里远程服务器地址为:192.168.2.200,用户为:testuser
1
ssh-copy-id -i ~/.ssh/id_rsa.pub testuser@192.168.2.200

上面这条命令会在远程服务器的~/.ssh目录生成authorized_keys,里面是id_rsa.pub(公钥)内容。

若目标服务器已经存在了authorized_keys,则可拷贝公钥内容追加到authorized_keys内容的末尾。

  1. 测试免密登录,本地客户端通过ssh连接远程服务器,就可以免密登录了。
1
2
3
4
5
[localuser@localhost ~]$ ssh testuser@192.168.2.200
Last login: Tue Nov 17 20:57:25 2020 from 192.168.2.202
[testuser@caimeidev1 ~]$ exit
logout
Connection to 192.168.2.200 closed.

2. 登录Jenkins客户端并配置

先安装插件:Git Paramater,这里只演示部署,因为已在本地打好包推送到了git服务器。

  1. 新建Item, 输入任务名称:MavenTest(自己定义),选择自由项目,点击确定
  2. 勾选This project is parameterized(参数化构建)
    • 选择Choice Parameter,添加打包环境参数(名称:buildEnv,选项:beta和prod);
    • 选择Git Parameter,定义参数名称:gitBranch,参数类型选择分支
  3. 源码管理,选择Git,填写仓库地址(Repository URL)和选择凭据(Credentials)。
  4. 构建环境,勾选Add timestamps to the Console Output,加上时间戳。
  5. Post Steps,选择执行shell脚本Execute shell,输入:
1
2
3
cd /home/jenkins/shell
# 对应两个构建参数$buildEnv$gitBranch
./demo-deploy-$buildEnv.sh demo-0.0.1-SNAPSHOT.jar ${gitBranch}

3. 编写部署脚本

可参考shell脚本部署Java应用

  1. 本地客户端
1
2
3
[localuser@localhost ~]$ cd /home/jenkins/shell
# 推送不同服务器用不同shell脚本,beta:demo-deploy-beta.sh,product:demo-deploy-prod.sh,对应$buildEnv参数
[localuser@localhost ~]$ vim demo-deploy-beta.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/bash
fileName=$1
gitBranch=$2
if [ -z "$fileName" ]; then
echo "文件名不能为空"
exit 0
fi
echo "准备发布【$gitBranch】分支,到【Beta:192.168.2.200】"
echo "开始拷贝jar文件【$fileName】到远程服务器"
scp /home/jenkins/root/workspace/MavenTest/target/$fileName testuser@192.168.2.200:/usr/local/test/$fileName.prev
# 捕获上一条命令的输出$? (if 0 正常 else 错误)
if [ "$?" == "0" ]; then
echo "文件传输结束,准备启动远程服务器的部署脚本"
ssh testuser@192.168.2.200 /usr/local/test/demo-deploy.sh $fileName
else
echo "拷贝文件错误"
exit 0
fi
1
2
# 添加执行权限
[localuser@localhost ~]$ chmod +x demo-deploy-beta.sh
  1. 远程服务器
    1
    2
    [localuser@localhost ~]$ cd /usr/local/test
    [localuser@localhost ~]$ vim demo-deploy.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/env bash
echo "服务器开始部署服务"
projectname="demo-0.0.1-SNAPSHOT"

# 打开文件所属的目录,不然远程执行会找不到当前目录
cd /usr/local/test

# 新的jar包会当成参数传过来
newJar=$1
echo "新的jar为:$newJar"
# 如果新的jar包为空则退出
if [ -z "$newJar" ]; then
echo "新的jar不能为空"
exit 0
fi

# 获取旧的jar包名称,当然可能是空的,也可能跟当前名称一致
oldJar=$(ps -ef | grep ${projectname}|grep -v 'demo-deploy.sh'|grep -v grep|awk '{print $10}'|cut -d '/' -f 2)
echo "当前运行的旧的jar包为:$oldJar"
#如果新的jar包为空则退出
if [ -z "$oldJar" ]; then
echo "没有启动的demo服务"
else
# 如果旧的进程还在就将旧的进程杀掉
oldId=`ps -ef|grep ${projectname}|grep -v "$0"|grep -v "grep"|awk '{print $2}'`
echo "$oldId"
echo "kill old process start ..."
for id in $oldId
do
kill -9 $id
echo "killed $id"
done
echo "kill old process end"
# 获取当前时间
suffix=".bak-"`date '+%s%3N'`;
echo $suffix;
# 将旧的jar包进行备份
mv $oldJar ${oldJar}${suffix}
fi

# 开始启动新的进程
mv ${1}.prev ${1}
nohup java -jar ${1} > run.txt 2>&1 &
echo "服务启动查看进程:"
echo `ps -ef | grep ${projectname}|grep -v 'demo-deploy.sh'|grep -v grep`
1
2
# 添加执行权限
[localuser@localhost ~]$ chmod +x demo-deploy.sh

4. 部署测试

Build with Parameters -> 选择要部署的git分支${gitBranch}环境参数${buildEnv}

构建完成后点击Build History(构建历史)里的构建版本号,点击控制台输出查看日志