core: build initramfs using generic initramfs rule

This chips away at three different things:
 - it brings us closer to hermetic and cross-platform builds by not
   depending on genrule/shell and lz4-the-tool
 - it generalizes initramfs building (allowing for more than one to be
   built, if necessary)
 - sets the stage to use Bazel transitions [1] to force all included Go
   binaries to be built in pure/static mode while allowing host Go
   binaries to use cgo/dynamic linking if necessary, and hopefully also
   allowing us to get rid of some BUILD patches that set pure='on' in
   go_binary calls (notably needed in Cilium and some existing
   third_party dependencies).

[1] - https://docs.bazel.build/versions/master/skylark/config.html#user-defined-transitions

Test Plan: build machinery change, covered by existing tests

X-Origin-Diff: phab/D554
GitOrigin-RevId: a5561eb5ca16e6529b9a4a2b98352f579c424222
diff --git a/core/BUILD b/core/BUILD
index 03a5153..1229388 100644
--- a/core/BUILD
+++ b/core/BUILD
@@ -1,67 +1,40 @@
-genrule(
+load("//core/build:def.bzl", "smalltown_initramfs")
+
+smalltown_initramfs(
     name = "initramfs",
-    srcs = [
-        "//core/cmd/init",
-        "//core/cmd/kube",
-        "//third_party/xfsprogs:mkfs.xfs",
-        "@io_k8s_kubernetes//cmd/kubelet:_kubelet-pure",
-        "@com_github_containerd_containerd//cmd/containerd",
-        "@com_github_containerd_containerd//cmd/containerd-shim-runc-v2",
-        "@com_github_containernetworking_plugins//plugins/main/loopback",
-        "@com_github_containernetworking_plugins//plugins/main/ptp",
-        "@com_github_containernetworking_plugins//plugins/ipam/host-local",
-        "@com_github_google_gvisor//runsc",
-        "@com_github_google_gvisor_containerd_shim//cmd/containerd-shim-runsc-v1",
-        "//core/internal/containerd:ptp.json",
-        "//core/internal/containerd:loopback.json",
-        "//core/internal/containerd:config.toml",
-        "//core/internal/containerd:runsc.toml",
-        "@cacerts//file",
-        ":os-release-info",
+    extra_dirs = [
+        "/kubernetes/conf/flexvolume-plugins",
+        "/containerd/run",
     ],
-    outs = [
-        "initramfs.cpio.lz4",
-    ],
-    cmd = """
-    $(location @linux//:gen_init_cpio) - <<- 'EOF' | lz4 -l > \"$@\" 
-dir /dev 0755 0 0
-nod /dev/console 0600 0 0 c 5 1
-nod /dev/null 0644 0 0 c 1 3
-nod /dev/kmsg 0644 0 0 c 1 11
-nod /dev/ptmx 0644 0 0 c 5 2
-file /init $(location //core/cmd/init) 0755 0 0
-dir /etc 0755 0 0
-file /etc/os-release $(location :os-release-info) 0644 0 0
-dir /etc/ssl 0755 0 0
-file /etc/ssl/cert.pem $(location @cacerts//file) 0444 0 0
-dir /bin 0755 0 0
-file /bin/mkfs.xfs $(location //third_party/xfsprogs:mkfs.xfs) 0755 0 0
-dir /kubernetes 0755 0 0
-dir /kubernetes/bin 0755 0 0
-file /kubernetes/bin/kube $(location //core/cmd/kube) 0755 0 0
-dir /kubernetes/conf 0755 0 0
-dir /kubernetes/conf/flexvolume-plugins 0755 0 0
-dir /containerd 0755 0 0
-dir /containerd/bin 0755 0 0
-file /containerd/bin/containerd $(location @com_github_containerd_containerd//cmd/containerd) 0755 0 0
-file /containerd/bin/containerd-shim-runsc-v1 $(location @com_github_google_gvisor_containerd_shim//cmd/containerd-shim-runsc-v1) 0755 0 0
-file /containerd/bin/runsc $(location @com_github_google_gvisor//runsc) 0755 0 0
-dir /containerd/bin/cni 0755 0 0
-file /containerd/bin/cni/loopback $(location @com_github_containernetworking_plugins//plugins/main/loopback) 0755 0 0
-file /containerd/bin/cni/ptp $(location @com_github_containernetworking_plugins//plugins/main/ptp) 0755 0 0
-file /containerd/bin/cni/host-local $(location @com_github_containernetworking_plugins//plugins/ipam/host-local) 0755 0 0
-dir /containerd/run 0755 0 0
-dir /containerd/conf 0755 0 0
-dir /containerd/conf/cni 0755 0 0
-file /containerd/conf/cni/10-ptp.conf $(location //core/internal/containerd:ptp.json) 0444 0 0
-file /containerd/conf/cni/99-loopback.conf $(location //core/internal/containerd:loopback.json) 0444 0 0
-file /containerd/conf/config.toml $(location //core/internal/containerd:config.toml) 0444 0 0
-file /containerd/conf/runsc.toml $(location //core/internal/containerd:runsc.toml) 0444 0 0
-EOF
-    """,
-    tools = [
-        "@linux//:gen_init_cpio",
-    ],
+    files = {
+        "//core/cmd/init": "/init",
+        "//third_party/xfsprogs:mkfs.xfs": "/bin/mkfs.xfs",
+
+        # CA Certificate bundle & os-release
+        "@cacerts//file": "/etc/ssl/cert.pem",
+        ":os-release-info": "/etc/os-release",
+
+        # Hyperkube
+        "//core/cmd/kube": "/kubernetes/bin/kube",
+
+        # runsc/gVisor
+        "@com_github_google_gvisor//runsc": "/containerd/bin/runsc",
+        "@com_github_google_gvisor_containerd_shim//cmd/containerd-shim-runsc-v1": "/containerd/bin/containerd-shim-runsc-v1",
+
+        # Containerd
+        "@com_github_containerd_containerd//cmd/containerd": "/containerd/bin/containerd",
+
+        # Containerd config files
+        "//core/internal/containerd:runsc.toml": "/containerd/conf/runsc.toml",
+        "//core/internal/containerd:config.toml": "/containerd/conf/config.toml",
+        "//core/internal/containerd:loopback.json": "/containerd/conf/cni/99-loopback.conf",
+        "//core/internal/containerd:ptp.json": "/containerd/conf/cni/10-ptp.conf",
+
+        # CNI Plugins
+        "@com_github_containernetworking_plugins//plugins/main/loopback": "/containerd/bin/cni/loopback",
+        "@com_github_containernetworking_plugins//plugins/main/ptp": "/containerd/bin/cni/ptp",
+        "@com_github_containernetworking_plugins//plugins/ipam/host-local": "/containerd/bin/cni/host-local",
+    },
 )
 
 genrule(