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)
部署与运行
这里的步骤是
@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