1、适用范围
SpringBoot项目;
qone测试部署;
j-one线上部署;
通过直接启动java进程的方式启动springboot项目,非容器的方式。
2、项目及部署环节的注意事项
2.1 SpringBoot项目注意事项
2.1.1 项目结构
本SpringBoot项目的结构如下
2.1.2 打包后的结构
Springboot项目打包出来的是zip包,结构如下
程序名-版本-package.zip |-- bin |-- start.sh |-- stop.sh |-- conf |-- xxx.properties |-- 其他配置 |-- lib |-- 依赖的jar |
子目录 |
说明 |
bin |
放shell脚本,必须有start.sh和stop.sh,分别用于启动进程和停止进程 |
conf |
提取出来的配置文件目录,一般为.properties,或者.yaml等 |
lib |
程序依赖的jar包 |
红色部分根据程序而定。
目录说明如下
2.1.3进程启动和停止
j-one上部署时,会调用bin/start.sh来启动进程,而每个程序都有不同的配置及jar包,且进程启动名称及JVM参数也不一样,因此这个shell脚本需要根据自己的程序的特点进行修改,下面是样例程序的start.sh,
#!/bin/bash # START DEMO #set -o errexit set -o nounset #The vars can be used #-------------------------- # $def_app_id # $def_app_name # $def_app_domain # $def_app_deploy_path # $def_path_app_log # $def_path_app_data # $def_group_id # $def_instance_id # $def_instance_name # $def_instance_path # $def_host_ip #--------------------------
# 准备进程启动环境并启动进程 function start_process { # 定位程序所在根目录 BASEDIR=`dirname $0`/.. BASEDIR=$(readlink -f `(cd "$BASEDIR"; pwd)`) APP_HOME=$BASEDIR echo "$APP_HOME"
# 设置classpath环境 JARS="$APP_HOME/conf" LIB=$APP_HOME/lib
if [ -d $LIB ]; then for i in $LIB//.jar; do JARS="$JARS":$i done fi if [ -d $LIB ]; then for i in $LIB/*.jar; do JARS="$JARS":$i done fi export JARS
# 设置变量,如进程名 programName=$def_app_name # 后台启动进程 nohup java -Dprogram.name=$programName -Xms256m -Xmx256m -Xloggc:./gc.vgc -XX:+PrintGCDateStamps -Dfile.encoding=UTF-8 -cp $JARS com.jd.ql.e2e.ws.App & }
# 检测进程是否存在 function check_instance { pgrep -lf "program.name=$def_app_name" >/dev/null # 注意此处instance_pattern不要只写应用名,会把系统启动脚本也杀掉的 }
# 启动进程入口,包括进程检测和进程启动 function start_instance { local -i retry=0 if check_instance; then echo "ERROR: instance process has already been started" exit 1 fi
start_process
sleep 3 echo "grep $def_app_name count:".`ps axu | grep "program.name=$def_app_name" | grep -v "grep" | wc -l` >> ./c.txt echo "Instance started successfully" while true; do if check_instance; then echo "Instance started successfully" break elif (( retry == 5 ));then echo "ERROR: starting up instance has timed out" exit 1 else echo -n "." sleep 0.5 retry=$(( $retry + 1 )) fi done }
start_instance |
下面是stop.sh的样例
#!/bin/bash # STOP DEMO #set -o errexit set -o nounset #The vars can be used #-------------------------- # $def_app_id # $def_app_name # $def_app_domain # $def_app_deploy_path # $def_path_app_log # $def_path_app_data # $def_group_id # $def_instance_id # $def_instance_name # $def_instance_path # $def_host_ip #-------------------------- # function check_instance { pgrep -lf "program.name=$def_app_name" >/dev/null # 注意此处instance_pattern不要只写应用名,会把系统启动脚本也杀掉的,必须包含实例完整路 } function stop_instance { local -i retry=0 if ! check_instance; then echo "WARNING: instance process not found, nothing to stop" >&2 exit 0 fi pkill -f "program.name=$def_app_name" # 注意此处instance_pattern不要只写应用名,会把系统启动脚本也杀掉的,必须包含实例完整路径 while (( retry < 20 )); do if ! check_instance; then echo "Instance stopped successfully" return else echo -n "." sleep 0.5 retry=$(( $retry + 1 )) fi done echo "ERROR: instance process still alive, sending SIGKILL ..." >&2 pkill -9 -f "program.name=$def_app_name" # 注意此处instance_pattern不要只写应用名,会把系统启动脚本也杀掉的,必须包含实例完整路 exit $? } stop_instance |
2.1.4 定制打包
Maven项目在编译打包时,一般情况下springboot项目会打包成一个大jar包,通过在pom中配置插件maven-assembly-plugin,并指定自定义的package.xml,这样打出来的就是需要的运行包。
pom中build/plugins下面指定打包插件,其中package.xml位于src/main/resources下面
<!-- 下面是按package配置进行打包 --> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2</version> <configuration> <descriptors> <descriptor>src/main/resources/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> |
这个package是一个项目打一个包的,如果一个项目要打多个包,需在网上自己找资料,下面是打单个包的样例
<assembly> <id>package</id> <formats> <format>zip</format> <format>dir</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <fileSets> <fileSet> <directory>src/main/bin</directory> <outputDirectory>bin</outputDirectory> </fileSet> <fileSet> <directory>src/main/resources</directory> <outputDirectory>conf</outputDirectory> </fileSet> </fileSets> <dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly> |
运行打包命令后,在target下生成了对应的目录
2.2 J-one上注意事项
2.2.1 新应用申请
如下图,在j-one上申请新应用时,应用类型要选择application_worker,只有选择这个类型,才会部署时调用bin/start.sh启动应用。
2.2.2 编译打包
通过配置打包插件(见2.1.4)打包出来的是一个**-package目录和*-package.zip,而j-one平台在编译后,取得是某个目录,然后做zip操作,故这里抽包地址应选择target/**-package这个目录。
如上配置后,点击"开始构建",则构建后生成的包如下,和本地打出的是一致的
2.3 申请镜像注意事项
申请镜像时也要注意选择worker镜像。
3、j-one部署(生产环境)
3.1 部署过程
按照正常步骤进行项目的发布,如下图
注释1:
查看部署过程中的日志信息
注释2:
查看部署机器的文件或程序打印日志内容;
程序进程查看,部署机器CPU、内存、磁盘资源查看;
注释3:
配置nginx
3.2 查看部署失败过程中脚本执行的日志信息
通过点击注释1位置,会弹出一个框
3.3 脚本中可以使用的变量
在start.sh运行过程中,可以使用一些和程序有关变量,已知的变量定义如下
变量名 |
变量说明 |
def_app_id |
获取应用启动后的进程id |
def_app_name |
应用名称 |
def_app_domain |
应用域名 |
def_app_deploy_path |
应用发布路径 |
def_path_app_log |
应用日志路径 |
def_instance_id |
获取实例id |
def_instance_name |
获取实例名称 |
def_instance_path |
获取实例路径 |
def_host_ip |
获取本机ip |
def_group_id |
? |
变量使用样例及结果
- shell脚本中输出变量值
echo "var def_app_id : $def_app_id" echo "var def_app_name : $def_app_name" echo "var def_app_domain : $def_app_domain" echo "var def_app_deploy_path : $def_app_deploy_path" echo "var def_path_app_log : $def_path_app_log" echo "var def_instance_id : $def_instance_id" echo "var def_instance_name : $def_instance_name" echo "var def_instance_path : $def_instance_path"
- 输出结果
var def_app_id : 32062 var def_app_name : ql-e2e var def_app_domain : worker.test.com var def_app_deploy_path : /export/Packages/ql-e2e/20180419202539 var def_path_app_log : /export/Logs/ql-e2e var def_instance_id : 675281 var def_instance_name : server1 var def_instance_path : /export/Instances/ql-e2e/server1
|
3.4 确认进程是否启动
可通过查看进程的方式确认是否有进程存在
点击注释2的图标,弹出如下界面
通过logbook查看日志是否在正常输出
3.5 配置nginx
如果springboot项目中发布了REST服务,则可以通过配置nginx来进行访问。
点击注释3的图标进行配置。
4、qone部署(测试环境)
比j-one的可控制程度要高,qone部署的机器,本地可登录,也是调用bin/start.sh启动进程,如果有问题,可直接登录机器,修改shell脚本,启动shell进行调试。