Jenkins – Jenkins自动部署Jar到远程服务器
1. 配置远程服务器SSH免密登录
- 本地客户端生成公私钥(一路回车默认即可),会在用户目录.ssh文件夹下创建公私钥
[localuser@localhost .ssh]$ ssh-keygen
[localuser@localhost .ssh]$ ls
id_rsa id_rsa.pub
- 上传公钥到服务器,这里远程服务器地址为:192.168.2.200,用户为:testuser
ssh-copy-id -i ~/.ssh/id_rsa.pub testuser@192.168.2.200
上面这条命令会在远程服务器的~/.ssh
目录生成authorized_keys
,里面是id_rsa.pub(公钥)内容。
若目标服务器已经存在了
authorized_keys
,则可拷贝公钥内容追加到authorized_keys
内容的末尾。
- 测试免密登录,本地客户端通过ssh连接远程服务器,就可以免密登录了。
[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服务器。
- 新建Item, 输入任务名称:
MavenTest
(自己定义),选择自由项目,点击确定
。 - 勾选
This project is parameterized
(参数化构建)- 选择
Choice Parameter
,添加打包环境参数(名称:buildEnv,选项:beta和prod); - 选择
Git Parameter
,定义参数名称:gitBranch
,参数类型选择分支
;
- 选择
- 源码管理,选择Git,填写仓库地址(
Repository URL
)和选择凭据(Credentials
)。 - 构建环境,勾选
Add timestamps to the Console Output
,加上时间戳。 - Post Steps,选择执行shell脚本Execute shell,输入:
cd /home/jenkins/shell
# 对应两个构建参数$buildEnv,$gitBranch
./demo-deploy-$buildEnv.sh demo-0.0.1-SNAPSHOT.jar ${gitBranch}
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
#!/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
# 添加执行权限
[localuser@localhost ~]$ chmod +x demo-deploy-beta.sh
- 远程服务器
[localuser@localhost ~]$ cd /usr/local/test
[localuser@localhost ~]$ vim demo-deploy.sh
#!/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`
# 添加执行权限
[localuser@localhost ~]$ chmod +x demo-deploy.sh
4. 部署测试
Build with Parameters
-> 选择要部署的git分支${gitBranch}
和环境参数${buildEnv}
构建完成后点击Build History
(构建历史)里的构建版本号,点击控制台输出
查看日志
END .
相关系列文章
- 环境配置 -- RocketMQ安装并整合SpringBoot
- 环境配置 -- Nginx常用配置详解
- Shell基础 -- Shell脚本部署Java应用
- Shell基础 -- Shell 文本处理
- Shell基础 -- Shell 函数的用法
- Shell基础 -- Shell 变量的用法与数学运算
- Shell基础 -- Shell 编程入门
- 环境配置 -- Linux常用命令整理
- Jenkins -- Jenkins自动部署Jar到远程服务器
- Jenkins -- 使用Maven构建Java应用程序
- Jenkins -- 声明式流水线Jenkins Pipeline
- Jenkins -- 安装Jenkins(Linux环境centos)
- 环境配置 -- Redis与MySQL多实例配置