2018-09-15

springboot中自动化打包部署


目录

一、maven插件
二、目的
--1、打包成zip格式,目录结构
--2、将包上传到服务器,并且自动部署
三、pom.xml的配置
--1、打包时添加一些常用信息到META-INF/MANIFEST.MF
--2、assembly配置
--3、shell脚本
--4、自动化部署配置
四、执行命令,触发自动打包部署


一、maven插件

plugin function
maven-jar-plugin maven 默认打包插件,用来创建 project jar,负责将应用程序打包成可执行的jar文件。可在此处设置主类,manifest,排除对应的配置文件等
maven-assembly-plugin 支持定制化打包方式,负责将整个项目按照自定义的目录结构打成最终的压缩包,方便实际部署。可在此处设置打包拷贝路径,配置,以及打包好的jar文件等
wagon-maven-plugin 将包上传到服务器,并支持定制shell命令执行

二、目的

1、打包成zip格式,目录结构:

原码的目录结构

原目录结构.PNG

目标的目录结构
打包后的目录结构.PNG

2、将包上传到服务器,并且自动部署

三、pom.xml的配置

1、打包时添加一些常用信息到META-INF/MANIFEST.MF(添加Class-Path信息,设置主类MainClass)

pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <finalName>${project.artifactId}</finalName>
        <excludes>
            <exclude>**/*.properties</exclude>
            <exclude>**/assembly.xml</exclude>
        </excludes>
        <archive>
            <index>1</index>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>com.zhengjia.Application</mainClass>
            </manifest>
            <manifestEntries>
                <mode>development</mode>
                <Class-Path>conf/</Class-Path>
                <version>${project.version}</version>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>
2、assembly配置

pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.5.5</version>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <descriptors>
            <descriptor>src/main/resources/assembly.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
        <execution>
            <id>copy-scripts</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

assembly.xml

<assembly>
    <id>bin</id>
    <formats>
        <format>zip</format>
    </formats>

    <dependencySets>
        <dependencySet>
            <useProjectArtifact>true</useProjectArtifact>
            <outputDirectory>lib</outputDirectory>
            <unpack>false</unpack>
        </dependencySet>
    </dependencySets>

    <fileSets>
        <fileSet>
            <directory>src/main/bin/</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>startServer.sh</include>
            </includes>
            <fileMode>0755</fileMode>
            <lineEnding>unix</lineEnding>
        </fileSet>
        <fileSet>
            <directory>${project.build.directory}</directory>
            <outputDirectory></outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
            <fileMode>0755</fileMode>
        </fileSet>
        <fileSet>
            <directory>src/main/resources/</directory>
            <outputDirectory>conf/</outputDirectory>
            <includes>
                <include>application.properties</include>
                <include>application-dev.properties</include>
                <include>application-pro.properties</include>
            </includes>
            <fileMode>0755</fileMode>
        </fileSet>
    </fileSets>
</assembly>
3、shell脚本
#!/usr/bin/env bash
#@Copyright (C) Locket, Inc.

SERVER_NAME=zhengjia-api
#脚本文件名称
FINDNAME=$0
#检查脚本是否存在
#FINDNAME=`ls -ld $FINDNAME | awk '{print $NF}'` #查找文件,管道后取最后一个字段作为文件名
while [ -h $FINDNAME ] ; do FINDNAME=`ls -ld $FINDNAME | awk '{print $NF}'` ; done
APP_HOME=`echo $FINDNAME | sed -e 's@/[^/]*$@@'`
unset FINDNAME

if [ "$APP_HOME" = '.' ]; then
   APP_HOME=$(echo `pwd` | sed 's/\/bin//')
else
   APP_HOME=$(echo $APP_HOME | sed 's/\/bin//')
fi

echo "APP_HOME: $APP_HOME"

# Create pid file
# -d 检测文件是否是目录,如果是,则返回 true。
if [ ! -d "$APP_HOME"/pids ]; then
    mkdir "$APP_HOME"/pids
fi

HEAP_MEMORY=512m
MAX_HEAP_MEMORY=2048m
PERM_MEMORY=256m
MAX_PERM_MEMORY=512m

PIDFILE="$APP_HOME"/pids/$SERVER_NAME.pid
#echo "PIDFILE = $PIDFILE"

