package main
import (
"context"
"dagger/guix-iso/internal/dagger"
)
const guixVersion = "1.5.0"
var platformFor = map[string]dagger.Platform{
"x86_64": "linux/amd64",
"aarch64": "linux/arm64",
}
const setupScript = `
set -euo pipefail
groupadd --system guixbuild
for i in $(seq -w 1 10); do
useradd -g guixbuild -G guixbuild -d /var/empty -s /bin/false \
-c "Guix build user $i" --system "guixbuilder$i"
done
GUIX=/var/guix/profiles/per-user/root/current-guix/bin/guix
"$GUIX" archive --authorize < /var/guix/profiles/per-user/root/current-guix/share/guix/bordeaux.guix.gnu.org.pub
"$GUIX" archive --authorize < /var/guix/profiles/per-user/root/current-guix/share/guix/ci.guix.gnu.org.pub
`
type GuixIso struct{}
func normalizeArch(arch string) string {
if arch == "" {
return "x86_64"
}
return arch
}
func setup(arch string) *dagger.Container {
tarball := "guix-binary-" + guixVersion + "." + arch + "-linux.tar.xz"
return dag.Container(dagger.ContainerOpts{Platform: platformFor[arch]}).
From("debian:bookworm-slim").
WithEnvVariable("DEBIAN_FRONTEND", "noninteractive").
WithExec([]string{"apt-get", "update"}).
WithExec([]string{"apt-get", "install", "-y", "--no-install-recommends",
"curl", "ca-certificates", "xz-utils", "gnupg", "passwd", "netbase", "git", "python3"}).
WithExec([]string{"curl", "-fsSL", "-o", "/tmp/" + tarball,
"https://ftp.gnu.org/gnu/guix/" + tarball}).
WithExec([]string{"tar", "-C", "/", "--warning=no-timestamp", "-xf", "/tmp/" + tarball}).
WithExec([]string{"bash", "-c", setupScript})
}
func buildContainer(arch string) *dagger.Container {
src := dag.CurrentModule().Source()
return setup(arch).
WithMountedDirectory("/workspace", src).
WithExec([]string{"bash", "/workspace/pull.sh"},
dagger.ContainerWithExecOpts{InsecureRootCapabilities: true}).
WithExec([]string{"bash", "/workspace/image.sh", arch},
dagger.ContainerWithExecOpts{InsecureRootCapabilities: true})
}
func (m *GuixIso) Build(
ctx context.Context,
arch string,
) *dagger.Directory {
arch = normalizeArch(arch)
return buildContainer(arch).Directory("/out")
}
func (m *GuixIso) Debug(
arch string,
) *dagger.Container {
return setup(normalizeArch(arch))
}