Spring Boot 项目自动发布

Spring Boot 项目自动发布


专题

Spring Boot 项目自动发布

Spring Boot 项目自动发布与Supervisor

简介

在公司从移动端转后端已经快一年了,使用的技术框架一直是Spring Boot,和以前大学时候基于Tomcat的不太一样。

这篇文章简单介绍下如何发布Spring Boot 项目,原先使用Tomcat时候,发布的文件是war文件,现在使用Spring Boot就变得很简单了,直接是一个jar文件,启动方式按照启动jar文件方式即可。

准备工作

使用Idea创建一个带Spring Boot的项目,使用gradle管理项目。

使用gradle依赖很简单,同时创建两个Controller,一个用户表示线上api接口,一个表示心跳接口,用于测试。

dependencies {
    compileOnly('org.projectlombok:lombok')

    compile('org.springframework.boot:spring-boot-starter-web')

    testCompile('org.springframework.boot:spring-boot-starter-test')
}
@Slf4j
@RestController
public class HelloWorldController {

    @Value("${app.env}")
    String env;

    @RequestMapping(path = "/hello", method = RequestMethod.GET)
    public Object hello() {
        log.info("hello>>>");

        Map<String, Object> map = new HashMap<>();
        map.put("hello", "world");
        map.put("env", env);

        log.info("map = " + map);
        return map;
    }
}
@Slf4j
@RestController
public class HeartbeatController {

    @RequestMapping(path = "/heartbeat")
    public Object heartbeat() {
        return "success";
    }
}

同时配置好对应的配置文件,我这有三个配置文件,一个dev环境,一个表示prod环境,还有一个表示开关。

image

Spring支持选择对应的config文件,开发时候,配置成dev,则生效的文件application-dev.properties

spring.profiles.active=dev
#spring.profiles.active=prod

dev

server.port=8080
app.env=dev
logging.config=classpath:logback-spring.xml

prod

server.port=8088
app.env=prod
logging.config=classpath:logback-spring.xml

我这边用app.env字段表示不同环境的内容,实际情况,可以配置数据库的内容,开发和线上的数据库是不一样的。

启动程序,然后测试下请求。

curl http://127.0.0.1:8080/hello    
{"hello":"world","env":"dev"}

数据是正常的,env读取的也是dev数据。

编译和发布

由于项目使用gradle管理,那么在发布时候,直接使用gradle命令编译即可,命令如下,clean是可选的,不过一般在本地开发然后再发布,建议先clean下。

./gradlew clean build

编译成功后,在项目生成目录中可以找到对应的jar文件,路径是./build/libs/springboot-deploy-demo-0.0.1-SNAPSHOT.jar

可以直接使用java命令来启动。

image

为了方便起见我在项目中写个简单脚本,编译成功后,复制目标文件到相应的目录,然后直接同步到服务器即可。

#!/usr/bin/env bash

./gradlew clean build