start() {
    if test -e "$PIDFILE"
    then
        if test -d "/proc"/$(cat "$PIDFILE")
        then
            echo "$SERVER_NAME service still running, please stop it first"
            exit 1
        fi
    else
        touch "$PIDFILE"
    fi

    if test -e "$APP_HOME"/$SERVER_NAME.jar
    then
        echo  "starting $SERVER_NAME ... "
        JAVA_OPTS="-server -XX:+HeapDumpOnOutOfMemoryError "

        shift
        ARGS=($*)
        for ((i=0; i<${#ARGS[@]}; i++)); do
            case "${ARGS[$i]}" in
            -D*)    JAVA_OPTS="${JAVA_OPTS} ${ARGS[$i]}" ;;
            -Heap*) HEAP_MEMORY="${ARGS[$i+1]}" ;;
            -Perm*) PERM_MEMORY="${ARGS[$i+1]}" ;;
            esac
        done
        JAVA_OPTS="${JAVA_OPTS} -Xms${HEAP_MEMORY} -Xmx${MAX_HEAP_MEMORY} -XX:PermSize=${PERM_MEMORY} -XX:MaxPermSize=${MAX_PERM_MEMORY} -Dapp.name=$SERVER_NAME"
        echo "start jvm args ${JAVA_OPTS}"
        nohup java $JAVA_OPTS -Dfile.encoding=UTF-8 -Duser.dir="$APP_HOME" -jar "."/$SERVER_NAME.jar >/dev/null 2>&1 &
        echo $! > "$PIDFILE"
        echo "started $SERVER_NAME OK"
    else
        echo "could not find $SERVER_NAME"
        exit 1
    fi
}

stop() {

    if test -e "$PIDFILE"
    then
        echo "stopping server"
        if kill -TERM `cat "$PIDFILE"`
        then
            sleep 2
            loop_check_process_status 3
        elif
            kill -KILL `cat "$PIDFILE"`
        then
            sleep 2
            loop_check_process_status 3
        elif
            kill -9 `cat "$PIDFILE"`
        then
            echo "server stop OK"
            /bin/rm "$PIDFILE"
        fi
    else
        echo "no server running"
        exit 1
    fi
}

restart() {
    echo "restarting server"
    stop
    start "$1"
}

info() {
    echo "System Information:"
    echo "****************************"
    echo `head -n 1 /etc/issue`
    echo `uname -a`
    echo
    echo "JAVA_HOME=$JAVA_HOME"
    echo `$JAVA_HOME/bin/java -version`
    echo
    echo "APP_HOME=$APP_HOME"
}


loop_check_process_status() {
    COUNT=$1
    KILLED=false
    for (( i = 0; i < $COUNT; i++));do
        if test -d "$APP_HOME"/$(cat "$PIDFILE")
        then
            sleep 10
        else
            KILLED=true
            break
        fi
    done
    if $KILLED; then
        echo "server stop OK"
        /bin/rm "$PIDFILE"
    else
        echo "server stop failed"
    fi
}
case $1 in
start)
    start "$2"
    ;;

stop)
    stop
    ;;

restart)
    restart "$2"
    ;;
info)
    info
    ;;
*)
    echo "Usage: $0 {start|stop|restart}" >&2
    ;;

esac

exit 0

使用./startServer.sh (start|stop|restart)

4、自动化部署配置

pom.xml

<dependency>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>wagon-maven-plugin</artifactId>
    <version>1.0</version>
</dependency>



<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>wagon-maven-plugin</artifactId>
    <version>1.0</version>
    <configuration>
        <serverId>webserver</serverId>
        <fromFile>${project.build.directory}/${project.artifactId}-${project.version}.zip</fromFile>
        <url>scp://ip:port/bigscreen-api/zhengjia-api/</url>
        <commands>
            <command>cd /bigscreen-api/zhengjia-api/${project.artifactId}-${project.version}/;ls -al;./startServer.sh stop</command>
            <command>rm -rf /bigscreen-api/zhengjia-api/${project.artifactId}-${project.version}</command>
            <command>unzip /bigscreen-api/zhengjia-api/${project.artifactId}-${project.version}.zip -d /bigscreen-api/zhengjia-api/</command>
            <command>cd /bigscreen-api/zhengjia-api/${project.artifactId}-${project.version};source /etc/profile;./startServer.sh start;ps -ef|grep ${project.artifactId}</command>
        </commands>
        <displayCommandOutputs>true</displayCommandOutputs>
    </configuration>
</plugin>




<extensions>
    <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ssh</artifactId>
        <version>2.10</version>
    </extension>
</extensions>

maven中的setting

<server>
    <id>webserver</id>
    <username>root</username>
    <password>*********</password>
</server>

四、执行命令,触发自动打包部署

mvn clean package wagon:upload-single wagon:sshexec

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