1. 程式人生 > >實現websphere8.5的自動部署

實現websphere8.5的自動部署

提供以下幾種方式:

方式1.可以用jenkins現成的"WebSphere Deployer"外掛來實現;

方式2.與maven整合

參考http://stackoverflow.com/questions/14808814/deploy-a-web-application-on-websphere-8-5-using-maven-3

比如用was-maven-plugin外掛即可實現對war,ear包的自動部署,幫助請見:

https://github.com/orctom/was-maven-plugin


方式3.與ant整合     
http://www-01.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.javadoc.doc/web/apidocs/com/ibm/websphere/ant/tasks/InstallApplication.html?lang=en

具體的實現:

 <?xmlversion="1.0" encoding="UTF-8"?>

<projectname="wasant" basedir="."default="InstallAndStart">

          <propertyname="was.root" value="/mstr/IBM/WebSphere/AppServer" />

    <propertyname="wsanttasks.jar"value="${was.root}/plugins/com.ibm.ws.runtime.jar"/>

    <property name="app.name"value="test1"/>

    <property name="ear.file"value="/root/myweb-1.0-SNAPSHOT.war"/>

    <property name="contextroot"value="test1"/>

    <property name="node"value="CIPBAKap0Node01"/>

    <property name="cell"value="CIPBAKap0Node01Cell"/>

    <property name="server"value="server1"/>

    <property name="cluster"value="tesss"/>

    <property name="username"value="wasadmin"/>

    <property name="password"value="******"/>

    <property name="host"value="10.1.94.64"/>

    <property name="port"value="8880"/>

    <property name="conntype"value="SOAP"/>

 <!-- 使用到的任務 -->

    <taskdef name="wsStartServer"classname="com.ibm.websphere.ant.tasks.StartServer"classpath="${wsanttasks.jar}" />

    <taskdef name="wsStopServer"classname="com.ibm.websphere.ant.tasks.StopServer"classpath="${wsanttasks.jar}" />

    <taskdef name="wsInstallApp"classname="com.ibm.websphere.ant.tasks.InstallApplication"classpath="${wsanttasks.jar}" />

    <taskdef name="wsUninstallApp"classname="com.ibm.websphere.ant.tasks.UninstallApplication"classpath="${wsanttasks.jar}" />

    <taskdef name="wsStartApp"classname="com.ibm.websphere.ant.tasks.StartApplication"classpath="${wsanttasks.jar}" />

    <taskdef name="wsStopApp"classname="com.ibm.websphere.ant.tasks.StopApplication"classpath="${wsanttasks.jar}" />

    <taskdef name="wsListApps"classname="com.ibm.websphere.ant.tasks.ListApplications"classpath="${wsanttasks.jar}" />

    <taskdef name="wsAdmin"classname="com.ibm.websphere.ant.tasks.WsAdmin"classpath="${wsanttasks.jar}" />

<!-- 解除安裝應用-->

 <target name="wsUninstallApp" description="UninstallApplication ${app.name}">

         <wsUninstallApp

                       wasHome="${was.root}"

                       application="${app.name}"

                       conntype="${conntype}"

                       host="${host}"

                        port="${port}"

                       user="${username}"

                       password="${password}"

                       failonerror="fasle"/>

 </target>

  <!-- 安裝應用-->

 <target name="wsInstallApp"depends="wsUninstallApp" description="Install Application${app.name}">

         <wsInstallApp

                       wasHome="${was.root}"

                       ear="${ear.file}"

                        options="-node${node} -cell ${cell} -server ${server} -appname ${app.name} -contextroot${contextroot} -usedefaultbindings"

                             conntype="${conntype}"

                       host="${host}"

                        port="${port}"

                       user="${username}"

                       password="${password}"

                       failonerror="true"/>

 </target>

   <!-- 啟動應用-->

 <target name="wsStartApp"description="StartApp Application ${app.name}">

         <wsStartApp

                       wasHome="${was.root}"

                       application="${app.name}"

                       conntype="${conntype}"

                       host="${host}"

                       port="${port}"

                        user="${username}"

                       password="${password}"

                       failonerror="true"/>

 </target>

 <!-- 實際的任務組合    -->

 <target name="InstallAndStart"description="Install and Start ${app.name}">

  <antcalltarget="wsInstallApp"/>

  <antcalltarget="wsStartApp"/>

 </target>

