From dfdfc2e5b85121e14239219402f5f128a2e99a96 Mon Sep 17 00:00:00 2001 From: Jeff Grafton Date: Fri, 8 Feb 2019 16:51:22 -0800 Subject: [PATCH] Make debs, rpms, and docker images multiarch --- build/BUILD | 33 +++++++--- build/debs/BUILD | 153 +++++++++++++++++++++++++++++--------------- build/platforms.bzl | 36 +++++++++++ build/rpms/BUILD | 80 +++++++++++++++-------- 4 files changed, 215 insertions(+), 87 deletions(-) diff --git a/build/BUILD b/build/BUILD index e015f503324..25b6c919342 100644 --- a/build/BUILD +++ b/build/BUILD @@ -3,6 +3,7 @@ package(default_visibility = ["//visibility:public"]) load("@io_bazel_rules_docker//container:container.bzl", "container_bundle", "container_image") load("@io_k8s_repo_infra//defs:build.bzl", "release_filegroup") load(":code_generation_test.bzl", "code_generation_test_suite") +load(":platforms.bzl", "for_platforms") code_generation_test_suite( name = "code_generation_tests", @@ -30,23 +31,38 @@ filegroup( # in build/common.sh. DOCKERIZED_BINARIES = { "cloud-controller-manager": { - "base": "@debian-base-amd64//image", + "base": select(for_platforms( + for_node = "@debian-base-{ARCH}//image", + only_os = "linux", + )), "target": "//cmd/cloud-controller-manager:cloud-controller-manager", }, "kube-apiserver": { - "base": "@debian-base-amd64//image", + "base": select(for_platforms( + for_node = "@debian-base-{ARCH}//image", + only_os = "linux", + )), "target": "//cmd/kube-apiserver:kube-apiserver", }, "kube-controller-manager": { - "base": "@debian-base-amd64//image", + "base": select(for_platforms( + for_node = "@debian-base-{ARCH}//image", + only_os = "linux", + )), "target": "//cmd/kube-controller-manager:kube-controller-manager", }, "kube-scheduler": { - "base": "@debian-base-amd64//image", + "base": select(for_platforms( + for_node = "@debian-base-{ARCH}//image", + only_os = "linux", + )), "target": "//cmd/kube-scheduler:kube-scheduler", }, "kube-proxy": { - "base": "@debian-iptables-amd64//image", + "base": select(for_platforms( + for_node = "@debian-iptables-{ARCH}//image", + only_os = "linux", + )), "target": "//cmd/kube-proxy:kube-proxy", }, } @@ -55,9 +71,10 @@ DOCKERIZED_BINARIES = { name = binary + "-internal", base = meta["base"], cmd = ["/usr/bin/" + binary], - debs = [ - "//build/debs:%s.deb" % binary, - ], + debs = select(for_platforms( + for_node = ["//build/debs:%s-{ARCH}.deb" % binary], + only_os = "linux", + )), stamp = True, symlinks = { # Some cluster startup scripts expect to find the binaries in /usr/local/bin, diff --git a/build/debs/BUILD b/build/debs/BUILD index f4163dfb862..20f8a5a82fe 100644 --- a/build/debs/BUILD +++ b/build/debs/BUILD @@ -1,8 +1,15 @@ package(default_visibility = ["//visibility:public"]) -load("@io_k8s_repo_infra//defs:deb.bzl", "k8s_deb", "deb_data") +load("@io_k8s_repo_infra//defs:deb.bzl", "deb_data", "k8s_deb") load("@io_k8s_repo_infra//defs:build.bzl", "release_filegroup") load("@io_k8s_repo_infra//defs:pkg.bzl", "pkg_tar") +load( + "//build:platforms.bzl", + "CLIENT_PLATFORMS", + "NODE_PLATFORMS", + "SERVER_PLATFORMS", + "for_platforms", +) load("//build:workspace.bzl", "CNI_VERSION", "CRI_TOOLS_VERSION") # We do not include kube-scheduler, kube-controller-manager, @@ -12,16 +19,54 @@ load("//build:workspace.bzl", "CNI_VERSION", "CRI_TOOLS_VERSION") # images. release_filegroup( name = "debs", - srcs = [ - ":cri-tools.deb", - ":kubeadm.deb", - ":kubectl.deb", - ":kubelet.deb", - ":kubernetes-cni.deb", - ], + conditioned_srcs = for_platforms( + default = [], + for_client = [":kubectl-{ARCH}.deb"], + for_node = [ + ":cri-tools-{ARCH}.deb", + ":kubeadm-{ARCH}.deb", + ":kubelet-{ARCH}.deb", + ":kubernetes-cni-{ARCH}.deb", + ], + only_os = "linux", + ), ) +# Create aliases from the non-arch names to the arch-specific names for backwards compatibility +alias( + name = "kubectl", + actual = select(for_platforms( + for_client = ":kubectl-{ARCH}", + only_os = "linux", + )), +) + +[alias( + name = pkg, + actual = select(for_platforms( + for_node = ":%s-{ARCH}" % pkg, + only_os = "linux", + )), +) for pkg in [ + "cri-tools", + "kubeadm", + "kubelet", + "kubernetes-cni", +]] + [deb_data( + name = "kubectl", + data = [ + { + "files": ["//cmd/kubectl"], + "mode": "0755", + "dir": "/usr/bin", + }, + ], + goarch = arch, +) for arch in CLIENT_PLATFORMS["linux"]] + +[[deb_data( name = binary, data = [ { @@ -30,26 +75,16 @@ release_filegroup( "dir": "/usr/bin", }, ], + goarch = arch, ) for binary in [ "cloud-controller-manager", - "kubectl", "kube-apiserver", "kube-controller-manager", "kube-proxy", -]] + "kube-scheduler", +]] for arch in SERVER_PLATFORMS["linux"]] -deb_data( - name = "kube-scheduler", - data = [ - { - "files": ["//cmd/kube-scheduler"], - "mode": "0755", - "dir": "/usr/bin", - }, - ], -) - -deb_data( +[deb_data( name = "kubelet", data = [ { @@ -63,9 +98,10 @@ deb_data( "dir": "/lib/systemd/system", }, ], -) + goarch = arch, +) for arch in NODE_PLATFORMS["linux"]] -deb_data( +[deb_data( name = "kubeadm", data = [ { @@ -89,63 +125,70 @@ deb_data( "dir": "/etc/sysctl.d", }, ], -) + goarch = arch, +) for arch in NODE_PLATFORMS["linux"]] -pkg_tar( - name = "kubernetes-cni-data", +[pkg_tar( + name = "kubernetes-cni-data-%s" % goarch, package_dir = "/opt/cni/bin", - deps = ["@kubernetes_cni//file"], -) + deps = ["@kubernetes_cni_%s//file" % goarch], +) for goarch in NODE_PLATFORMS["linux"]] -pkg_tar( - name = "cri-tools-data", +[pkg_tar( + name = "cri-tools-data-%s" % goarch, package_dir = "/usr/bin", - deps = ["@cri_tools//file"], -) + deps = ["@cri_tools_%s//file" % goarch], +) for goarch in NODE_PLATFORMS["linux"]] -k8s_deb( +[k8s_deb( name = "cloud-controller-manager", description = "Kubernetes Cloud Controller Manager", + goarch = arch, version_file = "//build:os_package_version", -) +) for arch in SERVER_PLATFORMS["linux"]] -k8s_deb( +[k8s_deb( name = "kubectl", description = """Kubernetes Command Line Tool The Kubernetes command line tool for interacting with the Kubernetes API. """, + goarch = arch, version_file = "//build:os_package_version", -) +) for arch in CLIENT_PLATFORMS["linux"]] -k8s_deb( +[k8s_deb( name = "kube-apiserver", description = "Kubernetes API Server", + goarch = arch, version_file = "//build:os_package_version", -) +) for arch in SERVER_PLATFORMS["linux"]] -k8s_deb( +[k8s_deb( name = "kube-controller-manager", description = "Kubernetes Controller Manager", + goarch = arch, version_file = "//build:os_package_version", -) +) for arch in SERVER_PLATFORMS["linux"]] -k8s_deb( +[k8s_deb( name = "kube-scheduler", description = "Kubernetes Scheduler", + goarch = arch, version_file = "//build:os_package_version", -) +) for arch in SERVER_PLATFORMS["linux"]] -k8s_deb( +[k8s_deb( name = "kube-proxy", depends = [ "iptables (>= 1.4.21)", "iproute2", ], description = "Kubernetes Service Proxy", + goarch = arch, version_file = "//build:os_package_version", -) +) for arch in NODE_PLATFORMS["linux"]] -k8s_deb( +[k8s_deb( name = "kubelet", depends = [ "conntrack", @@ -161,10 +204,11 @@ k8s_deb( description = """Kubernetes Node Agent The node agent of Kubernetes, the container cluster manager """, + goarch = arch, version_file = "//build:os_package_version", -) +) for arch in NODE_PLATFORMS["linux"]] -k8s_deb( +[k8s_deb( name = "kubeadm", depends = [ "kubelet (>= 1.8.0)", @@ -175,23 +219,26 @@ k8s_deb( description = """Kubernetes Cluster Bootstrapping Tool The Kubernetes command line tool for bootstrapping a Kubernetes cluster. """, + goarch = arch, postinst = "postinst", version_file = "//build:os_package_version", -) +) for arch in NODE_PLATFORMS["linux"]] -k8s_deb( +[k8s_deb( name = "kubernetes-cni", description = """Kubernetes Packaging of CNI The Container Networking Interface tools for provisioning container networks. """, + goarch = arch, version = CNI_VERSION, -) +) for arch in NODE_PLATFORMS["linux"]] -k8s_deb( +[k8s_deb( name = "cri-tools", description = """Container Runtime Interface tools (crictl)""", + goarch = arch, version = CRI_TOOLS_VERSION, -) +) for arch in NODE_PLATFORMS["linux"]] filegroup( name = "package-srcs", diff --git a/build/platforms.bzl b/build/platforms.bzl index 4ab13495349..898203381a0 100644 --- a/build/platforms.bzl +++ b/build/platforms.bzl @@ -73,3 +73,39 @@ TEST_PLATFORMS = { "amd64", ], } + +def go_platform_constraint(os, arch): + return "@io_bazel_rules_go//go/platform:%s_%s" % (os, arch) + +def _update_dict_for_platform_category(d, value, platforms, only_os = None): + if not value: + return + for os, arches in platforms.items(): + if only_os and os != only_os: + continue + for arch in arches: + constraint = go_platform_constraint(os, arch) + if type(value) == "list": + d.setdefault(constraint, []).extend( + [v.format(OS = os, ARCH = arch) for v in value], + ) + else: + if constraint in d: + fail("duplicate entry for constraint %s", constraint) + d[constraint] = value.format(OS = os, ARCH = arch) + +def for_platforms( + for_client = None, + for_node = None, + for_server = None, + for_test = None, + default = None, + only_os = None): + d = {} + if default != None: + d["//conditions:default"] = default + _update_dict_for_platform_category(d, for_client, CLIENT_PLATFORMS, only_os) + _update_dict_for_platform_category(d, for_node, NODE_PLATFORMS, only_os) + _update_dict_for_platform_category(d, for_server, SERVER_PLATFORMS, only_os) + _update_dict_for_platform_category(d, for_test, TEST_PLATFORMS, only_os) + return d diff --git a/build/rpms/BUILD b/build/rpms/BUILD index be011df488e..b6d5e33d17a 100644 --- a/build/rpms/BUILD +++ b/build/rpms/BUILD @@ -1,49 +1,76 @@ package(default_visibility = ["//visibility:public"]) -load("@bazel_tools//tools/build_defs/pkg:rpm.bzl", "pkg_rpm") +load("//build:platforms.bzl", "CLIENT_PLATFORMS", "NODE_PLATFORMS", "for_platforms") load("//build:workspace.bzl", "CNI_VERSION", "CRI_TOOLS_VERSION") +load("@io_k8s_repo_infra//defs:build.bzl", "release_filegroup") +load("@io_k8s_repo_infra//defs:rpm.bzl", "pkg_rpm_for_goarch") -filegroup( +release_filegroup( name = "rpms", - srcs = [ - ":cri-tools", - ":kubeadm", - ":kubectl", - ":kubelet", - ":kubernetes-cni", - ], + conditioned_srcs = for_platforms( + default = [], + for_client = [":kubectl-{ARCH}"], + for_node = [ + ":cri-tools-{ARCH}", + ":kubeadm-{ARCH}", + ":kubelet-{ARCH}", + ":kubernetes-cni-{ARCH}", + ], + only_os = "linux", + ), tags = ["manual"], visibility = ["//visibility:public"], ) -pkg_rpm( +# Create aliases from the non-arch names to the arch-specific names for backwards compatibility +alias( + name = "kubectl", + actual = select(for_platforms( + for_client = ":kubectl-{ARCH}", + only_os = "linux", + )), +) + +[alias( + name = pkg, + actual = select(for_platforms( + for_client = ":%s-{ARCH}" % pkg, + only_os = "linux", + )), +) for pkg in [ + "cri-tools", + "kubeadm", + "kubelet", + "kubernetes-cni", +]] + +[pkg_rpm_for_goarch( name = "kubectl", - architecture = "x86_64", changelog = "//:CHANGELOG.md", data = [ "//cmd/kubectl", ], + goarch = arch, spec_file = "kubectl.spec", tags = ["manual"], version_file = "//build:os_package_version", -) +) for arch in CLIENT_PLATFORMS["linux"]] -pkg_rpm( +[pkg_rpm_for_goarch( name = "kubelet", - architecture = "x86_64", changelog = "//:CHANGELOG.md", data = [ "kubelet.service", "//cmd/kubelet", ], + goarch = arch, spec_file = "kubelet.spec", tags = ["manual"], version_file = "//build:os_package_version", -) +) for arch in NODE_PLATFORMS["linux"]] -pkg_rpm( +[pkg_rpm_for_goarch( name = "kubeadm", - architecture = "x86_64", changelog = "//:CHANGELOG.md", data = [ "10-kubeadm.conf", @@ -52,33 +79,34 @@ pkg_rpm( "kubelet.env", "//cmd/kubeadm", ], + goarch = arch, spec_file = "kubeadm.spec", tags = ["manual"], version_file = "//build:os_package_version", -) +) for arch in NODE_PLATFORMS["linux"]] -pkg_rpm( +[pkg_rpm_for_goarch( name = "kubernetes-cni", - architecture = "x86_64", changelog = "//:CHANGELOG.md", data = [ - "@kubernetes_cni//file", + "@kubernetes_cni_{GOARCH}//file", ], + goarch = arch, spec_file = "kubernetes-cni.spec", tags = ["manual"], version = CNI_VERSION, -) +) for arch in NODE_PLATFORMS["linux"]] -pkg_rpm( +[pkg_rpm_for_goarch( name = "cri-tools", - architecture = "x86_64", data = [ - "@cri_tools//file", + "@cri_tools_{GOARCH}//file", ], + goarch = arch, spec_file = "cri-tools.spec", tags = ["manual"], version = CRI_TOOLS_VERSION, -) +) for arch in NODE_PLATFORMS["linux"]] filegroup( name = "package-srcs",