开发者

Using a variable obtained using a pre-build shell command to set an option for the Maven build in Hudson

I have a Hudson job that runs a maven goal. Before this maven goal is executed I have added a step to run before the build starts, it is a shell script that obtains the version number that I want to use in the 'Goals and options' field.

So in my job configuration, under Build Environmen开发者_如何学JAVAt I have checked the Configure M2 Extra Build Steps box and added a shell script before the build. The script looks like this:

export RELEASE={command to extract release version}
echo $RELEASE

And then under the Build section I point to my 'root pom'. In the Goals and options I then want to be able to do something like this:

-Dbuild.release.version=${RELEASE} deploy

Where build.release.version is a maven property referenced in the POM. However since the shell doesn't seem to make its variables global it doesn't work. Any ideas?

The only one I have is to install the Envfile plugin and get the shell script to write out the RELEASE property to a file and then get the plugin to read the file, but the order in which everything is run may cause problems and it seems like there must be simpler way...is there?

Thanks in advance.


I recently wanted to do the same, but AFAIK it's not possible to export values from a pre-build shell to the job environment. If there is a Hudson Plugin for this I've missed it.

What did work, however, was a setup similar to what you were suggesting: having the pre-build shell script write the desired value(s) to a property-file in the workspace, and then using the Parametrized Trigger Plugin to trigger another job that actually does the work (in your case, invoke the Maven job). The plugin can be configured to read the parameters it passes from the property file. So the first job has just the shell script and the post-build triggers, and the second one does the actual work, having the correct parameters available as environment variables.

General idea of the shell script:

echo "foo=bar
baz=`somecmd`" > build.properties

And for your Goals and options, something like:

-Dbuild.release.version=${foo} deploy

Granted, this isn't as elegant as one might want but worked really well for us, since our build was broken into several jobs to begin with, and we can actually reuse the other jobs that the first one triggers (that is, invoke them with different parameters).


When you say it doesn't work, do you mean that your RELEASE variable is not passed to the maven command? I believe the problem is that by default, each line of the shell script is executed separately, so environment variables get lost.

If you want the entire shell script to execute as if it was one script file, make the first line:

#!/bin/sh

I think this is described in the Help information alongside the shell script build step (and if I'm wrong, that's a good place to look for the right syntax).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