cp build/libs/* deploy/

deploy 目录除了有目标文件外,还有线上环境的配置文件,几个服务启动停止shell文件。

start.sh,很简单,在启动前,检查是否已经启动,在没有启动情况下,在启动服务。

#!/bin/sh


#get pwd
DIR_HOME="${BASH_SOURCE-$0}"
DIR_HOME="$(dirname "$DIR_HOME")"
PRGDIR="$(cd "${DIR_HOME}"; pwd)"

jarfile=$PRGDIR/springboot-deploy-demo-0.0.1-SNAPSHOT.jar

#get runing pid
pid=$(ps -ef | grep java | grep $jarfile | awk '{print $2}')

#create log dir
mkdir -p $PRGDIR/log/

if [ "$pid" != "" ];then
    echo "ERROR: $jarfile is running! pid=$pid. You must stop it first!"
else
    nohup java -jar $jarfile -Dfile.encoding=UTF-8 --spring.config.location=$PRGDIR/ >$PRGDIR/log/start.log 2>&1 &
    pid=$(ps -ef | grep java | grep $jarfile | awk '{print $2}')
    echo "INFO: $jarfile is running! pid=$pid"

    url="http://127.0.0.1:8088/heartbeat";
    echo $url
    while [ true ]
    do
        sleep 1
        HTTP_CODE=`curl -G -m 10 -o /dev/null -s -w %{http_code} $url`
        echo "http code: ${HTTP_CODE}"
        if [ ${HTTP_CODE} -eq 200 ]
        then
            echo "server start success..."
            exit 0
        fi
    done
fi

同时启动前,需要配置spring boot运行的参数,最重要的有Spring Boot启动的配置文件的位置--spring.config.location,我配置的位置是./

需要注意的是,prod的配置文件,一些参数需要注意路径,开发中路径是classpath:开头,线上是不需要的,当然了也是根据实际情况来看。

server.port=8088
app.env=prod
logging.config=logback-spring.xml

在启动服务后,会尝试调用相应的接口,测试启动是否成功。

url="http://127.0.0.1:8088/heartbeat";
echo $url
while [ true ]
do
    sleep 1
    HTTP_CODE=`curl -G -m 10 -o /dev/null -s -w %{http_code} $url`
    echo "http code: ${HTTP_CODE}"
    if [ ${HTTP_CODE} -eq 200 ]
    then
        echo "server start success..."
        exit 0
    fi
done

stop.sh

停止服务很简单,直接查找对应的进程,然后杀掉,这里需要注意进程名字是以jar文件来查找的。

#!/bin/sh

process=springboot-deploy-demo-0.0.1-SNAPSHOT.jar

ifrun=$(ps -ef | grep $process | grep java)
if [ "$ifrun" != "" ];then
    kill -9 `ps -ef | grep $process | grep java | awk '{print $2}'`
    echo "INFO: $process is stoped!"
else
    echo "WARN: Not found $process running."
fi

restart.sh

这个比较简单,就是先停止,再启动。

#!/bin/sh

./stop.sh
./start.sh

同步到服务器

这里做简单演示,我使用的是Ubuntu虚拟机,使用scp命令上传到服务器上,实际情况可以根据自己需求来选择,比如使用svn,ftp等。

scp deploy/* xiaqiulei@192.168.153.134:~/deploy

然后ssh登陆上192.168.153.134机器,进入deploy目录,执行./start即可。

示例:

$ scp deploy/* xiaqiulei@192.168.153.134:~/deploy
xiaqiulei@192.168.153.134's password: 
application-prod.properties                                                                                                                                                                  100%   63    84.7KB/s   00:00    
application.properties                                                                                                                                                                       100%   27    26.4KB/s   00:00    
deploy/log: not a regular file
logback-spring.xml                                                                                                                                                                           100%  881   753.4KB/s   00:00    
restart.sh                                                                                                                                                                                   100%   32    23.3KB/s   00:00    
springboot-deploy-demo-0.0.1-SNAPSHOT.jar                                                                                                                                                    100%   15MB  32.5MB/s   00:00    
start.sh                                                                                                                                                                                     100%  970     1.5MB/s   00:00    
stop.sh                                                                                                                                                                                      100%  291   169.0KB/s   00:00    

$ ssh xiaqiulei@192.168.153.134
xiaqiulei@192.168.153.134's password: 
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-109-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

299 packages can be updated.
161 updates are security updates.

Last login: Tue Apr 24 23:04:57 2018 from 192.168.153.1

# xiaqiulei @ ubuntu in ~ [23:07:59] 
$ cd deploy 

# xiaqiulei @ ubuntu in ~/deploy [23:08:01] 
$ ./start.sh 
INFO: /home/xiaqiulei/deploy/springboot-deploy-demo-0.0.1-SNAPSHOT.jar is running! pid=4645
http://127.0.0.1:8088/heartbeat
http code: 000
http code: 000
http code: 000
http code: 000
http code: 000
http code: 200
server start success...

总结

本文只是简单介绍使相关脚本发布Spring Boot服务到linux机器上,基本满足小项目需求。

当然了,还有不够完善的地方,比如启动的方式是nohup,当进程挂掉以后,不能够自动重启,高级的用法是使用supervisor

再比如,scp同步的时候,都是简单的文件覆盖,比较友好的方式是,先备份原先的文件,然后再同步文件,这样如果服务有问题,还可以回滚。

源码地址

源码地址 https://github.com/LiushuiXiaoxia/springboot-deploy-demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,230评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,261评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,089评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,542评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,542评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,544评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,922评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,578评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,816评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,576评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,658评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,359评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,920评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,859评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,381评论 2 342

推荐阅读更多精彩内容