我有一个小型多项目Gradle构建。我首先为它构建了一个Maven构建结构,并且工作正常。有三个子项目。其中两个构造WAR文件。最后一个使用另外两个WAR文件构建一个Docker镜像。
顶级Maven聚合器使用配置文件激活,因此只有在操作系统是Linux时才构建Docker镜像项目。最终,我需要一个更好的条件检查(当Docker成为Windows中的第一类元素时)。目前,Maven配置文件激活检查工作正常。
我想在Gradle构建中做类似的事情,因为它目前正试图在Windows上构建Docker镜像,但这不起作用。
如果Docker不可用,那么在Docker构建子项目中使用Gradle构建的最佳方法是什么(如果以后也可以做到这一点)?如果这太难了,我可以满足于只在Linux上构建它。
答案 0 :(得分:0)
我不认为,有一个简单的解决方案。特别是如果您希望它与平台无关。我可以建议的唯一解决方案是使函数运行CLI命令gradle -v
并解析此命令输出。但是,要运行此命令,您必须执行特定于平台的调用。像这样:
import org.apache.tools.ant.taskdefs.condition.Os
//if true then Docker is available locally, otherwise false
ext.isDockerAvailable = { ->
def commandStdOut = new ByteArrayOutputStream()
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
//for Windows OS
exec {
commandLine "cmd", "/c", 'gradle', '-v'
standardOutput = commandStdOut
}
} else if (Os.isFamily(Os.FAMILY_UNIX)) {
//for Unix-family OS
exec {
commandLine "sh", "/c", 'gradle', '-v'
standardOutput = commandStdOut
}
} else {
//if OS is unsupported
println 'Unsupported OS version'
}
commandStdOut = commandStdOut.toString().trim()
//check command output for predefined words
return commandStdOut.contains('Build time:') && commandStdOut.contains('Revision:')
}.call()
task buildDockerImage {
enabled = isDockerAvailable
}
当然,这适用于Windows和Unix系列操作系统。
如果您不关心是否构建图像,为什么不简单地为docker-tasks设置ignoreFailures
,如果它们在Windows上失败则忽略它们。
无论如何,我想,使用远程构建服务器(使用Docker远程API)来完成这样的任务要好得多。在这种情况下,如果您在同一个局域网中,那么您和其他人都不需要安装本地Docker分发。