Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Jenkins: How to use a variable from a pre-build shell in the Maven "Goals and options"

Tags:

maven

jenkins

I have a Maven job in Jenkins. Before the actual build step I have an "Execute shell" pre-build step. In that shell I set a variable:

REVISION=$(cat .build_revision) 

I would like to use that variable in the Maven build job in "Goals and options":

clean install -Drevision=${REVISION} 

But that does not work! The "Drevision" is set to "${REVISION}" not the actual value of ${REVISION}. Output:

Executing Maven:  -B -f /home/gerrit/.jenkins/jobs/<job_name>/workspace/pom.xml clean install -Drevision=${REVISION} 

It works with Jenkins environment variables:

clean install -Dbuild=${BUILD_NUMBER} 

It sets "Dbuild" to the actual build number. Output:

Executing Maven:  -B -f /home/gerrit/.jenkins/jobs/<job_name>/workspace/pom.xml clean install -Dbuild=54 

My question: How to use a shell variable in Maven "Goals and options"??

EDIT:

I tried using Jenkins EnvInject Plugin to "Inject environment variables" after the pre-build shell, and my variable is now accessible by e.g. post-build shells, but it is still not available in Maven "Goals and options".

Then it is possible to set "Inject environment variables to the build process" using the EnvInject Plugin, which actually makes those variables available in Maven "Goals and options", but those are set right after SCM checkout, i.e. before pre-build steps, and do not support expression evaluations.

like image 340
Jonas Bang Christensen Avatar asked May 02 '13 07:05

Jonas Bang Christensen


People also ask

How do I set Maven goals in Jenkins?

Next, create a new Maven job by 1) clicking "New Job" on the left hand menu, 2) give it a name, and 3) choose the "Build a Maven 2/3 project". You will then be presented with the job configuration screen. On this page, you need to provide 1) the SCM and 2) the Maven goals to call. That's it!

How does Jenkins environment variables work?

Jenkins Environment Variable is a global variable exposed through the env variable and used anywhere in the Jenkinsfile . Any value stored in the env variable gets stored as a String type. Environment Variables can be set either at the pipeline top level, at the specific stage level, or inside the script block.


1 Answers

You're on the right track here, but missed a third feature of the EnvInject-Plugin: The "Inject environment variables" build step that can inject variables into following build steps based on the result of a script or properties.

We're using the EnvInject plugin just like that; A script sets up a resource and communicates its parameters using properties that are then propagated by the plugin as environment variables.

i.e. setting up a temporary database for the build: Create a database for the build

like image 87
jjungnickel Avatar answered Sep 18 '22 18:09

jjungnickel