Java项目的Fabric自动部署

说明

fab是一个简单易用的自动化部署工具,可通过ssh远程部署

环境配置

环境工具
开发工具IntelliJ IDEA
系统Ubuntu18
插件gradle4.10/java1.8

安装gradle

具体方法可以参考这篇文章[转载]https://blog.csdn.net/mengdong_zy/article/details/78272471

安装fabric

ubuntu系统下,可以输入指令apt install fabric简易安装fab工具

gradle的一些配置

gradle配置主要是针对项目打包的一些配置:
这里我使用的是gradle-4.10进行打包,将java项目打包成二进制的tar包,同样打包成jar包也是可以的,这里就以二进制打包方法为例子.
1.在builde.gradle文件中导入application插件
apply plugin: 'application'

随后可以看到gradle如下图所示,多了distribution目录,distTar是打包成二进制包的task,distZip则是打包成zip包的方法.
在这里插入图片描述
这里还要指定项目的主类.
注意在gradle-4.10中指定允许jar的task,不然运行distTar的时候会跳过打包jar,后面运行的时候会找不到方法.


jar{
    enabled = true
}
mainClassName = "com.data.feijin.DataServer"

可以双击distTar任务或者通过指令:gradle distTar 进行打包,可以看到idea的控制在有如下图的输出:

在这里插入图片描述
那么gradle的配置就算完成了.

fabfile.py脚本

fabfile.py脚本是自动化部署的核心环节,主要用来控制文件上传、远程部署运行、自检等功能。

先在我们项目中创建 fabfile.py文件

导入库
# coding:utf-8
import time

from fabric.api import env, local, hosts
from fabric.context_managers import cd, settings
from fabric.contrib.files import exists
from fabric.operations import sudo, run, put
from fabric.tasks import execute
from fabric.utils import abort
定义参数
env.server_name = 'feijin'
env.server_port = '9030'
#远程服务器用户名
env.user = "ubuntu"
#远程服务器地址
env.host_dev = ['123.207.32.167']
#服务部署目录
env.server_local= './build/distributions'
#服务部署目录
env.server_home= '/srv/java/%s'%env.server_name
#服务部署目录
env.server_release= '%s/release/tar'%env.server_home
#服务日志输出目录
env.server_log = '/var/log/%s'%env.server_name
#服务日志输出文件
env.server_log_out = '%s/%s.out.log'%(env.server_log,env.server_name)
#服务启动路径
env.server_start = 'bin/%s' % env.server_name
env.app_status_cmd = 'curl http://localhost:9030'
#服务进程号查询
env.server_ps_cmd = "ps -ef|grep java|grep %s|grep -v grep|awk '{print $2}'" % env.server_name
#
env.status_check_interval = 5
定义项目同步

每次部署之前都会先去github拉取一次最新的项目,其他项目管理工具也一样,用local方法来输入指令

#从github拉取项目
def pull():
    local('git checkout dev')
    local('git reset --hard remotes/origin/dev')
    local('git pull origin dev')
本地打包
#本地通过gradle将项目打包成二进制tar包
def build():
    local('gradle clean distTar -Penv=dev')#通过gradle打包成二进制的tar包,并指定开发为开发环境的包
远程复制

复制二进制包到远程服务器上。@hosts指定远程服务器地址,自动化部署过程中是需要输入用户与密码的,免密登录需要一些额外的配置。这里我们用的是秘钥登录,所以需要定义env.user = "ubuntu"用户名,如果是密码登录的则需要通过参数进行指定env.passwords = { ‘user@192.168.1.1:22’: ‘password’}

#将二进制包复制到远程部署服务器上
@hosts(env.host_dev)
def release():
    run('mkdir -p ' + env.server_release)
    put(env.server_local+'/*',env.server_release)
部署与运行

这里的步骤是

登录远程服务器
找到最近上传的tar包
拷贝到部署目录下
解压缩
创建日志路径与文件
后台运行服务并输出日志
@hosts(env.host_dev) #指定远程服务器地址,用户名为env.user的值
def start():
    if not exists(env.server_home):
        ('mkdir -p %s' % env.server_home)
        sudo('chown -R %s %s' %(env.user,env.server_home))
    with cd(env.server_home):
        #修改时间顺序排列,查找服务名列表,取出最后一个修改的文件
        tarfilename = run('ls -t %s |grep %s | head -1'%(env.server_release,env.server_name))
        print tarfilename
        if not tarfilename:
            abort('not found file')
        #将文件拷贝到部署目录
        run('cp %s/%s ./'%(env.server_release,tarfilename))
        #获取无扩展名的文件名
        filename = '.'.join(tarfilename.split('.')[:-1]) if '.' in tarfilename else tarfilename
        print filename
        if tarfilename:
            run('rm -rf ' + filename)
            run('tar xf ' + tarfilename)#讲二进制文件解压缩
        cmd = './' +filename + '/' + env.server_start#服务的运行脚本目录
        if not exists(env.server_log):
            sudo('mkdir -p %s'%env.server_log)#创建日志文件
            sudo('chown -R %s %s'%(env.user,env.server_log))
        #sh运行服务,指定服务消息输出到日志,服务后台运行
        run("sh -c '((nohup %s > %s 2>&1) & )'" % (cmd, env.server_log_out), pty=False)
停止服务

通过指令ps -ef|grep java|grep 服务名|grep -v grep|awk ‘{print $2}’ 的指令查找进程号,如果有正在运行的进程,就停止进程

@hosts(env.host_dev)
def stop():
    #获取服务的进程号
    pid = run(env.server_ps_cmd)
    print pid
    if pid:
        run('kill -9 %s' % pid)#如果进程正在运行就杀死进程
检查端口

通过指令curl http://localhost:9030/循环多次去访问服务端口,来确定服务是否启动成功。

@hosts(env.host_dev)
def check():
    times = 1
    with settings(warn_only = True):
        while times < 10:
            res = run(env.app_status_cmd)#判断是否能连接端口,循环判断
            if not res.failed:
                print('ok.')
                return True
            times = times + 1
            print('status != ok. wait for %s seconds to check again ' % str(env.status_check_interval))
            time.sleep(5)
    abort('check status failed after %s retires!' % str(times))
运行脚本

这里的步骤是

拉取项目
编译打包
拷贝到远程服务器
停止原服务
部署启动
检查端口
@hosts(env.host_dev) #指定远程服务器地址,用户名为env.user的值
def dev():
    execute(pull)
    execute(build)
    execute(release)
    execute(stop)
    execute(start)
    execute(check)

只要进入到fabfile.py的目录下,简单的输入一条指令fab dev,就可以将项目自动部署到远程服务器啦

一些关键字

定义参数:env
执行方法:execute
本地命令:local
远程命令:run
拷贝到远程:put
更多的一些语法可以参考这篇文章[转载]:https://fabric-chs.readthedocs.io/zh_CN/chs/tutorial.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值