Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

Common Build Infrastructure/Getting Started/Build In Hudson/Ant Job Distributed

To have Athena based Ant Job builds work on any machine and not just a particular node, you need to use the an UpdateSite/Repository based build. This will have Athena get the correct target platform SDK and install it.

The following is an example from the Vex project which will run on either master or build2.

build.properties

## BEGIN PROJECT BUILD PROPERTIES ##

# default settings for all this project's builds, for this branch; see also o.e.d.common.releng/build.properties for more overrideable defaults

# To permit automatic downloads of non-EPL compatible code, set this to property to "I accept"
thirdPartyDownloadLicenseAcceptance="I accept"

# MUST BE SET #
projectid=webtools.vex
zipPrefix=wtp-xml-vex
incubation=-Incubation
version=0.5.0
buildType=N
mainFeatureToBuildID=org.eclipse.wst.xml.vex.feature
testFeatureToBuildID=org.eclipse.wst.xml.vex_tests.feature

# MUST BE SET #
JAVA50_HOME=${JAVA_HOME}
JAVA14_HOME=${JAVA_HOME}
PACK200_JAVA_HOME=${JAVA_HOME}
dependencyURLs=http://download.eclipse.org/tools/orbit/downloads/drops/R20100114021427/orbit-R20100114021427.zip
repositoryURLs=http://download.eclipse.org/athena/repos/eclipse-Update-S-3.6M5-201001291300.zip,http://download.eclipse.org/releases/helios,http://download.eclipse.org/tools/orbit/downloads/drops/R20100114021427/updateSite
IUsToInstall=org.eclipse.sdk.feature.group+org.eclipse.sdk.ide+org.eclipse.wst.xml_ui.feature.feature.group

#what steps should we do? default: build.steps=buildUpdate,buildZips,buildTests,generateDigests,test,publish,cleanup
#build.steps=buildUpdate,buildZips,buildTests,generateDigests,test,publish,cleanup
build.steps=buildUpdate,buildZips,buildTests,generateDigests,testLocal,map2psf,publish

compilerArg=-enableJavadoc -encoding ISO-8859-1
flattenDependencies=true
parallelCompilation=true
generateFeatureVersionSuffix=true
individualSourceBundles=true

writableBuildRoot=${WORKSPACE}/build
## END PROJECT BUILD PROPERTIES ##

The key is repositoryURL and IUsToInstall. Note that you CAN NOT mix in a featureIDsToInstall, as this will confuse athena and you will not get the necessary product information installed.

The build itself uses the new self provisioning mechanism for Athena:

build.xml

