2018-09-15

springboot中自動化打包部署


目錄

一米奸、maven插件
二昼接、目的
--1、打包成zip格式悴晰,目錄結(jié)構(gòu)
--2慢睡、將包上傳到服務(wù)器,并且自動部署
三铡溪、pom.xml的配置
--1漂辐、打包時(shí)添加一些常用信息到META-INF/MANIFEST.MF
--2、assembly配置
--3棕硫、shell腳本
--4髓涯、自動化部署配置
四、執(zhí)行命令哈扮,觸發(fā)自動打包部署


一纬纪、maven插件

plugin function
maven-jar-plugin maven 默認(rèn)打包插件,用來創(chuàng)建 project jar灶泵,負(fù)責(zé)將應(yīng)用程序打包成可執(zhí)行的jar文件育八。可在此處設(shè)置主類赦邻,manifest髓棋,排除對應(yīng)的配置文件等
maven-assembly-plugin 支持定制化打包方式,負(fù)責(zé)將整個(gè)項(xiàng)目按照自定義的目錄結(jié)構(gòu)打成最終的壓縮包惶洲,方便實(shí)際部署按声。可在此處設(shè)置打包拷貝路徑恬吕,配置签则,以及打包好的jar文件等
wagon-maven-plugin 將包上傳到服務(wù)器,并支持定制shell命令執(zhí)行

二铐料、目的

1渐裂、打包成zip格式,目錄結(jié)構(gòu):

原碼的目錄結(jié)構(gòu)

原目錄結(jié)構(gòu).PNG

目標(biāo)的目錄結(jié)構(gòu)
打包后的目錄結(jié)構(gòu).PNG

2钠惩、將包上傳到服務(wù)器柒凉,并且自動部署

三、pom.xml的配置

1篓跛、打包時(shí)添加一些常用信息到META-INF/MANIFEST.MF(添加Class-Path信息,設(shè)置主類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}'` #查找文件愧沟,管道后取最后一個(gè)字段作為文件名
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>

四盖奈、執(zhí)行命令,觸發(fā)自動打包部署

mvn clean package wagon:upload-single wagon:sshexec

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末北启,一起剝皮案震驚了整個(gè)濱河市卜朗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌咕村,老刑警劉巖场钉,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異懈涛,居然都是意外死亡逛万,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門批钠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宇植,“玉大人,你說我怎么就攤上這事埋心≈赣簦” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵拷呆,是天一觀的道長闲坎。 經(jīng)常有香客問我,道長茬斧,這世上最難降的妖魔是什么腰懂? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮项秉,結(jié)果婚禮上绣溜,老公的妹妹穿的比我還像新娘。我一直安慰自己娄蔼,他們只是感情好怖喻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岁诉,像睡著了一般罢防。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唉侄,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音野建,去河邊找鬼属划。 笑死恬叹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的同眯。 我是一名探鬼主播绽昼,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼须蜗!你這毒婦竟也來了硅确?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤明肮,失蹤者是張志新(化名)和其女友劉穎菱农,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柿估,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡循未,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秫舌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片的妖。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖足陨,靈堂內(nèi)的尸體忽然破棺而出嫂粟,到底是詐尸還是另有隱情,我是刑警寧澤墨缘,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布星虹,位于F島的核電站,受9級特大地震影響飒房,放射性物質(zhì)發(fā)生泄漏搁凸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一狠毯、第九天 我趴在偏房一處隱蔽的房頂上張望护糖。 院中可真熱鬧,春花似錦嚼松、人聲如沸嫡良。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寝受。三九已至,卻和暖如春罕偎,著一層夾襖步出監(jiān)牢的瞬間很澄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甩苛,地道東北人蹂楣。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像讯蒲,于是被迫代替她去往敵國和親痊土。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354