</project>


注意:

a.installapp 目標將呼叫 uninstallapp 目標來確保企業應用程式已經解除安裝(如果已安裝)

b.執行./ws_ant.sh (該指令碼是安裝webshere時自帶的,位於安裝目錄的bin目錄下)

方式4.wasadmin  命令列(注意:應能ping同對方主機名,不然安裝應用的時候出錯)具體實現:

a.解除安裝應用./wsadmin.sh -conntype SOAP -host10.8.24.29 -port 8880 -user wasadmin -password ****** -lang jacl -c'$AdminApp uninstall test'

b.安裝應用./wsadmin.sh -conntype SOAP -host10.8.24.29 -port 8880 -user wasadmin -password ****** -lang jacl -c'$AdminApp install /root/myweb-1.0-SNAPSHOT.war {-node lvweiguang-PCNode01-cell lvweiguang-PCNode01Cell -server server1 -appname test  -contextroot/test -usedefaultbindings}'

c.啟動應用./wsadmin.sh -conntype SOAP -host10.8.24.29 -port 8880 -user wasadmin -password ****** -lang jacl -c'$AdminControl invoke [$AdminControl queryNamestype=ApplicationManager,node=lvweiguang-PCNode01,*] startApplication test'

注意:

1.當只有一個節點和server的時候-node lvweiguang-PCNode01 -cell lvweiguang-PCNode01Cell -serverserver1這些不需要指定;

2.不管用哪種方式部署,第一次部署,連線的時候都需要先進行ssl 認證,點Y回車即可,以後就不需要了。

另外關於“was的自帶lib會存在與war包中的web-inf/lib存在衝突版本的jar包,所以war包安裝完畢後,要在部署的war包的管理模組中設定:類裝入器順序 為“類已裝入並且是先使用本地類裝入器(父類最後)”問題的解決方案:

1.通過was自身的設定做全域性性的調整;

  1).在應用層級設定 “類裝入和更新檢測”,其中裝入順序為“<label title="指定是否在使用應用程式類裝入器之前使用父類裝入器來裝入類。" for="mode_PARENT_LAST" style="">類已裝入並且是先使用本地類裝入器(父類最後)”,war類裝入策略為“單一”。

     這樣在安裝部署war包的時候通過AdminConfig可以設定該應用的類載入策略和順序。

方法一:was命令實現

set appid[$AdminConfig getid /Deployment:pa/]    

#Identify thedeployed object and set    

set deployedApp[$AdminConfig showAttribute $appid deployedObject]    

set classldr[$AdminConfig showAttribute $deployedApp classloader]    

#show currentattribute values  

$AdminConfig showall$classldr    

#modify          

$AdminConfig modify$classldr {{mode PARENT_LAST}}  

如有需要更改warClassLoaderPolicy(SINGLE or MULTIPLE)  

$AdminConfigshowAttribute $deployedApp warClassLoaderPolicy  

$AdminConfig modify$deployedApp {{warClassLoaderPolicy SINGLE}}    

$AdminConfigsave    

方法二:ant實現程式碼:

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

