mirror of https://github.com/k3s-io/k3s
133 lines
5.3 KiB
Python
133 lines
5.3 KiB
Python
# Copyright 2019 The Kubernetes Authors.
|
|
#
|
|
# 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.
|
|
|
|
load("@io_bazel_rules_docker//container:container.bzl", "container_bundle", "container_image")
|
|
load("@io_bazel_rules_docker//contrib:push-all.bzl", "docker_push")
|
|
load("//build:platforms.bzl", "go_platform_constraint")
|
|
|
|
# multi_arch_container produces a private internal container_image, multiple
|
|
# arch-specific tagged container_bundles (named NAME-ARCH), an alias
|
|
# from NAME to the appropriately NAME-ARCH container_bundle target, and a
|
|
# genrule for NAME.tar copying the appropriate NAME-ARCH container bundle
|
|
# tarball output for the currently-configured architecture.
|
|
# Additionally, if docker_push_tags is provided, uses multi_arch_container_push
|
|
# to create container_bundles named push-NAME-ARCH with the provided push tags,
|
|
# along with a push-NAME docker_push target.
|
|
# Args:
|
|
# name: name used for the alias; the internal container_image and
|
|
# container_bundles are based on this name
|
|
# architectures: list of architectures (in GOARCH naming parlance) to
|
|
# configure
|
|
# base: base image to use for the containers. The format string {ARCH} will
|
|
# be replaced with the configured GOARCH.
|
|
# docker_tags: list of docker tags to apply to the image. The format string
|
|
# {ARCH} will be replaced with the configured GOARCH; any stamping variables
|
|
# should be escaped, e.g. {{STABLE_MY_VAR}}.
|
|
# docker_push_tags: list of docker tags to apply to the image for pushing.
|
|
# The format string {ARCH} will be replaced with the configured GOARCH;
|
|
# any stamping variables should be escaped, e.g. {{STABLE_MY_VAR}}.
|
|
# tags: will be applied to all targets
|
|
# visiblity: will be applied only to the container_bundles; the internal
|
|
# container_image is private
|
|
# All other args will be applied to the internal container_image.
|
|
def multi_arch_container(
|
|
name,
|
|
architectures,
|
|
base,
|
|
docker_tags,
|
|
docker_push_tags = None,
|
|
tags = None,
|
|
visibility = None,
|
|
**kwargs):
|
|
container_image(
|
|
name = "%s-internal" % name,
|
|
base = select({
|
|
go_platform_constraint(os = "linux", arch = arch): base.format(ARCH = arch)
|
|
for arch in architectures
|
|
}),
|
|
tags = tags,
|
|
visibility = ["//visibility:private"],
|
|
**kwargs
|
|
)
|
|
|
|
for arch in architectures:
|
|
container_bundle(
|
|
name = "%s-%s" % (name, arch),
|
|
images = {
|
|
docker_tag.format(ARCH = arch): ":%s-internal" % name
|
|
for docker_tag in docker_tags
|
|
},
|
|
tags = tags,
|
|
visibility = visibility,
|
|
)
|
|
native.alias(
|
|
name = name,
|
|
actual = select({
|
|
go_platform_constraint(os = "linux", arch = arch): "%s-%s" % (name, arch)
|
|
for arch in architectures
|
|
}),
|
|
)
|
|
native.genrule(
|
|
name = "gen_%s.tar" % name,
|
|
outs = ["%s.tar" % name],
|
|
srcs = select({
|
|
go_platform_constraint(os = "linux", arch = arch): ["%s-%s.tar" % (name, arch)]
|
|
for arch in architectures
|
|
}),
|
|
cmd = "cp $< $@",
|
|
output_to_bindir = True,
|
|
)
|
|
|
|
if docker_push_tags:
|
|
multi_arch_container_push(
|
|
name = name,
|
|
architectures = architectures,
|
|
docker_tags_images = {docker_push_tag: ":%s-internal" % name for docker_push_tag in docker_push_tags},
|
|
tags = tags,
|
|
)
|
|
|
|
# multi_arch_container_push creates container_bundles named push-NAME-ARCH for
|
|
# the provided architectures, populating them with the images directory.
|
|
# It additionally creates a push-NAME docker_push rule which can be run to
|
|
# push the images to a Docker repository.
|
|
# Args:
|
|
# name: name used for targets created by this macro; the internal
|
|
# container_bundles are based on this name
|
|
# architectures: list of architectures (in GOARCH naming parlance) to
|
|
# configure
|
|
# docker_tags_images: dictionary mapping docker tag to the corresponding
|
|
# container_image target. The format string {ARCH} will be replaced
|
|
# in tags with the configured GOARCH; any stamping variables should be
|
|
# escaped, e.g. {{STABLE_MY_VAR}}.
|
|
# tags: applied to container_bundle targets
|
|
def multi_arch_container_push(
|
|
name,
|
|
architectures,
|
|
docker_tags_images,
|
|
tags = None):
|
|
for arch in architectures:
|
|
container_bundle(
|
|
name = "push-%s-%s" % (name, arch),
|
|
images = {tag.format(ARCH = arch): image for tag, image in docker_tags_images.items()},
|
|
tags = tags,
|
|
visibility = ["//visibility:private"],
|
|
)
|
|
docker_push(
|
|
name = "push-%s" % name,
|
|
bundle = select({
|
|
go_platform_constraint(os = "linux", arch = arch): "push-%s-%s" % (name, arch)
|
|
for arch in architectures
|
|
}),
|
|
)
|