我有一个Gradle构建文件,其中一个任务是登录docker。在此任务中,我希望user / CI提供参数docker_username,docker_password和docker_email。
task loginDockerHub(group: "Docker", type:Exec) {
executable "docker"
args "login","-u", docker_username, "-p", docker_password, "-e", docker_email
}
执行gradle loginDockerHub -Pdocker_username=vad1mo ...
all正在按预期工作。
但是当我执行例如gradle build
时,我收到错误:
无法在任务':loginDockerHub'上找到属性'docker_username'。
我希望在不提供-P参数的情况下执行gradle loginDockerHub
时会出现此错误,但对于不访问docker_username / password参数的其他任务则不会。
如何在Gradle中为loginDockerHub
任务提供可选参数,这些参数不会使参数成为任何其他任务的必需参数。
答案 0 :(得分:12)
您可以检查属性是否存在,如果不是,则返回默认值。
args "login", "-u", project.hasProperty("docker_username") ? docker_username : ""
更新:从Gradle 2.13开始,您可以稍微简化一下。
args "login", "-u", project.findProperty("docker_username") ?: ""
答案 1 :(得分:4)
我无法找到问题的解决方案。 This description提示有关在任务中声明操作的提示。将shell exec放入action任务具有我期望的行为,因为在任务执行时会评估操作。
task loginDockerHub(group: "Docker", type:Exec) {
doFirst{
executable "docker"
args "login","-u", docker_username, "-p", docker_password, "-e", docker_email
}
}
在不提供loginDockerHub
参数的情况下执行docker_*
会出错。执行任何其他任务将按预期工作。
答案 2 :(得分:0)
我必须这样做,并且不希望我的构建因错误而失败。我解决了这个问题:
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.";
}
}
}
您可以扩展第一行以查找docker_password,docker_email等。