一、本節概述

由於公司專案繁多,不同的專案使用不同版本的JDK和WebLogic,因此在日常運維過程中,需要按需安裝指定版本的JDK&WebLogic,因此本節先來說明下多版本JDK(JDK6、7、8)的選擇安裝,並以此掌握ant的必備補充包ant-contrib,我們可以利用它實現像 if else trycatch等擴充套件功能。

ant-contrib的下載地址:

下載後解壓,將解壓出的ant-contrib-1.0b3.jar以及lib目錄下的jar包(lib下有4個),共5個jar包都放在D:\Program Files\apache-ant-1.9.13\lib下,可以將解壓出的docs目錄放在D:\Program Files\apache-ant-1.9.13目錄下,便於先檢視ant manual一樣學習ant-contrib的各task。

二、本地準備工作

準備好各版本安裝包 ,本地檔案位置:

d:\tmp\inventory\jdk-6u45-linux-amd64.rpm;

d:\tmp\inventory\jdk-7u72-linux-x64.rpm;

d:\tmp\inventory\jdk-8u72-linux-x64.rpm;

其它不多說了,具體參見上一篇第二部分內容。

三、指令碼及說明

在上一篇提到的引數檔案d:\tmp\build_params.properties中增加各JDK rpm包檔名的變數定義。

變數定義的好處在於如果某一版本的JDK有了新版本,只需要該此處的變數定義即可。

JDK6.filename=jdk-6u45-linux-amd64.rpm

JDK7.filename=jdk-7u72-linux-x64.rpm

JDK8.filename=jdk-8u72-linux-x64.rpm

這次build.xml的內容變化較大,先貼一下:

<?xml version="1.0" ?>
<project>

	<!--Task definition for Ant-Contrib-->
	<taskdef resource="net/sf/antcontrib/antlib.xml" />

	<property file="build_params.properties" />
	
	<!-- Install JDK-->
	<target name="InstallJDK" >
		<if>
			<equals arg1="${installType}" arg2="872" trim="true" casesensitive="false" />
			<then>
				<echo>安裝JDK872</echo>
				<antcall target="installJDK8" />
			</then>
			<elseif>
			  <equals arg1="${installType}" arg2="772" trim="true" casesensitive="false" />
			  <then>
				<echo>安裝JDK772</echo>
				<antcall target="installJDK7" />
			  </then>
			</elseif>
			<else>
				<echo>安裝JDK645</echo>
				<antcall target="installJDK6" />
			</else>
		</if>
	</target>	

	<!-- rpm方式安裝JDK6 -->	
	<target name="installJDK6" >
	  <antcall target="installJDKByRpm">
	    <param name="file.fullPath" value="${inventory.dir}/${JDK6.filename}"/>
	  </antcall>
	</target>
	
	<!-- rpm方式安裝JDK7 -->	
	<target name="installJDK7" >
	  <antcall target="installJDKByRpm">
	    <param name="file.fullPath" value="${inventory.dir}/${JDK7.filename}"/>
	  </antcall>
	</target>
	<!-- rpm方式安裝JDK7 -->	
	<target name="installJDK8" >
	  <antcall target="installJDKByRpm">
	    <param name="file.fullPath" value="${inventory.dir}/${JDK8.filename}"/>
	  </antcall>
	</target>
	
	<target name="installJDKByRpm" >
	  <antcall target="scp">
	    <param name="server.user" value="${root.user}"/>
	    <param name="server.password" value="${root.password}"/>
	  </antcall>
	  <antcall target="sshByCmd">
	    <param name="server.user" value="${root.user}"/>
	    <param name="server.password" value="${root.password}"/>
	    <param name="command" value="cd ${upload.path};rpm -ivh  ${upload.filename}"/>
	  </antcall>
	</target>

	<target name="scp" >
	  <scp file="${file.fullPath}" todir="${server.user}:${server.password}@${server.ip}:${upload.path}/" trust="true"/>
	</target>

	<target name="sshByCmd" >
		<sshexec host="${server.ip}" username="${server.user}"  password="${server.password}"
         trust="true" command="${command}"/>
	</target>
	
	<target name="installAllJDK" depends="installJDK6,installJDK7,installJDK8" />

</project>

1. 首先注意這一句,很重要,沒有它就無法使用ant-contrib的各種task了

<!--Task definition for Ant-Contrib-->

<taskdef resource="net/sf/antcontrib/antlib.xml" />

2. 有一個外部變數installType, 使用if elseif邏輯判讀它的值,並進行對應的處理;

3.由於多個版本JDK的安裝過程沒有什麼不同,因此每個版本的安裝指令碼很相似,就是安裝包名不同,在前述指令碼引數化的基礎上,我們可以像Java一樣對Ant Task進行封裝,首先將scp和sshexec分別放到叫scp和sshByCmd的target中,並將rpm安裝也封裝為一個獨立target:installJDKByRpm,這樣做的好處可以在後面介紹Jenkins伺服器與應用伺服器互信時看到。

4.如果需要在一臺伺服器上安裝多個JDK,可以呼叫target:installAllJDK,注意depends的用法和JDK的安裝順序,因為使用安裝包安裝JDK可以從低版本升級到高版本,反之不行。那麼先裝了高版本又想裝低版本呢?賣個關子,下節再講。

四、執行

執行

ant InstallJDK -DinstallType=JDK772

則將執行JDK7的安裝~