zoukankan      html  css  js  c++  java
  • weblogic服务器自动化发布脚本操作流程

      在生产环境中,往往服务器有多台,每次增量发布都需要把代码覆盖到每台服务器上面和进行备份,这样费时又费力,所有需要有一套自动化发布的流程,我这次记录的是我在工作中用到的一套发布流程和脚本,大家可以参考学习一下.

    首先,用到的是apache基金会的ant项目.

    所有版本下载地址:https://archive.apache.org/dist/ant/binaries/

    我这边用的是1.9.2版本

    一般在生产环境中,应用目录如下:

    如果没有release目录,自己新建一个.

    然后将下载好的apache-ant-1.9.2放到release目录下

    并在release目录下新建一个目录,取名一般为需要发布的应用服务名,用于区分,因为一台服务器可能有多个应用服务需要发布,A应用和B应用,所以需要用应用服务名来区分发布的应用

    A或者B发布目录存放如下文件:

    首先,done目录是存放每次需要发布的代码,格式是tgz包,代码目录需要到根目录下,一般是web目录,比如web-WEB-INF-classes-.....等等,将需要发布的包放入done下面,用打包命令进行打包   tar -zcvf A.tgz web

    ant-multi-shelll.xml  文件如下  可以直接copy,不需要改动

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="ant-multi-shell" xmlns:ac="antlib:net.sf.antcontrib">
    <taskdef resource="net/sf/antcontrib/antcontrib.properties" />
    <taskdef name="xmltask" classname="com.oopsconsultancy.xmltask.ant.XmlTask" />

    <macrodef name="host-property">
    <attribute name="filename" default="apphosts.xml" />
    <attribute name="hostip" default="" />
    <sequential>
    <property name="hosts" value="" />
    <property name="rhosts" value="" />
    <property name="host" value="" />
    <hostinfo prefix="localhost"/>

    <xmltask source="@{filename}">
    <call path="/application">
    <param name="release.path" path="release/text()"/>
    <actions>
    <property name="release.path" value="@{release.path}" />
    </actions>
    </call>
    <call path="/application/host">
    <param name="host.username" path="username/text()"/>
    <param name="host.password" path="password/text()"/>
    <param name="host.ip" path="ip/text()"/>
    <actions>
    <propertyregex override="yes" property="hosts" input="@{host.username}:@{host.password}@@" regexp="(.*)" select="${hosts}1"/>
    <propertyregex override="yes" property="hosts" input="@{host.ip};" regexp="(.*)" select="${hosts}1"/>
    <ac:if>
    <ac:equals arg1="${localhost.ADDR4}" arg2="@{host.ip}" />
    <ac:then/>
    <ac:else>
    <propertyregex override="yes" property="rhosts" input="@{host.username}:@{host.password}@@" regexp="(.*)" select="${rhosts}1"/>
    <propertyregex override="yes" property="rhosts" input="@{host.ip};" regexp="(.*)" select="${rhosts}1"/>
    </ac:else>
    </ac:if>
    <ac:if>
    <ac:equals arg1="@{hostip}" arg2="@{host.ip}" />
    <ac:then>
    <propertyregex override="yes" property="host" input="@{host.username}:@{host.password}@@" regexp="(.*)" select="${host}1"/>
    <propertyregex override="yes" property="host" input="@{host.ip};" regexp="(.*)" select="${host}1"/>
    </ac:then>
    </ac:if>
    </actions>
    </call>
    </xmltask>
    </sequential>
    </macrodef>

    <macrodef name="multi-scp">
    <attribute name="hosts" />
    <attribute name="destpath" default="" />
    <attribute name="filename" />
    <sequential>
    <ac:for list="@{hosts}" param="host" delimiter=";" parallel="true">
    <ac:sequential>
    <scp trust="yes" todir="@{host}:@{destpath}/done" file="@{filename}" />
    </ac:sequential>
    </ac:for>
    </sequential>
    </macrodef>

    <macrodef name="multi-ssh">
    <attribute name="hosts" />
    <attribute name="cmmdpath" default="" />
    <attribute name="commands" />
    <attribute name="parallel" default="true"/>
    <attribute name="keybased" default="no"/>
    <sequential>
    <ac:for list="@{hosts}" param="host" delimiter=";" parallel="@{parallel}">
    <ac:sequential>
    <local name="host.username"/>
    <local name="host.password"/>
    <local name="host.ip"/>
    <propertyregex property="host.username" input="@{host}" regexp="(.*):" select="1"/>
    <propertyregex property="host.password" input="@{host}" regexp=":(.*)@" select="1"/>
    <propertyregex property="host.ip" input="@{host}" regexp="@(.*)" select="1"/>
    <ac:if>
    <ac:equals arg1="@{keybased}" arg2="yes" />
    <ac:then>
    <sshexec trust="yes" host="${host.ip}" username="${host.username}" keyfile="${user.home}/.ssh/id_dsa" command="cd @{cmmdpath}; @{commands};"/>
    </ac:then>
    <ac:else>
    <sshexec trust="yes" host="${host.ip}" username="${host.username}" password="${host.password}"
    command="cd @{cmmdpath}; @{commands};"/>
    </ac:else>
    </ac:if>
    </ac:sequential>
    </ac:for>
    </sequential>
    </macrodef>
    </project>

    apphosts.xml 文件是配置服务器信息的

    <?xml version="1.0" encoding="UTF-8"?>

    <application>
    <name>请填写服务名 A</name>
    <release>请填写发布目录 /tpdata/release/A</release>
    <host>
    <ip>服务器一IP</ip>
    <username>你懂</username>
    <password>你懂</password>
    </host>
    <host>
    <ip>服务器二IP</ip>
    <username>你懂</username>
    <password>你懂</password>
    </host>

    多个就填写多个
    </application>

    batch-deploy.sh    -->

    #!/bin/bash
    app_path=/tpdata/applications/A   填写应用目录  
    app_path=${app_path%/}
    app_root=${app_path%/*}
    app_name=${app_path##*/}
    file_prex=${1%.*}
    echo "the application's location is $app_path"
    echo "the release's signature is $file_prex"
    file_tgz=$file_prex.tgz
    if test -f $file_tgz; then
    echo "deploying $file_tgz ..."
    else
    echo "can not find file $file_tgz"
    exit
    fi
    ant -buildfile build_msh.xml upload-file -Dfilename="$file_tgz"
    ant -buildfile build_msh.xml multi-shell -Dcommands="sh ./deploy.sh $file_tgz" -Dparallel=true

     batch-restart-one.sh

    #!/bin/bash
    domain_path=/tpsys/applications/testdomain/script   [停启服务器脚本目录]
    ant -buildfile build_msh.xml remote-shell -Dremoteip="服务器1IP" -Dcommands="cd $domain_path;sh 停脚本"&
    ant -buildfile build_msh.xml remote-shell -Dremoteip="服务器2IP" -Dcommands="cd $domain_path;sh 停脚本"&
    ant -buildfile build_msh.xml remote-shell -Dremoteip="服务器1IP" -Dcommands="cd $domain_path;sh 启脚本"&
    ant -buildfile build_msh.xml remote-shell -Dremoteip="服务器2IP" -Dcommands="cd $domain_path;sh 启脚本"&
    date

    build_msh.xml    直接copy  不需要改

    <?xml version="1.0" encoding="UTF-8"?>

    <project name="msh-build" default="multi-shell" basedir=".">
    <import file="ant-multi-shelll.xml"/>

    <target name="init">
    <host-property filename="apphosts.xml" />
    </target>

    <target name="upload-file" depends="init">
    <property name="filename" value="test.sh"/>
    <property name="destpath" value="${release.path}" />
    <multi-scp hosts="${rhosts}" destpath="${destpath}" filename="${filename}" />
    </target>

    <target name="multi-upload" depends="init">
    <property name="filename" value="test.sh"/>
    <property name="destpath" value="${release.path}" />
    <multi-scp hosts="${hosts}" destpath="${destpath}" filename="${filename}" />
    </target>

    <target name="remote-upload">
    <property name="filename" value="test.sh"/>
    <property name="remoteip" value="192.168.59.137" />
    <property name="destpath" value="${release.path}" />
    <host-property filename="apphosts.xml" hostip="${remoteip}" />
    <multi-scp hosts="${host}" destpath="${destpath}" filename="${filename}" />
    </target>

    <target name="multi-shell" depends="init">
    <property name="cmmdpath" value="${release.path}" />
    <property name="commands" value="cat 1.txt" />
    <property name="parallel" value="false" />
    <multi-ssh hosts="${hosts}" cmmdpath="${cmmdpath}" commands="${commands}" parallel="${parallel}" />
    </target>

    <target name="remote-shell">
    <property name="remoteip" value="192.168.59.137" />
    <property name="cmmdpath" value="${release.path}" />
    <property name="commands" value="cat 1.txt" />
    <host-property filename="apphosts.xml" hostip="${remoteip}" />
    <multi-ssh hosts="${host}" cmmdpath="${cmmdpath}" commands="${commands}" parallel="false" />
    </target>
    </project>

    deploy.sh

    #!/bin/bash
    app_path=/tpdata/applications/A

    app_path=${app_path%/}
    app_root=${app_path%/*}
    app_name=${app_path##*/}

    file_prex=${1%.*}
    today=`date +%Y-%m-%d`

    echo "the application's app_path is $app_path"
    echo "the application's app_root is $app_root"
    echo "the application's app_name is $app_name"
    echo "the release's signature is $file_prex"

    file_tgz=$file_prex.tgz
    if test -f $file_tgz; then
    echo "deploying $file_tgz ..."
    else
    echo "can not find file $file_tgz"
    exit
    fi


    mkdir -p done

    if test -f done/$file_prex.$today.tgz; then
    echo "find done/$file_prex.$today.tgz, skip full backup."
    else
    ls -x1 $app_path > $app_name.list
    tar -czf $app_name.$today.tgz -C $app_path -T $app_name.list
    mv $app_name.$today.tgz done/
    rm $app_name.list
    fi

    echo "files backuping ..."
    tar -tzf $file_tgz > $file_prex.list
    tar -czf $file_prex.old.tgz -C $app_path -T $file_prex.list
    rm $file_prex.list
    mv $file_prex.old.tgz done/

    echo "files updating ..."
    tar -xzf $file_tgz -C $app_path
    mv $file_tgz done/

    echo "$file_tgz" >> done/$app_name.$today.released

    echo "`date '+%Y-%m-%d %H:%M:%S'`: [$1] deploy done. " >> $app_name.release.log

    echo "deply done."

    recover.sh

    #!/bin/bash
    app_path=/tpdata/applications/A

    app_path=${app_path%/}
    app_root=${app_path%/*}
    app_name=${app_path##*/}

    file_prex=${1%.*}
    file_prex=${file_prex##*/}
    today=`date +%Y-%m-%d`

    echo "the application's location is $app_path"
    echo "the release signature is $file_prex"

    file_tgz=$file_prex.old.tgz
    if test -f "done/$file_tgz"; then
    echo "recovering $file_tgz ..."
    else
    echo "can not find file $file_tgz"
    exit
    fi

    file_release=$app_name.$today.released
    if test $2; then
    file_release=$app_name.$2.released
    fi
    if !(test -f "done/$file_release"); then
    echo "can not find file $file_release"
    exit
    fi

    echo "files backuping ..."
    tar -tzf done/$file_tgz > $file_prex.list
    tar -czf $file_prex.cover.tgz -C $app_path -T $file_prex.list
    mv $file_prex.cover.tgz done/
    rm $file_prex.list
    rm -rf $app_path/web

    echo "files updating ..."
    tar -xzf "done/$file_tgz" -C $app_path

    sed -i '/'"$file_prex.tgz"'/d' done/$file_release

    echo "`date '+%Y-%m-%d %H:%M:%S'`: [$file_prex.tgz] recover done. " >> $app_name.release.log

    echo "recover done."

    如上,就把自动化发布的脚本都准备全了,下面需要配置一下环境变量

    到/home/weblogic/目录下  我的.bash_profile文件在这个目录

    命令如下

    cd /home/weblogic
    vim .bash_profile
    新增:
    ANT_HOME=/tpsys/applictions/release/apache-ant-1.9.2   [配置ANT目录]
    JAVA_HOME=/usr/java/jdk1.6.0_29     [JDK目录]
    PATH=$ANT_HOME/bin:$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin   

    保存后执行source .bash_profile使生效

    这些配置如果有多台服务器,则每台都需要配置

    然后每次发布只需要将需要发布的包打成tgz包放入其中一台服务器的done目录下,

    在执行 sh batch-deploy.sh  done/A.tgz    就会自动将发布包分发到所有服务器进行覆盖,并且备份原代码.

    最后执行重启脚本 sh  batch-restart-one.sh

    当发布出现问题,需要回退时候  执行 sh recover.sh 

    如果出现文件权限文件,请执行 chmod 777 文件名  

    大功告成!

  • 相关阅读:
    关于工作习惯的一点思考
    BulkSqlCopy 批量导入数据(Ef支持)
    记录下最近项目中常用到的SQL语句
    对象化前端表单(Form)提交
    Python描述符 (descriptor) 详解
    Python装饰器之 property()
    Python魔法方法之属性访问 ( __getattr__, __getattribute__, __setattr__, __delattr__ )
    Python魔法方法总结及注意事项
    面向对象编程(二)
    面向对象编程(一)
  • 原文地址:https://www.cnblogs.com/wnhbx/p/11652245.html
Copyright © 2011-2022 走看看