2017-07-06 1 views
0

J'essaie de créer 2 tâches pour exécuter la tâche sonarcube. Je veux être en mesure de spécifier des propriétés différentes en fonction de la tâcheImpossible d'avoir différentes valeurs de propriétés système pour différentes tâches

task sonarqubePullRequest(type: Test){ 

     System.setProperty("sonar.projectName", "sonarqubePullRequest") 
     System.setProperty("sonar.projectKey", "sonarqubePullRequest") 
     System.setProperty("sonar.projectVersion", serviceVersion) 
     System.setProperty("sonar.jacoco.reportPath", 
     "${project.buildDir}/jacoco/test.exec") 

     tasks.sonarqube.execute() 
    } 


task sonarqubeFullScan(type: Test){ 
    System.setProperty("sonar.projectName", "sonarqubeFullScan") 
    System.setProperty("sonar.projectKey", "sonarqubeFullScan") 
    System.setProperty("sonar.projectVersion", serviceVersion) 
    System.setProperty("sonar.jacoco.reportPath", 
    "${project.buildDir}/jacoco/test.exec") 
    tasks.sonarqube.execute() 
} 

Les tâches de travail, mais il semble y avoir un problème avec les propriétés que je suis en train

si je lance la première tâche qui est sonarqubePullRequest alors tout va bien, mais si vous exécutez sonarqubeFullScan alors si utilise les valeurs spécifiées dans le sonarqubePullRequest. donc le nom du projet est défini par sonarqubePullRequest

c'est comme si ces propriétés sont définies au moment de l'exécution et ne peuvent pas être mises à jour. J'ai l'impression qu'il me manque quelque chose d'évident toutes les suggestions grandement reçues.

Répondre

2

Tout d'abord: NEVER use execute() on tasks. La méthode ne fait pas partie de l'API Gradle publique et, par conséquent, son comportement peut changer ou être indéfini. Gradle exécutera les tâches par lui-même, soit parce que vous les avez spécifiées (ligne de commande ou settings.gradle), soit en tant que dépendances de tâches.

La raison pour laquelle votre code ne fonctionne pas est la difference between the configuration phase and the execution phase. Dans la phase de configuration , tout le code (de configuration) dans vos fermetures de tâches est exécuté, mais pas les tâches. Ainsi, vous écraserez toujours les propriétés du système. Seules les actions de tâches (internes), les fermetures doFirst et doLast sont exécutées dans la phase d'exécution . Veuillez noter que chaque tâche est seulement exécutée UNE FOIS dans une construction, donc votre approche pour paramétrer une tâche deux fois ne fonctionnera jamais.

En outre, je ne comprends pas pourquoi vous utilisez les propriétés système pour configurer votre tâche sonarqube. Vous pouvez simplement configurer la tâche directement via:

sonarqube { 
    properties { 
     property 'sonar.projectName', 'sonarqubePullRequest' 
     // ... 
    } 
} 

Maintenant, vous pouvez configurer la tâche sonarqube. Pour distinguer vos deux cas, vous pouvez ajouter une condition pour différentes valeurs de propriété. L'exemple suivant utilise une propriété de projet Etat:

sonarqube { 
    properties { 
     // Same value for both cases 
     property 'sonar.projectVersion', serviceVersion 
     // Value based on condition 
     if (project.findProperty('fullScan') { 
      property 'sonar.projectName', 'sonarqubeFullScan' 
     } else { 
      property 'sonar.projectName', 'sonarqubePullRequest' 
     } 
    } 
} 

Vous pouvez également ajouter une autre tâche du type SonarQubeTask. De cette façon, vous pouvez paramétrer les tâches différemment et les appeler (via la ligne de commande ou de dépendance) chaque fois que vous avez besoin:

sonarqube { 
    // Generated by the plugin, parametrize like described above 
} 

task sonarqubeFull(type: org.sonarqube.gradle.SonarQubeTask) { 
    // Generated by your build script, parametrize in the same way 
} 
+0

grande réponse, une question comment puis-je passer une condition telle que « FULLSCAN » serait-ce via la ligne de commande 'gradle sonarqube fullScan'? – JaChNo

+0

Les propriétés du projet sont définies via '-P = '. Ainsi, pour l'exemple de code ci-dessus, vous pouvez spécifier '-PfullScan = true'. Vous pouvez également utiliser l'existence de la propriété du projet comme condition en vérifiant 'hasProperty ('fullScan')' Dans ce cas, '-PfullScan' serait suffisant. –