<projectname="wasant" basedir="."default="InstallAndStart">

          <propertyname="was.root" value="/mstr/IBM/WebSphere/AppServer" />

    <propertyname="wsanttasks.jar"value="${was.root}/plugins/com.ibm.ws.runtime.jar"/>

    <property name="port"value="8880"/>

    <property name="conntype"value="SOAP"/>

   <spanstyle="color:#ff0000;"> <propertyname="app.war.loadpolicy" value="SINGLE" />  

    <propertyname="app.reload.enabled" value="true" /> 

    <propertyname="app.reload.interval" value="20" /> 

    <propertyname="app.war.loadpolicy" value="SINGLE" /> 

    <propertyname="app.class.load.mode" value="PARENT_LAST" /> 

    <propertyname="setDeployments"   

                value="set deployments[$AdminConfig getid /Deployment:${appname}/]"/> 

    <propertyname="setDeploymentsObject"   

                value="setdeploymentObject [$AdminConfig showAttribute $deployments deployedObject]"/> 

          <propertyname="modifyWarClassLoaderPolicy"   

                value="$AdminConfig modify$deploymentObject {{warClassLoaderPolicy SINGLE}}"/> 

    <propertyname="setClassLoaderMode" 

                    value="set classloader[$AdminConfig showAttribute $deploymentObject classloader]" /> 

    <propertyname="modifyClassLoaderMode"   

                value="$AdminConfig modify$classloader {{mode ${app.class.load.mode}}}"/></span>

 <!-- 使用到的任務 -->

    <taskdef name="wsStartServer"classname="com.ibm.websphere.ant.tasks.StartServer"classpath="${wsanttasks.jar}" />

    <taskdef name="wsStopServer"classname="com.ibm.websphere.ant.tasks.StopServer"classpath="${wsanttasks.jar}" />

    <taskdef name="wsInstallApp"classname="com.ibm.websphere.ant.tasks.InstallApplication"classpath="${wsanttasks.jar}" />

    <taskdef name="wsUninstallApp"classname="com.ibm.websphere.ant.tasks.UninstallApplication"classpath="${wsanttasks.jar}" />

    <taskdef name="wsStartApp"classname="com.ibm.websphere.ant.tasks.StartApplication"classpath="${wsanttasks.jar}" />

    <taskdef name="wsStopApp"classname="com.ibm.websphere.ant.tasks.StopApplication"classpath="${wsanttasks.jar}" />

    <taskdef name="wsListApps"classname="com.ibm.websphere.ant.tasks.ListApplications"classpath="${wsanttasks.jar}" />

    <taskdef name="wsAdmin"classname="com.ibm.websphere.ant.tasks.WsAdmin"classpath="${wsanttasks.jar}" />

<!-- 解除安裝應用-->

 <target name="wsUninstallApp"description="Uninstall Application ${app}">

         <wsUninstallApp

                       wasHome="${was.root}"

                       application="${appname}"

                       conntype="${conntype}"

                       host="${host}"

                       port="${port}"

                        user="${username}"

                       password="${password}"

                       failonerror="false"/>

 </target>

  <!-- 安裝應用-->

 <target name="wsInstallApp"depends="wsUninstallApp" description="Install Application${appname}">

         <wsInstallApp

                       wasHome="${was.root}"

                       ear="${earfile}"

                        options="-appname${appname} -contextroot ${appname} -usedefaultbindings"

                             conntype="${conntype}"

                        host="${host}"

                       port="${port}"

                       user="${username}"

                       password="${password}"

                       failonerror="true"/>

 </target>

  <span style="color:#ff0000;"><!-- 設定模組類載入策略-->

   <targetname="wsSetWarLoadPolicy" description="set war load policy${app.war.loadpolicy}"> 

        <echo>change WAR ClassloaderPolicy {SINGLE=Application, MULTIPLE=Module} to${app.war.loadpolicy}</echo> 

        <wsAdmin   

            user="${username}"    

           command="${setDeployments};${setDeploymentsObject};${modifyWarClassLoaderPolicy}" 

           password="${password}"  

            host="${host}"   

           conntype="${conntype}" 

            port="${port}" 

            wasHome="${was.root}"/>

    </target> 

    <!-- 設定模組類載入順序-->

 <targetname="wsSetClassLoaderMode" description="set classloader mode to${app.class.load.mode}"> 

        <echo>change class load moode to${app.class.load.mode}</echo> 

        <wsAdmin   

            user="${username}"   

           command="${setDeployments};${setDeploymentsObject};${setClassLoaderMode};${modifyClassLoaderMode}" 

           password="${password}"  

            host="${host}"   

            conntype="${conntype}" 

            port="${port}" 

            wasHome="${was.root}"/>

    </target>  </span>

   <!-- 啟動應用-->

 <target name="wsStartApp"description="StartApp Application ${appname}">

         <wsStartApp

                       wasHome="${was.root}"

                       application="${appname}"

                       conntype="${conntype}"

                       host="${host}"

                       port="${port}"

                        user="${username}"

                       password="${password}"

                       failonerror="true"/>

 </target>

 <!-- 實際的任務組合    -->

 <target name="InstallAndStart"description="Install and Start ${appname}">

  <antcalltarget="wsInstallApp"/>

  <antcall target="wsStartApp"/>

  <antcalltarget="wsSetWarLoadPolicy" /> 

  <antcalltarget="wsSetClassLoaderMode"/> 

 </target>

