持續整合
敏捷開發提到的持續整合(Continuous integration)工作在使用下確實能夠帶給開發者許多的便利性,並且無形中提昇軟體品質。測試與自動化為持續整合工作實作所強調的重點,然而自動 化的 Nightly Build 常常需要搭配 Script 來達到自動化的功效。當我們使用 Eclipse RCP 進行開發時常使用 Product Export Wizard 進行匯出,為了應用在自動化建置的環境中,以下提供了一項 ANT Script 來完成 RCP Product 的匯出工作,取代原本手動執行的工作。配合 SVN 或 CVS 的整合來實現 Nightly Build。
Eclipse PDE Build 教學 (使用Eclispe 3.5為範例)
建立環境
- 下載 eclipse-SDK-3.5-win32.zip
- 下載 eclipse-3.5.1-delta-pack.zip
- 下載 eclipse-RCP-3.5.1-win32.zip
參考網址如下:
http://download.eclipse.org/eclipse/downloads/drops/R-3.5-200906111540/ - 解壓縮 eclipse-SDK-3.5-win32.zip 到 D:\EclipsePDE\eclipse-sdk
- 解壓縮 eclipse-3.5.1-delta-pack.zip 到 D:\EclipsePDE\build-target
- 解壓縮 下載 eclipse-RCP-3.5.1-win32.zip 到 D:\EclipsePDE\build-target
建立 build.xml (紅色為需要修改的地方)
<project name="test.rcp.build" default="build"> <property file="build.properties" /> <target name="init"> <mkdir dir="${buildDirectory}" /> <mkdir dir="${buildDirectory}/plugins" /> <mkdir dir="${buildDirectory}/features" /> <copy todir="${buildDirectory}/plugins"> <fileset dir="../"> <include name="${rcp.plugin}/**" /> </fileset> </copy> <copy todir="${buildDirectory}/features"> <fileset dir="../"> <include name="${feature.plugin}/**" /> </fileset> </copy> </target> <target name="pde-build"> <java classname="org.eclipse.equinox.launcher.Main" fork="true" failonerror="true"> <arg value="-application" /> <arg value="org.eclipse.ant.core.antRunner" /> <arg value="-buildfile" /> <arg value="${eclipseLocation}/plugins/org.eclipse.pde.build_${pdeBuildPluginVersion}/scripts/productBuild/productBuild.xml" /> <arg value="-Dtimestamp=${timestamp}" /> <classpath> <pathelement location="${eclipseLocation}/plugins/org.eclipse.equinox.launcher_${equinoxLauncherPluginVersion}.jar" /> </classpath> </java> </target> <target name="clean"> <delete dir="${buildDirectory}" /> </target> <target name="build" depends="clean, init, pde-build" /> </project>
建立 build.properties
需要修改的參數列表如下:
- rcp.plugin = 你的 RCP plugin
- feature.plugin = Feature plugin
- pdeBuildPluginVersion = Eclipse SDK 中的 PDE Build 版本 (資料夾plugins/org.eclipse.pde.build_??)
- equinoxLauncherPluginVersion = Eclipse SDK 中的 Launcher 版本 (檔案 plugins/org.eclipse.equinox.launcher_??.jar)
- base = 前一個步驟 Target 解壓縮的位置
- eclipseLocation = 目前使用的 Eclipse IDE 位置
- product = 產品檔位置 (/[專案名稱]/[產品檔名])
- buildDirectory = Build 位置
##################################### # Copyright (c) 2003, 2006 IBM Corporation and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Eclipse Public License v1.0 # which accompanies this distribution, and is available at # http://www.eclipse.org/legal/epl-v10.html # # Contributors: # IBM Corporation - initial API and implementation ##################################### ##################### # Parameters describing how and where to execute the build. # Typical users need only update the following properties: # baseLocation - where things you are building against are installed # bootclasspath - The base jars to compile against (typicaly rt.jar) # configs - the list of {os, ws, arch} configurations to build. # # Of course any of the settings here can be overridden by spec'ing # them on the command line (e.g., -DbaseLocation=d:/eclipse ############# PLUG-IN VERSIONS ###################### # # Look in the plugins directory of your Eclipse # installation to determine the version numbers # the correct version numbers. These version numbers # are used to create the correct paths when launching # PDE Build. # ##################################### rcp.plugin=test.rcp feature.plugin=test.rcp.feature # Version of org.ecilpse.pdebuild pdeBuildPluginVersion=3.5.1.R35x_20090820 # Version of org.eclipse.equinox.launcher equinoxLauncherPluginVersion=1.0.201.R35x_v20090715 ############# BASE LOCATION ######################### # # Specify the directory of the base under which your # your build target is located. This directory should # contain the RCP Runtime Binary that you want to # compile against. # #################################### base=D:/EclipsePDE/build-target ############# ECLIPSE LOCATION ###################### # # Specify the directory of the Eclipse installation # that will be used to execute PDE Build. # ################################### eclipseLocation=D:/Eclipse/Eclipse 3.5 RCP ############# PRODUCT/PACKAGING CONTROL ############# product=/test.rcp/test.product runPackager=true #Set the name of the archive that will result from the product build. #archiveNamePrefix= # The prefix that will be used in the generated archive. archivePrefix=myRCP # The location underwhich all of the build output will be collected. collectingFolder=${archivePrefix} # The list of {os, ws, arch} configurations to build. This # value is a '&' separated list of ',' separate triples. For example, # configs=win32,win32,x86 & linux,motif,x86 # By default the value is *,*,* #configs = *, *, * configs=win32, win32, x86 # & \ # win32,win32,x86_64 & \ # win32,win32,wpf & \ # linux, gtk, ppc & \ # linux, gtk, x86 & \ # linux, gtk, x86_64 & \ # linux, motif, x86 & \ # solaris, motif, sparc & \ # solaris, gtk, sparc & \ # aix, motif, ppc & \ # hpux, motif, ia64_32 & \ # macosx, carbon, ppc & \ # macosx, carbon, x86 & \ # macosx, cocoa, ppc & \ # macosx, cocoa, x86 & \ # macosx, cocoa, x86_64 # By default PDE creates one archive (result) per entry listed in the configs property. # Setting this value to true will cause PDE to only create one output containing all # artifacts for all the platforms listed in the configs property. # To control the output format for the group, add a "group, group, group - <format>" entry to the # archivesFormat. #groupConfigurations=true #The format of the archive. By default a zip is created using antZip. #The list can only contain the configuration for which the desired format is different than zip. #archivesFormat=win32, win32, x86 - antZip& \ # linux, gtk, ppc - antZip &\ # linux, gtk, x86 - antZip& \ # linux, gtk, x86_64 - antZip& \ # linux, motif, x86 - antZip& \ # solaris, motif, sparc - antZip& \ # solaris, gtk, sparc - antZip& \ # aix, motif, ppc - antZip& \ # hpux, motif, PA_RISC - antZip& \ # macosx, carbon, ppc - antZip #Allow cycles involving at most one bundle that needs to be compiled with the rest being binary bundles. allowBinaryCycles = true #Sort bundles depenedencies across all features instead of just within a given feature. flattenDependencies = true #Parallel compilation, requires flattenedDependencies=true #parallelCompilation=true #parallelThreadCount= #parallelThreadsPerProcessor= #Set to true if you want the output to be ready for an update jar (no site.xml generated) #outputUpdateJars = false #Set to true for Jnlp generation #codebase should be a URL that will be used as the root of all relative URLs in the output. #generateJnlp=false #jnlp.codebase=<codebase url> #jnlp.j2se=<j2se version> #jnlp.locale=<a locale> #jnlp.generateOfflineAllowed=true or false generate <offlineAllowed/> attribute in the generated features #jnlp.configs=${configs} #uncomment to filter the content of the generated jnlp files based on the configuration being built #Set to true if you want to sign jars #signJars=false #sign.alias=<alias> #sign.keystore=<keystore location> #sign.storepass=<keystore password> #sign.keypass=<key password> #Arguments to send to the zip executable zipargs= #Arguments to send to the tar executable tarargs= #Control the creation of a file containing the version included in each configuration - on by default #generateVersionsLists=false ############## BUILD NAMING CONTROL ################ # The directory into which the build elements are fetched and where # the build takes place. buildDirectory=D:/EclipsePDE/build # Type of build. Used in naming the build output. Typically this value is # one of I, N, M, S, ... buildType=I # ID of the build. Used in naming the build output. buildId=myRCP # Label for the build. Used in naming the build output buildLabel=${buildType}.${buildId} # Timestamp for the build. Used in naming the build output timestamp=007 #The value to be used for the qualifier of a plugin or feature when you want to override the value computed by pde. #The value will only be applied to plugin or features indicating build.properties, qualifier = context #forceContextQualifier=<the value for the qualifier> #Enable / disable the generation of a suffix for the features that use .qualifier. #The generated suffix is computed according to the content of the feature #generateFeatureVersionSuffix=true ############# BASE CONTROL ############# # Settings for the base Eclipse components and Java class libraries # against which you are building. # Base location for anything the build needs to compile against. For example, # in most RCP app or a plug-in, the baseLocation should be the location of a previously # installed Eclipse against which the application or plug-in code will be compiled and the RCP delta pack. baseLocation=${base}/eclipse #Folder containing repositories whose content is needed to compile against #repoBaseLocation=${base}/repos #Folder where the content of the repositories from ${repoBaseLocation} will be made available as a form suitable to be compiled against #transformedRepoLocation=${base}/transformedRepos #Os/Ws/Arch/nl of the eclipse specified by baseLocation baseos=win32 basews=win32 basearch=x86 #this property indicates whether you want the set of plug-ins and features to be considered during the build to be limited to the ones reachable from the features / plugins being built filteredDependencyCheck=false #this property indicates whether the resolution should be done in development mode (i.e. ignore multiple bundles with singletons) resolution.devMode=false #pluginPath is a list of locations in which to find plugins and features. This list is separated by the platform file separator (; or :) #a location is one of: #- the location of the jar or folder that is the plugin or feature : /path/to/foo.jar or /path/to/foo #- a directory that contains a /plugins or /features subdirectory #- the location of a feature.xml, or for 2.1 style plugins, the plugin.xml or fragment.xml #pluginPath= skipBase=true eclipseURL=<url for eclipse download site> eclipseBuildId=<Id of Eclipse build to get> eclipseBaseURL=${eclipseURL}/eclipse-platform-${eclipseBuildId}-win32.zip ############# MAP FILE CONTROL ################ # This section defines CVS tags to use when fetching the map files from the repository. # If you want to fetch the map file from repository / location, change the getMapFiles target in the customTargets.xml skipMaps=true mapsRepo=:pserver:[email protected]/path/to/repo mapsRoot=path/to/maps mapsCheckoutTag=HEAD #tagMaps=true mapsTagTag=v${buildId} ############ REPOSITORY CONTROL ############### # This section defines properties parameterizing the repositories where plugins, fragments # bundles and features are being obtained from. # The tags to use when fetching elements to build. # By default thebuilder will use whatever is in the maps. # This value takes the form of a comma separated list of repository identifier (like used in the map files) and the # overriding value # For example fetchTag=CVS=HEAD, SVN=v20050101 # fetchTag=HEAD skipFetch=true ############# JAVA COMPILER OPTIONS ############## # The location of the Java jars to compile against. Typically the rt.jar for your JDK/JRE #bootclasspath=${java.home}/lib/rt.jar # specific JRE locations to compile against. These values are used to compile bundles specifying a # Bundle-RequiredExecutionEnvironment. Uncomment and set values for environments that you support #CDC-1.0/Foundation-1.0= /path/to/rt.jar #CDC-1.1/Foundation-1.1= #OSGi/Minimum-1.0= #OSGi/Minimum-1.1= #JRE-1.1= #J2SE-1.2= #J2SE-1.3= #J2SE-1.4= #J2SE-1.5= #JavaSE-1.6= #PersonalJava-1.1= #PersonalJava-1.2= #CDC-1.0/PersonalBasis-1.0= #CDC-1.0/PersonalJava-1.0= #CDC-1.1/PersonalBasis-1.1= #CDC-1.1/PersonalJava-1.1= # Specify the output format of the compiler log when eclipse jdt is used logExtension=.log # Whether or not to include debug info in the output jars javacDebugInfo=false # Whether or not to fail the build if there are compiler errors javacFailOnError=true # Enable or disable verbose mode of the compiler javacVerbose=true # Extra arguments for the compiler. These are specific to the java compiler being used. #compilerArg= # Default value for the version of the source code. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacSource in build.properties #javacSource=1.3 # Default value for the version of the byte code targeted. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacTarget in build.properties. #javacTarget=1.1
參考文獻
- http://en.wikipedia.org/wiki/Continuous_integration
- http://rcpquickstart.com/2007/06/06/getting-started-with-pde-build/
- http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.pde.doc.user/guide/tasks/pde_feature_generating_ant.htm