How to set an environment variable from a Gradle build?
I'm trying to set an environment variable from my Gradle build. I'm on MacOS X (El Capitan). The command is "gradle test".
I'm trying this in my build.gradle:
task setenv(type: Exec) {
commandLine "export", "SOME_TEST_VAR=aaa"
}
test.dependsOn setenv
and the build fails:
Execution failed for task ':myproject:setenv'.
A problem occurred starting process 'command 'export''
I also tried this:
test.doFirst {
ProcessBuilder pb1 = new ProcessBuilder("export SOME_TEST_VAR=some test value")
pb1.start();
}
The build succeeds. However, if I check the environment variable in my JUnit test it fails:
assertTrue(System.getenv().containsKey("SOME_TEST_VAR"));
Is there any way to set an environment variable from a Gradle build (in the build.gradle file)?
Update:
I've tested it in isolation: the values do get passed and my test task receives everything, be it a systemProperty, environment variables or jvmArgs.
So, it's nothing wrong with Gradle itself here.
The problem arises when I'm trying it on the real project. It uses Spring for dependency injection. I may be wrong but it looks like the Spring framework purges those values somewhere.
That sub-project is currently being frozen and I can't check my guess in detail right now.
For a test task, you can use the environment property like this:
test {
environment "VAR", "val"
}
you can also use the environment property in an exec task
task dropDatabase(type: Exec) {
environment "VAR", "val"
commandLine "doit"
}
Note that with this method the environment variables are set only during the task.
You can also "prepend" the environment variable setting by using 'environment' command:
run.doFirst { environment 'SPARK_LOCAL_IP', 'localhost' }
If you have global environment variables defined outside Gradle,
test {
environment "ENV_VAR", System.getenv('ENV_VAR')
useJUnitPlatform()
}