</project>

2.在命令列或ant實現安裝的時候新增引數實現,對web模組載入順序的修改-----父親優先(PARENT_FIRST)或者父親最後(PARENT_LAST);

方案一:was命令列

set appid[$AdminConfig getid /Deployment:pa/]   

set deployedApp[$AdminConfig showAttribute $appid deployedObject]

set modules[$AdminConfig showAttribute $deployedApp modules]

set module [stringtrim $modules ?{}?]

set classldr[$AdminConfig showAttribute $module classloader]

$AdminConfig show$classldr

$AdminConfig modify$classldr {{mode PARENT_LAST}}

$AdminConfig save

其輸出Log如下:

wsadmin>set appid[$AdminConfig getid /Deployment:pa/]

pa(cells/PASDEVap0Node01Cell/applications/pa.ear/deployments/pa|deployment.xml#Deployment_1413429878953)

wsadmin>setdeployedApp [$AdminConfig showAttribute $appid deployedObject]

(cells/PASDEVap0Node01Cell/applications/pa.ear/deployments/pa|deployment.xml#ApplicationDeployment_1413429878953)

wsadmin>setmodules [$AdminConfig showAttribute $deployedApp modules]

{(cells/PASDEVap0Node01Cell/applications/pa.ear/deployments/pa|deployment.xml#WebModuleDeployment_1413429878953)}

wsadmin>setclassldr [$AdminConfig showAttribute(cells/PASDEVap0Node01Cell/applications/pa.ear/deployments/pa|deployment.xml#WebModuleDeployment_1413429878953)classloader]

(cells/PASDEVap0Node01Cell/applications/pa.ear/deployments/pa|deployment.xml#Classloader_1413429878954)

wsadmin>$AdminConfigshow $classldr

{libraries {}}

{mode PARENT_FIRST}

方案二:ant實現

增加如下程式碼:

<propertyname="setDeployments"   

                value="set deployments[$AdminConfig getid /Deployment:${appname}/]"/> 

   <property name="setDeploymentsObject"   

                value="setdeploymentObject [$AdminConfig showAttribute $deploymentsdeployedObject]"/> 

         <propertyname="setModules"   

                value="set modules[$AdminConfig showAttribute $deploymentObject modules]"/>

         <propertyname="setModule"   

                value="set module [stringtrim $modules ?{}?]"/>

          <property name="setClassLoaderMode" 

                value="set classloader[$AdminConfig showAttribute $module classloader]" /> 

   <property name="modifyClassLoaderMode"   

                value="$AdminConfig modify$classloader {{mode ${app.class.load.mode}}}"/>

 <!-- 設定WEB模組類載入順序-->

 <targetname="wsSetClassLoaderMode" description="set classloader mode to${app.class.load.mode}"> 

       <echo>change class load moode to${app.class.load.mode}</echo> 

       <wsAdmin   

           user="${username}"   

            command="${setDeployments};${setDeploymentsObject};${setModules};${setModule};${setClassLoaderMode};${modifyClassLoaderMode}" 

           password="${password}"  

           host="${host}"   

           conntype="${conntype}" 

           port="${port}" 

           wasHome="${was.root}" />

   </target> 

3.對應用程式做更新操作-----第一次需手動部署;

  命令列實現:

./wsadmin.sh -host10.8.24.29 -port 8880 -user wasadmin -password ****** -c '$AdminApp updatecap app  {-operation update  -contents/root/myweb-1.0-SNAPSHOT.war   -usedefaultbindings}'   //需要注意的是當更新的不是同一名字的war包時類裝載器會恢復預設設定。