]> go.fuhry.dev Git - runtime.git/commitdiff
[pkg] multiarch support!
authorDan Fuhry <dan@fuhry.com>
Mon, 19 Oct 2026 20:32:25 +0000 (16:32 -0400)
committerDan Fuhry <dan@fuhry.com>
Mon, 19 Oct 2026 21:28:28 +0000 (17:28 -0400)
20 files changed:
bazel/pkg.bzl
cmd/apcups_exporter/BUILD.bazel
cmd/ephs_client/BUILD.bazel
cmd/http_proxy/BUILD.bazel
cmd/metricbus_server/BUILD.bazel
cmd/mtls_exporter/BUILD.bazel
cmd/mtls_supervisor/BUILD.bazel
cmd/sd_health_exporter/BUILD.bazel
cmd/sd_publish/BUILD.bazel
cmd/sd_register/BUILD.bazel
cmd/sd_watcher/BUILD.bazel
pkg/BUILD.bazel
pkg/apcupsd-exporter.yaml
pkg/coredns.yaml
pkg/http-proxy.yaml
pkg/ldap-health-exporter.yaml
pkg/nfpmgen/config_generator.go
pkg/nfpmgen/main.go
pkg/prometheus-helpers.yaml
pkg/runtime-utils.yaml

index db2509790fc86ed33ae8a658ce62d023e127fd12..eda01218eb8056d9a114ab59e479f558b46071c7 100644 (file)
@@ -1,8 +1,13 @@
+load("@bazel_skylib//lib:paths.bzl", "paths")
+
 def _nfpm_package(
     package_name,
     config,
+    exes,
     data,
     packager,
+    os,
+    arch,
 ):
     extension_map = {
         "archlinux": "pkg.tar.zst",
@@ -18,9 +23,24 @@ def _nfpm_package(
             "ENV_DIR": "/etc/default",
         },
     }
-    pkg_prefix = "{}_{}".format(package_name.replace("-", "_"), packager)
     extra_args = []
-    for target in data:
+    _exes = []
+    exe_suffix = ""
+    if os != "linux" or arch != "amd64":
+        exe_suffix = "_{}_{}".format(os, arch)
+        extra_args.append("--platform={}".format(os))
+        extra_args.append("--arch={}".format(arch))
+
+    for exe in exes:
+        if ":" not in exe:
+            exe += ":" + paths.basename(exe)
+        exe += exe_suffix
+        _exes.append(exe)
+
+    pkg_prefix = "{}_{}".format(package_name.replace("-", "_"), packager)
+    if arch != "amd64":
+        pkg_prefix += "_{}".format(arch)
+    for target in data + _exes:
         extra_args.append('--include="$(location {})"'.format(target))
 
     for var, val in distro_vars.get(packager, {}).items():
