dev/docker xbuild (#89)
* feature: docker buildx support for arm64 and amd64
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 7c62158..36ac74c 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -66,6 +66,7 @@
- name: Build Runtime
working-directory: runtime
run: |
+ docker buildx create --use
./gradlew distDocker
# Test this repository
diff --git a/gradle/docker.gradle b/gradle/docker.gradle
index 6ad6850..2925875 100644
--- a/gradle/docker.gradle
+++ b/gradle/docker.gradle
@@ -45,8 +45,16 @@
dockerTimeout = project.hasProperty('dockerTimeout') ? dockerTimeout.toInteger() : 840
dockerRetries = project.hasProperty('dockerRetries') ? dockerRetries.toInteger() : 3
dockerBinary = project.hasProperty('dockerBinary') ? [dockerBinary] : ['docker']
- dockerBuildArg = ['build']
+ dockerBuildArg = ['buildx', 'build', '--platform']
}
+
+def dockerArchitecture = System.getProperty("os.arch")
+def dockerArchitectureMapping = [amd64:"linux/amd64", aarch64:"linux/arm64"]
+def dockerPrimaryArchitecture = dockerArchitectureMapping[dockerArchitecture]
+def dockerAllArchitectures = []
+
+dockerArchitectureMapping.each() { k, v -> dockerAllArchitectures << v }
+
ext.dockerTaggedImageName = dockerRegistry + dockerImagePrefix + '/' + dockerImageName + ':' + dockerImageTag
if(project.hasProperty('dockerHost')) {
@@ -62,7 +70,7 @@
task distDocker {
doLast {
def start = new Date()
- def cmd = dockerBinary + dockerBuildArg + ['-t', dockerImageName, project.buildscript.sourceFile.getParentFile().getAbsolutePath()]
+ def cmd = dockerBinary + dockerBuildArg + dockerPrimaryArchitecture + ['--load', '-t', dockerTaggedImageName, project.buildscript.sourceFile.getParentFile().getAbsolutePath()]
retry(cmd, dockerRetries, dockerTimeout)
println("Building '${dockerImageName}' took ${TimeCategory.minus(new Date(), start)}")
}
@@ -79,13 +87,15 @@
if(major == 1 && minor < 12) {
dockerCmd += ['-f']
}
- retry(dockerBinary + dockerCmd + [dockerImageName, dockerTaggedImageName], dockerRetries, dockerTimeout)
+ retry(dockerBinary + dockerCmd + [dockerTaggedImageName, dockerImageName], dockerRetries, dockerTimeout)
}
}
task pushImage {
doLast {
- def cmd = dockerBinary + ['push', dockerTaggedImageName]
+ def output = (dockerRegistry == '') ? '--load' : '--push'
+ def architectures = (dockerRegistry == '') ? dockerPrimaryArchitecture : dockerAllArchitectures.join(",")
+ def cmd = dockerBinary + dockerBuildArg + architectures + [output, '-t', dockerTaggedImageName, project.buildscript.sourceFile.getParentFile().getAbsolutePath()]
retry(cmd, dockerRetries, dockerTimeout)
}
}