aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/docker/docker_pull.bzl
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/docker/docker_pull.bzl')
-rw-r--r--src/test/docker/docker_pull.bzl80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/test/docker/docker_pull.bzl b/src/test/docker/docker_pull.bzl
new file mode 100644
index 0000000000..8fab57fe88
--- /dev/null
+++ b/src/test/docker/docker_pull.bzl
@@ -0,0 +1,80 @@
+# Copyright 2016 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Quick and not really nice docker_pull rules based on the docker daemon."""
+
+def _impl(repository_ctx):
+ docker = repository_ctx.which("docker")
+ if docker == None and repository_ctx.attr.optional:
+ repository_ctx.file("BUILD", """
+load("@bazel_tools//tools/build_defs/docker:docker.bzl", "docker_build")
+
+# an empty image to still allow building despite not having the base
+# image.
+docker_build(
+ name = "image",
+ visibility = ['//visibility:public'],
+)
+""")
+ repository_ctx.file("image.tar")
+ return
+
+ repository_ctx.file("BUILD", """
+load("@bazel_tools//tools/build_defs/docker:docker.bzl", "docker_build")
+
+docker_build(
+ name = "image",
+ base = ":base.tar",
+ visibility = ["//visibility:public"],
+)
+""")
+ tag = repository_ctx.attr.tag
+ cmd = "pull"
+ if repository_ctx.attr.dockerfile:
+ dockerfile = repository_ctx.path(repository_ctx.attr.dockerfile)
+ cmd = "build"
+ print("Running `docker build`")
+ result = repository_ctx.execute([
+ docker,
+ "build",
+ "-q",
+ "-t",
+ tag,
+ "-f",
+ dockerfile,
+ dockerfile.dirname,
+ ], quiet=False, timeout=3600)
+ else:
+ print("Running `docker pull`")
+ result = repository_ctx.execute([docker, "pull", tag], quiet=False, timeout=3600)
+ if result.return_code:
+ fail("docker %s failed with error code %s:\n%s" % (
+ cmd,
+ result.return_code,
+ result.stderr))
+ result = repository_ctx.execute([
+ docker, "save", "-o", repository_ctx.path("base.tar"), tag])
+ if result.return_code:
+ fail("docker save failed with error code %s:\n%s" % (
+ result.return_code,
+ result.stderr))
+
+docker_pull = repository_rule(
+ implementation = _impl,
+ attrs = {
+ "tag": attr.string(mandatory=True),
+ "dockerfile": attr.label(default=None),
+ "optional": attr.bool(default=False),
+ },
+)