I have a common build.xml file that contains most of my targets. There are two satellite build files that import the common file. The difference between the satellites is that one will run the common targets once, whereas the other has a foreach ant-contrib task which loops through subfolders and runs the common targets once per subfolder.
One of my targets in the common file prompts the user to select an area to release to (dev or qa). For the satellite build that runs once, this works fine. For the looping satellite build, the prompt appears to the user for each subfolder, but they will all go to the same release area so I only need this prompt to be asked once.
The simple solution is to move the "select-area" target to each of the satellite build files so it only runs once, i.e. it is outside of the loop. I am interested to know if there is a cleaner way to do it.
My initial thoughts were to call the target outside of the loop, in the looping satellite build (using the ant task) and set a property. I would then add an "unless" attribute to the select-area target in the common build file which checks if the property set in the ant task has been set. By my reckoning, this would mean the non-looping build runs the select-area target as the property has not been set (which it does). The looping satellite build runs the target (using the ant task) but then when it loops into the common build file and hits the select-area target it still runs it, even though the property has been set and the select-area target has the unless attribute to check it.
Sample code below:
Extract From Common Build
<target name="select-area" unless="area.selected" description="prompts user what area to deploy to and validates response">
<input message="Which area do you want to deploy to?" validargs="dev,qa" addproperty="deploy.to" />
...
</target>
Looping Satellite Build File
<project name="run-build-file-multi" default="loop-brands">
<import file="../../../common/builds/newbuild.xml"/>
<ant antfile="${ant.file.common} target="select-area">
<property name="area.selected" value="yes" />
</ant>
<target name="loop-brands" depends="select-area" description="loops through each brand folder found in branch folder">
<foreach target="end-confirmation" param="current.brand" inheritall="true">
<path>
<dirset dir=".">
<include name="*"/>
</dirset>
</path>
</foreach>
</target>
</project>
It appears as soon as the ant task has called the target, the area.selected property is no longer set.
I am not sure if I am even going about this the right way but hopefully it is relatively clear what I am trying to achieve.
Any assistance appreciated, thanks.
This seems wrong:
<target name="select-area" unless="area.selected" description="prompts user what area to deploy to and validates response">
<input message="Which area do you want to deploy to?" validargs="dev,qa" addproperty="deploy.to" />
It should be
<target name="select-area" unless="deploy.to" description="prompts user what area to deploy to and validates response">
<input message="Which area do you want to deploy to?" validargs="dev,qa" addproperty="deploy.to" />
i.e. the unless should use the same variable as the input
When the variable has been set once, it should stay that way.
Alternatively, in your two build scripts, have the script call select-area
once at the beginning (so this is the same code in both) and then start the loop in the recursive build.