<project default="run" name="org.eclipse.wst.xml.xpath2.releng/build.xml - Run a PsychoPath build using the Athena CBI">
	<!-- load properties and set timestamp for the build -->

	<property environment="env" />
	<property name="WORKSPACE" location="${env.WORKSPACE}" />

	<ant antfile="bootstrap.xml" target="init">
		<property name="basebuilderTag" value="r35x_v20090811" />
		<property name="commonrelengTag" value="HEAD" />
		<property name="ANTCONTRIB_VERSION" value="1.0b2" />
		<property name="ANT4ECLIPSE_VERSION" value="1.0.0.M3" />
		<property name="build.properties" value="build.properties" />
	</ant>

	<!-- FIXME if required: Set a valid path to JAVA_HOME, if Eclipse's ${java.home}/../bin/javac cannot be found -->
	<condition property="JAVA_HOME" value="${java.home}" else="${java.home}/..">
		<available file="${java.home}/bin/javac" type="file" />
	</condition>

	<!-- FIXME if required: if not using this type of qualifier, comment next 4 lines -->
	<tstamp>
		<format property="buildTimestamp" pattern="yyyyMMddHHmm" />
	</tstamp>

	<!-- 1. To build from sources using information in the ./maps/*.map files, comment these next two properties
				 2. Or, to build from sources in the workspace, use these properties. You can also use absolute paths if needed.
			-->
	<!-- <property name="localSourceCheckoutDir" value="${basedir}/.." />
			<property name="relengBuilderDir" value="${basedir}" /> -->

	<property name="build.properties" value="build.properties" />
	<property file="${build.properties}" />

	<property name="forceContextQualifier" value="v${buildTimestamp}" />
	<property name="fetchTag" value="HEAD" />

	<!-- calculate workspaceDir as parent of this folder, the project's .releng folder (relengBuilderDir) -->
	<import file="findbugs.xml" />
	<import file="pmd.xml" />
	<dirname file="${relengBuilderDir}" property="workspaceDir" />

	<!-- 
		can build in /tmp, eg., in /tmp/build, or in workspace, eg.,
		${WORKSPACE}/build
	-->
	<property name="writableBuildRoot" value="/tmp/build" />

	<!-- 
		can be simple path, eg., 
		${writableBuildRoot}/${buildType}${buildTimestamp} or longer, eg.,
		${writableBuildRoot}/${topprojectName}/${projectName}/downloads/drops/${version}/${buildType}${buildTimestamp} or
		${writableBuildRoot}/${topprojectName}/${projectName}/${subprojectName}/downloads/drops/${version}/${buildType}${buildTimestamp}
	-->
	<property name="buildDir" value="${writableBuildRoot}/athena" />

	<target name="init">
		<delete dir="${buildDir}" failonerror="false" />
	</target>

	<target name="run" depends="init">
		<echo message="Workspace: ${WORKSPACE}" />
		<echo message="Writable Build Root: ${writableBuildRoot}" />
		<mkdir dir="${writableBuildRoot}" />
		<!-- invoke a new Eclipse process and launch the build from the common.releng folder -->
		<!--<property name="relengCommonBuilderDir" value="${workspaceDir}/org.eclipse.dash.common.releng" />-->

		<condition property="JAVA_HOME" value="${java.home}" else="${java.home}/..">
			<available file="${java.home}/bin/javac" type="file" />
		</condition>

		<!-- <ant antfile="${relengCommonBuilderDir}/buildAll.xml" target="runEclipse" dir="${relengCommonBuilderDir}" />-->
		<ant antfile="${relengCommonBuilderDir}/build.xml" />

	</target>

</project>

bootstrap.xml

<!-- 
   This script is completely boilerplate, and is used to bootstrap before building.
   
   To use it, call it like this from within your build.xml's run target:
   
<project default="run">
   <target name="run">
      <ant antfile="bootstrap.xml" target="init">
         <property name="basebuilderTag" value="r35x_v20090811" />
         <property name="commonrelengTag" value="HEAD" />
         <property name="ANTCONTRIB_VERSION" value="1.0b2" />
         <property name="ANT4ECLIPSE_VERSION" value="1.0.0.M3" />
         <property name="build.properties" value="build.properties" />
      </ant>
      ...
      <condition property="JAVA_HOME" value="${java.home}" else="${java.home}/..">
         <available file="${java.home}/bin/javac" type="file" />
      </condition>
      ...
      <property name="build.properties" value="build.properties" />
      <property file="${build.properties}" />
      <ant antfile="${relengCommonBuilderDir}/build.xml" />
   </target>
</project>
-->

<project default="init">
   <condition property="isInHudson" value="true">
      <or>
         <contains string="${user.dir}" substring="hudson" />
         <contains string="${user.name}" substring="hudson" />
         <contains string="${user.home}" substring="hudson" />
      </or>
   </condition>
   <target name="local" unless="isInHudson">
      <property name="WORKINGDIR" value="${basedir}/.." />
      <property name="COMMON_TOOLS" value="${java.io.tmpdir}/build/downloads" />
      <property name="writableBuildRoot" value="${WORKSPACE}/build" />
   </target>

   <!-- if required: use a newer version -->
   <target name="get.ant-contrib" unless="ant-contrib.jar.exists">
      <property name="ANTCONTRIB_VERSION" value="1.0b2" />
      <property name="ANTCONTRIB_MIRROR" value="http://downloads.sourceforge.net/ant-contrib/" />
      <get usetimestamp="true"
           dest="${COMMON_TOOLS}/ant-contrib-${ANTCONTRIB_VERSION}-bin.zip"
           src="${ANTCONTRIB_MIRROR}/ant-contrib-${ANTCONTRIB_VERSION}-bin.zip"
      />
      <touch file="${COMMON_TOOLS}/ant-contrib-${ANTCONTRIB_VERSION}-bin.zip" />
      <mkdir dir="${java.io.tmpdir}/ant-contrib-${ANTCONTRIB_VERSION}-bin.zip_" />
      <unzip src="${COMMON_TOOLS}/ant-contrib-${ANTCONTRIB_VERSION}-bin.zip"
             dest="${java.io.tmpdir}/ant-contrib-${ANTCONTRIB_VERSION}-bin.zip_"
             overwrite="true"
      />
      <copy file="${java.io.tmpdir}/ant-contrib-${ANTCONTRIB_VERSION}-bin.zip_/ant-contrib/lib/ant-contrib.jar"
            tofile="${COMMON_TOOLS}/ant-contrib.jar"
            failonerror="true"
      />
      <delete dir="${java.io.tmpdir}/ant-contrib-${ANTCONTRIB_VERSION}-bin.zip_"
              includeemptydirs="true"
              quiet="true"
      />
   </target>

   <!-- if required: use a newer version -->
   <target name="get.ant4eclipse" unless="ant4eclipse.jar.exists">
      <property name="ANT4ECLIPSE_VERSION" value="1.0.0.M3" />
      <property name="ANT4ECLIPSE_MIRROR" value="http://downloads.sourceforge.net/ant4eclipse/" />
      <get usetimestamp="true"
           dest="${COMMON_TOOLS}/org.ant4eclipse_${ANT4ECLIPSE_VERSION}.zip"
           src="${ANT4ECLIPSE_MIRROR}/org.ant4eclipse_${ANT4ECLIPSE_VERSION}.zip"
      />
      <touch file="${COMMON_TOOLS}/org.ant4eclipse_${ANT4ECLIPSE_VERSION}.zip" />
      <mkdir dir="${java.io.tmpdir}/org.ant4eclipse_${ANT4ECLIPSE_VERSION}.zip_" />
      <unzip src="${COMMON_TOOLS}/org.ant4eclipse_${ANT4ECLIPSE_VERSION}.zip"
             dest="${java.io.tmpdir}/org.ant4eclipse_${ANT4ECLIPSE_VERSION}.zip_"
             overwrite="true"
      />
      <copy file="${java.io.tmpdir}/org.ant4eclipse_${ANT4ECLIPSE_VERSION}.zip_/org.ant4eclipse_${ANT4ECLIPSE_VERSION}.jar"
            tofile="${COMMON_TOOLS}/ant4eclipse.jar"
            failonerror="true"
      />
      <delete dir="${java.io.tmpdir}/org.ant4eclipse_${ANT4ECLIPSE_VERSION}.zip_"
              includeemptydirs="true"
              quiet="true"
      />
   </target>

   <target name="get.athena.common.releng.and.releng.basebuilder">
      <!-- find relengCommonBuilderDir and relengBaseBuilderDir -->
      <for param="dir" list="${COMMON_TOOLS}, ${basedir}/../.., ${basedir}/.." delimiter=", ">
         <sequential>
            <if>
               <available file="@{dir}/org.eclipse.dash.common.releng" type="dir" />
               <then>
                  <property name="relengCommonBuilderDir" value="@{dir}/org.eclipse.dash.common.releng" />
               </then>
            </if>
            <if>
               <available file="@{dir}/org.eclipse.releng.basebuilder" type="dir" />
               <then>
                  <property name="relengBaseBuilderDir" value="@{dir}/org.eclipse.releng.basebuilder" />
               </then>
            </if>

         </sequential>
      </for>

      <if>
         <or>
            <not>
               <isset property="relengCommonBuilderDir" />
            </not>
            <not>
               <isset property="relengBaseBuilderDir" />
            </not>
         </or>
         <then>
            <!-- fetch projects using psf file; create it if needed -->
            <if>
               <not>
                  <available file="${COMMON_TOOLS}/psfs/athena.psf" type="file" />
               </not>
               <then>
                  <!-- if required: use a different tag/branch -->
                  <property name="basebuilderTag" value="r35x_v20090811" />
                  <property name="commonrelengTag" value="HEAD" />

                  <echo>Create ${COMMON_TOOLS}/psfs/athena.psf file</echo>
                  <mkdir dir="${COMMON_TOOLS}/psfs" />
                  <echo file="${COMMON_TOOLS}/psfs/athena.psf"><?xml version="1.0" encoding="UTF-8"?>
<psf version="2.0">
<provider id="org.eclipse.team.cvs.core.cvsnature">
<project reference="1.0,:pserver:anonymous@dev.eclipse.org:/cvsroot/technology,org.eclipse.dash/athena/org.eclipse.dash.commonbuilder/org.eclipse.dash.commonbuilder.releng,org.eclipse.dash.common.releng,${commonrelengTag}"/>
<project reference="1.0,:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse,org.eclipse.releng.basebuilder,org.eclipse.releng.basebuilder,${basebuilderTag}"/>
</provider>
</psf></echo>
               </then>
            </if>
            <echo>Fetch projects from athena.psf into ${COMMON_TOOLS}</echo>
            <cvsGetProjectSet cvsreallyquiet="true"
                              cvsUser="anonymous"
                              cvsPwd=""
                              command="checkout"
                              projectSet="${COMMON_TOOLS}/psfs/athena.psf"
                              destination="${COMMON_TOOLS}"
            />
            <property name="relengCommonBuilderDir" value="${COMMON_TOOLS}/org.eclipse.dash.common.releng" />
            <property name="relengBaseBuilderDir" value="${COMMON_TOOLS}/org.eclipse.releng.basebuilder" />
         </then>
      </if>
   </target>

   <target name="init" depends="local">
      <property name="WORKINGDIR" value="${basedir}/.." />
      <property name="COMMON_TOOLS" value="${basedir}/../tools" />
      <mkdir dir="${COMMON_TOOLS}" />

      <available file="${COMMON_TOOLS}/ant-contrib.jar" type="file" property="ant-contrib.jar.exists" />
      <antcall target="get.ant-contrib" />
      <taskdef resource="net/sf/antcontrib/antlib.xml">
         <classpath>
            <pathelement location="${COMMON_TOOLS}/ant-contrib.jar" />
         </classpath>
      </taskdef>

      <available file="${COMMON_TOOLS}/ant4eclipse.jar" type="file" property="ant4eclipse.jar.exists" />
      <antcall target="get.ant4eclipse" />
      <taskdef resource="org/ant4eclipse/antlib.xml">
         <classpath>
            <pathelement location="${COMMON_TOOLS}/ant4eclipse.jar" />
         </classpath>
      </taskdef>

      <antcallback target="get.athena.common.releng.and.releng.basebuilder"
                   return="relengCommonBuilderDir, relengBaseBuilderDir"
      />

      <if>
         <or>
            <not>
               <isset property="relengCommonBuilderDir" />
            </not>
            <not>
               <isset property="relengBaseBuilderDir" />
            </not>
         </or>
         <then>
            <fail>Error!
   $${relengBaseBuilderDir} or $${relengCommonBuilderDir} could not be found!

   Try checking out manually using psfs/athena.psf
</fail>
         </then>
      </if>
<!--     
      <property name="build.properties" value="build.properties" />
      <echo file="${build.properties}" append="true">

#bootstrap.xml properties
WORKINGDIR=${WORKINGDIR}
COMMON_TOOLS=${COMMON_TOOLS}
relengCommonBuilderDir=${relengCommonBuilderDir}
relengBaseBuilderDir=${relengBaseBuilderDir}
</echo>
      <if>
         <isset property="writableBuildRoot" />
         <then>
            <echo file="${build.properties}" append="true">writableBuildRoot=${writableBuildRoot}
</echo>
         </then>
      </if>
-->
   </target>

</project>


This build script will provision the necessary files into the workspace to run the build. It does not depend on hard coded paths or other server specific items. JDK Home directory is provided by the environment variable set by Hudson.

Back to the top