Jenkins入门(四)自动部署Jar到远程服务器

Stella981
• 阅读 823

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

  1. 本地客户端生成公私钥(一路回车默认即可),会在用户目录.ssh文件夹下创建公私钥

    [localuser@localhost .ssh]$ ssh-keygen [localuser@localhost .ssh]$ ls id_rsa id_rsa.pub

  2. 上传公钥到服务器,这里远程服务器地址为: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内容的末尾。

  1. 测试免密登录,本地客户端通过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服务器。

  1. 新建Item, 输入任务名称:MavenTest(自己定义),选择自由项目,点击确定

  2. 勾选This project is parameterized(参数化构建)

    • 选择Choice Parameter,添加打包环境参数(名称:buildEnv,选项:beta和prod);
    • 选择Git Parameter,定义参数名称:gitBranch,参数类型选择分支
    • Jenkins入门(四)自动部署Jar到远程服务器
  3. 源码管理,选择Git,填写仓库地址(Repository URL)和选择凭据(Credentials)。

    • Jenkins入门(四)自动部署Jar到远程服务器
  4. 构建环境,勾选Add timestamps to the Console Output,加上时间戳。

  5. Post Steps,选择执行shell脚本Execute shell,输入:

    • Jenkins入门(四)自动部署Jar到远程服务器

    cd /home/jenkins/shell

    对应两个构建参数$buildEnv,$gitBranch

    ./demo-deploy-$buildEnv.sh demo-0.0.1-SNAPSHOT.jar ${gitBranch}

3. 编写部署脚本

可参考shell脚本部署Java应用

  1. 本地客户端

    [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

  2. 远程服务器

    [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}

Jenkins入门(四)自动部署Jar到远程服务器

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

Jenkins入门(四)自动部署Jar到远程服务器

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
SSH公钥免密登录其他主机
在多台主机之间使用SSH免密登录,假设主机A免密登录主机B:1\.在主机A上生成自己的ssh公钥:root@A~sshkeygentrsa执行上面命令,一路回车,完成后,会在~/.ssh目录下生成2个文件:id\_rsa(私钥)和id\_rsa.pub(公钥)2\.将主机A上生成的公钥
Wesley13 Wesley13
3年前
SSH公钥无密码认证
1)在master主机上生成密码对sshkeygen–trsa–P''确认一路回车,命令默认会在用户主目录下生成.ssh目录,你们有两密钥对文件:id\_rsa和id\_rsa.pubmaster@hadoop~$ll.ssh/rw.1mastermaster1675Jun
Chase620 Chase620
3年前
ssh-keygen详解
sshkeygen用来生成ssh公钥认证所需的公钥和私钥文件。ssh秘钥登录特点:1.安全;2.免输密码。对于安全级别较高的服务器,建议配好ssh登录后禁掉密码登录。缺点:略繁琐。如果你的只是临时登录一次,那么还是密码吧。一、生成秘钥秘钥对需要在你自己的机器上生成,然后把公钥放到服务器相应用户的~/.ssh目录执行下面命令,默认
Stella981 Stella981
3年前
Git使用总结
生成密钥1.打开GitBash,运行  \_sshkeygen  \_2.密钥生成空间\_~/.ssh/id\_rsa  \_(C:/User/.ssh)3.输入密码(不输入增直接回车跳过)4._~/.ssh/id\_rsa.pub_ (公钥), _id\_rsa_ (私钥)下载代码到本地
Stella981 Stella981
3年前
Linux单向免密登录最简配置
前置:两台linux,A和B需求:A免密登录B步骤:root用户登录A输入命令:sshkeygen之后一路按回车完成后进行公钥分发命令:sshcopyidi/root/.ssh/id\_rsa.pubB的IP示例:sshcopyidi/root/.ssh/id\_rsa.pub192.168.1
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这