Hoe stel je een omgevingsvariabele in vanuit een Gradle-build?

Ik probeer een omgevingsvariabele in te stellen vanuit mijn Gradle-build. Ik gebruik MacOS X (El Capitan).
Het commando is “gradle test”.

Ik probeer dit in mijn build.gradle:

task setenv(type: Exec) {
    commandLine "export", "SOME_TEST_VAR=aaa"
}
test.dependsOn setenv

en de build mislukt:

Uitvoering mislukt voor taak ‘:myproject:setenv’.

Er is een probleem opgetreden bij het starten van het proces ‘commando ‘exporteren”

Ik heb ook dit geprobeerd:

test.doFirst {
    ProcessBuilder pb1 = new ProcessBuilder("export SOME_TEST_VAR=some test value")
    pb1.start();
}

Het bouwen is gelukt. Als ik echter de omgevingsvariabele in mijn JUnit-test controleer, mislukt deze:

assertTrue(System.getenv().containsKey("SOME_TEST_VAR"));

Is er een manier om een ​​omgevingsvariabele in te stellen vanuit een Gradle-build (in het build.gradle-bestand)?

Bijwerken:

Ik heb het afzonderlijk getest: de waarden worden wel doorgegeven en mijn testtaak ontvangt alles, of het nu een systemProperty, omgevingsvariabelen of jvmArgs is.

Dus er is niets mis met Gradle zelf hier.

Het probleem doet zich voor wanneer ik het op het echte project probeer. Het gebruikt Spring voor afhankelijkheidsinjectie. Ik kan het mis hebben, maar het lijkt erop dat het Spring-framework die waarden ergens opschoont.

Dat subproject wordt momenteel bevroren en ik kan mijn gok nu niet in detail controleren.


Antwoord 1, autoriteit 100%

Voor een testtaak kunt u de omgevingseigenschapals volgt:

test {
  environment "VAR", "val"
}

u kunt ook de omgevingseigenschapin een uitvoerende taak

task dropDatabase(type: Exec) {
    environment "VAR", "val"
    commandLine "doit"
}

Merk op dat bij deze methode de omgevingsvariabelen alleen tijdens de taak worden ingesteld.


Antwoord 2, autoriteit 9%

U kunt de instelling van de omgevingsvariabele ook “voorafzetten” door het ‘environment’-commando te gebruiken:

run.doFirst { environment 'SPARK_LOCAL_IP', 'localhost' }

Antwoord 3, autoriteit 2%

Als u globale omgevingsvariabelen hebt gedefinieerd buiten Gradle,

test {
    environment "ENV_VAR",  System.getenv('ENV_VAR')
    useJUnitPlatform()
}

Antwoord 4, autoriteit 2%

Dit ziet eruit als een oude thread, maar er is nog een variant van hoe we een omgevingsvariabele kunnen instellen in de Gradle-taak.

task runSomeRandomTask(type: NpmTask, dependsOn: [npmInstall]) {
    environment = [ 'NODE_ENV': 'development', BASE_URL: '3000' ]
    args = ['run']
}

De bovenstaande Gradle-taak integreert de Gradle- en npm-taken.

Op deze manier kunnen we meerdere omgevingsvariabelen doorgeven. Ik hoop dat dit helpt om het begrip te verbreden dat de bovenstaande antwoorden al hebben gegeven. Proost!!


Antwoord 5

Deze werkt voor mij voor instellingen omgevingsvariabele voor de testplug-in

test {
    systemProperties = [
        'catalina.home': 'c:/test'
    ]
    println "Starting Tests"
    beforeTest { descriptor ->
       logger.lifecycle("Running test: " + descriptor)                
    }    
}

Antwoord 6

Als u de Gradle Kotlin-syntaxis gebruikt, kunt u ook het volgende doen:

tasks.taskName {
    environment(mapOf("A" to 1, "B" to "C"))
}

Dus voor testtaak zou dit zijn:

tasks.test {
    environment(mapOf("SOME_TEST_VAR" to "aaa"))
}

Antwoord 7

Als je een IDE gebruikt, ga dan naar run, edit configurations, gradle,
selecteer gradle-taak en werk de omgevingsvariabelen bij. Zie de afbeelding hieronder.

voer hier de afbeeldingsbeschrijving in

Als u gradle-commando’s uitvoert met terminal,
typ gewoon ‘export KEY=VALUE’, en je werk is gedaan.


Antwoord 8

Probeer deze ene optie:

task RunTest(type: Test) {
         systemProperty "spring.profiles.active", System.getProperty("DEV")
         include 'com/db/project/Test1.class'
     }

Antwoord 9

Omgevingsvariabelen zijn nodig om de uitvoering van de geleidelijke taken aan te passen.
Hieronder staat de werkende code in gradle 7.3.2, waar de host en poort moeten worden doorgegeven aan de komkommerstappen.

   task runFunctionalTests() {
    dependsOn assemble, testClasses
    doLast {
        javaexec {
            mainClass = "io.cucumber.core.cli.Main"
            classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output
            args = [
                    '--glue', 'com.examples.functional.steps',
               'src/test/java/com/examples/tests/functional/features'
            ]
            environment 'PROTOCOL', 'http'
            environment "HOST", "myserver"
            environment 'PORT', '8080'
        }
    }
}

En dan krijg je toegang tot de omgevingsvariabele in de komkommerstappen zoals hieronder

String host = System.getenv("HOST");
int port = Integer.parseInt(System.getenv("PORT"));
String host = System.getenv("PROTOCOL");

Antwoord 10

In mijn project heb ik Gradle-taak voor integratietest in submodule:

task intTest(type: Test) {
...
system.properties System.properties 
...

dit is het belangrijkste punt om al uw systeemparameters in de testomgeving te injecteren.
Dus nu kun je gradle op deze manier uitvoeren om param met ABC-waarde door te geven en de waarde met ${param} in je code te gebruiken

gradle :some-service:intTest -Dparam=ABC

Other episodes