@@ -31,7 +51,7 @@ def _nfpm_package(
         tools = [
             "//pkg/nfpmgen",
         ],
-        srcs = [config] + data,
+        srcs = [config] + data + _exes,
         outs = [
             "{}_nfpm_config.yaml".format(pkg_prefix),
         ],
@@ -47,9 +67,9 @@ def _nfpm_package(
         ],
         srcs = [
             ":{}_nfpm_config".format(pkg_prefix),
-        ] + data,
+        ] + data + _exes,
         outs = [
-            "{}.{}".format(package_name, extension_map.get(packager, packager)),
+            "{}_{}.{}".format(package_name, arch, extension_map.get(packager, packager)),
         ],
         cmd = " ".join([
             "$(location @com_github_goreleaser_nfpm_v2//cmd/nfpm:nfpm)",
@@ -63,8 +83,14 @@ def _nfpm_package(
 def nfpm_package(
     name,  # type: str
     config,  # type: str
-    data,  # type: list[str]
+    exes = [],  # type: list[str]
+    data = [],  # type: list[str]
+    linux_arm64 = False,  # type: bool
 ):
     #for packager in ["deb", "archlinux", "rpm"]:
     for packager in ["archlinux", "apk", "deb"]:
-        _nfpm_package(name, config, data, packager)
\ No newline at end of file
+        _nfpm_package(name, config, exes, data, packager, "linux", "amd64")
+
+        if linux_arm64:
+            _nfpm_package(name, config, exes, data, packager, "linux", "arm64")
+            _nfpm_package(name, config, exes, data, packager, "linux", "arm")
\ No newline at end of file
index 2f829ecd1b4992ad28f5638b76d8eca66520a3fa..1f99536e6b9439662fba41132051c950c297d83b 100644 (file)
@@ -38,7 +38,7 @@ systemd_service(
         "$APCUPSD_EXPORTER_ARGS",
     ],
     description = "apcupsd-exporter polls apcupsd for UPS %i and exports metrics via metric-collector",
-    environment_file = "$${const:ExePrefix}apcupsd-exporter@%i",
+    environment_file = "${const:ExePrefix}apcupsd-exporter@%i",
     exe = "apcups_exporter",
     group = "daemon",
     type = "notify",
index 59331806ae242b571d210956a3bc7d6ab1bb246d..e6f9aa10b07bdbd83e54ea0bfa4a63780e14ee25 100644 (file)
@@ -1,5 +1,8 @@
+load("//bazel:cross.bzl", "go_cross_binaries")
 load("//bazel:go.bzl", "go_multi_binary", "go_multi_library")
 
+package(default_visibility = ["//visibility:public"])
+
 go_multi_library(
     name = "ephs_client_lib",
     srcs = ["main.go"],
@@ -22,3 +25,8 @@ go_multi_binary(
     embed = [":ephs_client_lib"],
     visibility = ["//visibility:public"],
 )
+
+go_cross_binaries(
+    base_target = "ephs_client",
+    linux_arm = True,
+)
index e2893416097007f4aeaa651700d0e5f6938be2c1..f99db51274fcf2ee861c5c69aee71b61c27adb85 100644 (file)
@@ -1,6 +1,10 @@
+load("//bazel:cross.bzl", "go_cross_binaries")
 load("//bazel:go.bzl", "go_multi_binary", "go_multi_library")
 load("//bazel:svc.bzl", "systemd_service")
 
+
+package(default_visibility = ["//visibility:public"])
+
 go_multi_library(
     name = "http_proxy_lib",
     srcs = ["main.go"],
@@ -20,7 +24,11 @@ go_multi_library(
 go_multi_binary(
     name = "http_proxy",
     embed = [":http_proxy_lib"],
-    visibility = ["//visibility:public"],
+)
+
+go_cross_binaries(
+    base_target = "http_proxy",
+    linux_arm = True,
 )
 
 systemd_service(
index 959b9b085989ea15ca929eb583d4fcc12fd6c431..2009fe6b07758183052f9f3d638d026345933d7f 100644 (file)
@@ -1,6 +1,9 @@
+load("//bazel:cross.bzl", "go_cross_binaries")
 load("//bazel:go.bzl", "go_multi_binary", "go_multi_library")
 load("//bazel:svc.bzl", "systemd_dbus_service")
 
+package(default_visibility = ["//visibility:public"])
+
 go_multi_library(
     name = "metricbus_server_lib",
     srcs = ["main.go"],
@@ -19,6 +22,11 @@ go_multi_binary(
     visibility = ["//visibility:public"],
 )
 
+go_cross_binaries(
+    base_target = "metricbus_server",
+    linux_arm = True,
+)
+
 systemd_dbus_service(
     name = "metric-collector",
     args = [
index a68278f6b866ee48e5a1a694e9c2a30e33120348..8d7fa5ab07d6a7fb31bffed7ea5e406638cdef22 100644 (file)
@@ -1,6 +1,9 @@
+load("//bazel:cross.bzl", "go_cross_binaries")
 load("//bazel:go.bzl", "go_multi_binary", "go_multi_library")
 load("//bazel:svc.bzl", "systemd_service")
 
+package(default_visibility = ["//visibility:public"])
+
 go_multi_library(
     name = "mtls_exporter_lib",
     srcs = ["main.go"],
@@ -19,6 +22,11 @@ go_multi_binary(
     visibility = ["//visibility:public"],
 )
 
+go_cross_binaries(
+    base_target = "mtls_exporter",
+    linux_arm = True,
+)
+
 systemd_service(
     name = "mtls-exporter",
     args = [
index 419b4e64815d5c3348ccdb17502a449d65ffcf48..e209e91d544c089a886bd6e3435d5ee08a74aab8 100644 (file)
@@ -1,5 +1,8 @@
+load("//bazel:cross.bzl", "go_cross_binaries")
 load("//bazel:go.bzl", "go_multi_binary", "go_multi_library")
 
+package(default_visibility = ["//visibility:public"])
+
 go_multi_library(
     name = "mtls_supervisor_lib",
     srcs = [
@@ -23,3 +26,8 @@ go_multi_binary(
     embed = [":mtls_supervisor_lib"],
     visibility = ["//visibility:public"],
 )
+
+go_cross_binaries(
+    base_target = "mtls_supervisor",
+    linux_arm = True,
+)
\ No newline at end of file
index 6fdcdade2adcdfccf70faa90ffa18ffddb0e735f..36852b7151a004b986028053aa58eed9f99adf9e 100644 (file)
@@ -1,6 +1,9 @@
+load("//bazel:cross.bzl", "go_cross_binaries")
 load("//bazel:go.bzl", "go_multi_binary", "go_multi_library")
 load("//bazel:svc.bzl", "systemd_service")
 
+package(default_visibility = ["//visibility:public"])
+
 go_multi_library(
     name = "sd_health_exporter_lib",
     srcs = ["main.go"],
@@ -20,6 +23,11 @@ go_multi_binary(
     visibility = ["//visibility:public"],
 )
 
+go_cross_binaries(
+    base_target = "sd_health_exporter",
+    linux_arm = True,
+)
+
 systemd_service(
     name = "sd-health-exporter",
     args = [
index 31cbb73f2ea17dbf0f7558222e04118c1c4529c7..c94c46dbcc7a9ae7bb5a09347b8edeaf8a7de7ee 100644 (file)
@@ -1,5 +1,8 @@
+load("//bazel:cross.bzl", "go_cross_binaries")
 load("//bazel:go.bzl", "go_multi_binary", "go_multi_library")
 
+package(default_visibility = ["//visibility:public"])
+
 go_multi_library(
     name = "sd_publish_lib",
     srcs = ["main.go"],
@@ -18,3 +21,8 @@ go_multi_binary(
     embed = [":sd_publish_lib"],
     visibility = ["//visibility:public"],
 )
+
+go_cross_binaries(
+    base_target = "sd_publish",
+    linux_arm = True,
+)
index 16f7c816fd065321550308dcf7dd43d47fd0ff03..2126504a8528ac6a8e74bfcb7302c4495f7c9c61 100644 (file)
@@ -1,6 +1,9 @@
+load("//bazel:cross.bzl", "go_cross_binaries")
 load("//bazel:go.bzl", "go_multi_binary", "go_multi_library")
 load("//bazel:svc.bzl", "systemd_service")
 
+package(default_visibility = ["//visibility:public"])
+
 go_multi_library(
     name = "sd_register_lib",
     srcs = ["main.go"],
@@ -21,6 +24,11 @@ go_multi_binary(
     visibility = ["//visibility:public"],
 )
 
+go_cross_binaries(
+    base_target = "sd_register",
+    linux_arm = True,
+)
+
 systemd_service(
     name = "sd-register",
     args = [
index 5bbf16750323cde4e123a363fb6fe053dad3bec8..7f5572e89a5f21fe0327347cfd9c4cf670f48ad8 100644 (file)
@@ -1,5 +1,8 @@
+load("//bazel:cross.bzl", "go_cross_binaries")
 load("//bazel:go.bzl", "go_multi_binary", "go_multi_library")
 
+package(default_visibility = ["//visibility:public"])
+
 go_multi_library(
     name = "sd_watcher_lib",
     srcs = ["main.go"],
@@ -17,3 +20,8 @@ go_multi_binary(
     embed = [":sd_watcher_lib"],
     visibility = ["//visibility:public"],
 )
+
+go_cross_binaries(
+    base_target = "sd_watcher",
+    linux_arm = True,
+)
index 87d805b16d1483ddb56f90288b66c0524a062e2e..9f6e2c1c5c39229b2dd0a682e561923d0eccc9a9 100644 (file)
@@ -3,29 +3,35 @@ load("//bazel:pkg.bzl", "nfpm_package")
 nfpm_package(
     name = "runtime-utils",
     config = ":runtime-utils.yaml",
-    data = [
+    exes = [
         "//cmd/ephs_client",
         "//cmd/metricbus_server",
-        "//cmd/metricbus_server:metric_collector_systemd_service",
         "//cmd/mtls_exporter",
-        "//cmd/mtls_exporter:mtls_exporter_systemd_service",
         "//cmd/mtls_supervisor",
         "//cmd/sd_health_exporter",
-        "//cmd/sd_health_exporter:sd_health_exporter_systemd_service",
         "//cmd/sd_publish",
         "//cmd/sd_register",
+        "//cmd/sd_watcher",
+        "//cmd/sqpkg_upload",
+    ],
+    data = [
+        "//cmd/metricbus_server:metric_collector_systemd_service",
+        "//cmd/mtls_exporter:mtls_exporter_systemd_service",
+        "//cmd/sd_health_exporter:sd_health_exporter_systemd_service",
         "//cmd/sd_register:sd_register@_systemd_service",
         "//cmd/sd_register:sd_register_systemd_service",
-        "//cmd/sd_watcher",
         "//metrics/metricbus:dbus_conf",
     ],
+    linux_arm64 = True,
 )
 
 nfpm_package(
     name = "apcupsd-exporter",
     config = ":apcupsd-exporter.yaml",
-    data = [
+    exes = [
         "//cmd/apcups_exporter",
+    ],
+    data = [
         "//cmd/apcups_exporter:apcupsd_exporter@_systemd_service",
         "//cmd/apcups_exporter:apcupsd_exporter_systemd_service",
     ],
@@ -34,17 +40,22 @@ nfpm_package(
 nfpm_package(
     name = "http-proxy",
     config = ":http-proxy.yaml",
-    data = [
+    exes = [
         "//cmd/http_proxy",
+    ],
+    data = [
         "//cmd/http_proxy:http_proxy@_systemd_service",
     ],
+    linux_arm64 = True,
 )
 
 nfpm_package(
     name = "ldap-health-exporter",
     config = ":ldap-health-exporter.yaml",
-    data = [
+    exes = [
         "//cmd/ldap_health_exporter",
+    ],
+    data = [
         "//cmd/ldap_health_exporter:ldap_health_exporter@_systemd_service",
     ],
 )
@@ -52,8 +63,10 @@ nfpm_package(
 nfpm_package(
     name = "prometheus-helpers",
     config = ":prometheus-helpers.yaml",
-    data = [
+    exes = [
         "//cmd/prometheus_http_discovery",
+    ],
+    data = [
         "//cmd/prometheus_http_discovery:prometheus_http_discovery_systemd_service",
     ],
 )
@@ -61,7 +74,7 @@ nfpm_package(
 nfpm_package(
     name = "coredns",
     config = ":coredns.yaml",
-    data = [
+    exes = [
         "//thirdparty/coredns",
     ],
 )
index b6b620c67a7a6eedc44ccfb223b09debf4e1a0a2..b7958fcfe17729d87c901cb74c9b5c6e4a3eea70 100644 (file)
@@ -1,6 +1,4 @@
 name: "${const:ExePrefix}apcupsd-exporter"
-arch: "amd64"
-platform: "linux"
 version: "${sub:${const:Version},+unset,}"
 section: "net"
 priority: "extra"
index 980c28e192f597d8c3441466efae627adc92f7cf..03b5f5872954712a42ae68d534ad89d080a916f4 100644 (file)
@@ -1,6 +1,4 @@
 name: "${const:ExePrefix}coredns"
-arch: "amd64"
-platform: "linux"
 version: "${sub:${const:Version},+unset,}"
 section: "net"
 priority: "extra"
index 3b83f6ff5adfed29990e5438ed15a88357749b3e..b8be4c4628d7b088a400932d45a614b5b9d10120 100644 (file)
@@ -1,6 +1,4 @@
 name: "${const:ExePrefix}http-proxy"
-arch: "amd64"
-platform: "linux"
 version: "${sub:${const:Version},+unset,}"
 section: "net"
 priority: "extra"
index e7013d24ed6197b57aa25cbbb4c5008c1f53503b..833924fa7a08405cac09b1d8990652917c336680 100644 (file)
@@ -1,6 +1,4 @@
 name: "${const:ExePrefix}ldap-health-exporter"
-arch: "amd64"
-platform: "linux"
 version: "${sub:${const:Version},+unset,}"
 section: "net"
 priority: "extra"
index 0f4aeb3e48050edacb9d9a537c85317109e9918a..543ec358697e7eb63ca542509f52338c639f6f94 100644 (file)
@@ -3,6 +3,7 @@ package main
 import (
        "flag"
        "fmt"
+       "io/fs"
        "os"
        "path"
        "regexp"
@@ -49,9 +50,16 @@ func (e executable) String() string {
        return string(e)
 }
 
-func (e executable) buildPath(bazelBinDir string) string {
+func (e executable) buildPath(bazelBinDir string, platform, arch string) string {
+       if platform == "linux" && arch == "amd64" {
+               return path.Join(
+                       bazelBinDir, "cmd", e.String(), e.String()+"_", e.String(),
+               )
+       }
+
        return path.Join(
-               bazelBinDir, "cmd", e.String(), e.String()+"_", e.String())
+               bazelBinDir, "cmd", e.String(), fmt.Sprintf("%s_%s_%s", e.String(), platform, arch),
+       )
 }
 
 func (e executable) pkgPath(vars subst.KV) string {
@@ -117,7 +125,8 @@ func (c *NfpmConfig) DiscoverBuildArtifacts() error {
                        if err != nil {
                                return fmt.Errorf(
                                        "failed reading runfile %q (abspath: %q): %v\nwd: %q",
-                                       entry.Source, newsrc, err, wd)
+                                       entry.Source, newsrc, err, wd,
+                               )
                        }
                        entry.Source = newsrc
                }
@@ -126,7 +135,7 @@ func (c *NfpmConfig) DiscoverBuildArtifacts() error {
        return nil
 }
 
-func (c *NfpmConfig) DiscoverBinaries(bazelBinDirs []string) error {
+func (c *NfpmConfig) DiscoverBinaries(bazelBinDirs []string, platform, arch string) error {
        wd, err := os.Getwd()
        if err != nil {
                return err
@@ -155,7 +164,8 @@ func (c *NfpmConfig) DiscoverBinaries(bazelBinDirs []string) error {
 
                var exePath string
                for _, bazelBinDir := range bazelBinDirs {
-                       checkPath := exe.buildPath(bazelBinDir)
+                       checkPath := exe.buildPath(bazelBinDir, platform, arch)
+                       debug("evaluating buildPath: %s", checkPath)
 
                        if _, ok := c.files[checkPath]; ok {
                                exePath = checkPath
@@ -170,7 +180,15 @@ func (c *NfpmConfig) DiscoverBinaries(bazelBinDirs []string) error {
 
                debug("evaluating exe with buildPath %s", exePath)
 
-               if derefPath, err := os.Readlink(exePath); err == nil {
+               for {
+                       if !isSymlink(exePath) {
+                               break
+                       }
+
+                       derefPath, err := os.Readlink(exePath)
+                       if err != nil {
+                               return fmt.Errorf("readlink(%q): %v", exePath, err)
+                       }
                        if path.IsAbs(derefPath) {
                                exePath = derefPath
                        } else {
@@ -179,9 +197,8 @@ func (c *NfpmConfig) DiscoverBinaries(bazelBinDirs []string) error {
                                        derefPath,
                                )
                        }
-
-                       debug("  -> dereferenced symlink to: %s", exePath)
                }
+               debug("  -> dereferenced symlink to: %s", exePath)
 
                st, err := os.Stat(exePath)
                if err != nil {
@@ -326,6 +343,14 @@ func (c *NfpmConfig) Generate() (string, error) {
        return string(out), nil
 }
 
+func isSymlink(fullPath string) bool {
+       if stat, err := os.Lstat(fullPath); err == nil {
+               return stat.Mode()&fs.ModeSymlink == fs.ModeSymlink
+       }
+
+       return false
+}
+
 func init() {
        flag.BoolVar(&verbose, "verbose", false, "enable debug logging")
 }
index 004614275a703eaed9f1fe069fc57a031d4da455..bf05a0b453d0762a35fafa6fc7a61c721209b77c 100644 (file)
@@ -14,6 +14,8 @@ import (
 func main() {
        yamlFile := flag.String("in", "", "path to yaml template to consume")
        outFile := flag.String("out", "", "output file to write; if omitted, uses stdout")
+       arch := flag.String("arch", "amd64", "architecture")
+       platform := flag.String("platform", "linux", "platform")
 
        var includes []string
        parseInclude := func(flagVal string) error {
@@ -44,6 +46,11 @@ func main() {
        if err != nil {
                panic(err)
        }
+       c.Platform = *platform
+       c.Arch = *arch
+       if *arch == "arm" {
+               c.Arch = "armv7h"
+       }
 
        wd, err := os.Getwd()
        if err != nil {
@@ -77,7 +84,7 @@ func main() {
                panic(err)
        }
 
-       if err := c.DiscoverBinaries(bazelBinDirs); err != nil {
+       if err := c.DiscoverBinaries(bazelBinDirs, *platform, *arch); err != nil {
                panic(err)
        }
 
index de239c7eee9e1b74ee8583e3d6889e3b5bb6e138..e64fc74977a9082df2431d6c1bdb343a23518a38 100644 (file)
@@ -1,6 +1,4 @@
 name: "${const:ExePrefix}prometheus-helpers"
-arch: "amd64"
-platform: "linux"
 version: "${sub:${const:Version},+unset,}"
 section: "net"
 priority: "extra"
index 85e11d6f65b9a77004dd7bfbaccf708fc068a945..69a4cbd795b101d5c6ff6d4043ef6ba53e76dbe6 100644 (file)
@@ -1,6 +1,4 @@
 name: "${const:ExePrefix}runtime-utils"
-arch: "amd64"
-platform: "linux"
 version: "${sub:${const:Version},+unset,}"
 section: "net"
 priority: "extra"