2014-12-26 12 views
8

Ho un file di build Gradle in cui una delle attività è accedere alla finestra mobile. In questa attività, desidero che l'utente/CI fornisca il parametro docker_username, docker_password e docker_email.Proprietà Gradle facoltative

task loginDockerHub(group: "Docker", type:Exec) {   
    executable "docker" 
    args "login","-u", docker_username, "-p", docker_password, "-e", docker_email 
} 

Esecuzione gradle loginDockerHub -Pdocker_username=vad1mo ... tutto funziona come previsto.

Ma quando eseguo per esempio gradle build ottengo l'errore:

Could not find property 'docker_username' on task ':loginDockerHub'.

mi aspetterei questo errore sull'esecuzione gradle loginDockerHub senza fornire il parametro -P, ma non su altri compiti che non accedono docker_username/parametri della password.

Come posso avere parametri opzionali per il mio compito loginDockerHub in Gradle che non rendono il parametro obbligatorio per qualsiasi altra attività.

+1

Ricordate che compito * Configurazione * viene sempre valutato, indipendentemente dal fatto che le singole attività sono in realtà * * eseguito. –

risposta

7

È possibile verificare se la proprietà esiste e se non restituire un valore predefinito.

args "login", "-u", project.hasProperty("docker_username") ? docker_username : "" 

Aggiornamento: Partendo Gradle 2.13 è possibile semplificare questo un po '.

args "login", "-u", project.findProperty("docker_username") ?: "" 
+0

questo non funziona – Vadimo

+0

Stai ottenendo lo stesso errore? –

+0

sì, stesso errore. @oliver ha menzionato la fase di configurazione. Immagino che questo sia l'indizio – Vadimo

4

Non sono riuscito a trovare una soluzione al problema. This description ha suggerito di dichiarare azioni all'interno di un'attività. L'esecuzione dell'esecuzione della shell nell'attività di azione ha il comportamento che mi aspettavo, poiché le azioni vengono valutate quando l'attività viene eseguita.

task loginDockerHub(group: "Docker", type:Exec) { 
    doFirst{ 
     executable "docker" 
     args "login","-u", docker_username, "-p", docker_password, "-e", docker_email 
    } 
} 

esecuzione della loginDockerHub senza fornire i parametri docker_* sarà urlato un errore. L'esecuzione di qualsiasi altra attività funzionerà come previsto.

0

Ho dovuto farlo e non volevo che la mia build fallisse con un errore. Ho risolto in questo modo:

ext.shouldLoginDockerHub = project.hasProperty("docker_username"); 

task loginDockerHub(group: "Docker") { 
    doLast{ 
     if(shouldLoginDockerHub) { 
      exec { 
       executable "docker" 
       args "login","-u", docker_username, "-p", docker_password, "-e", docker_email 
      } 
     } else { 
      println "Not logging in to docker hub because docker_username was not provided."; 
     } 
    } 
} 

è possibile espandere la prima linea per cercare docker_password, docker_email, ecc

Problemi correlati