From 75a9f8d9a9d00e5c02acf9c017ee8163127d1ea5 Mon Sep 17 00:00:00 2001 From: Adphi Date: Wed, 21 Jan 2026 19:45:52 +0100 Subject: [PATCH] templates: improve docker build layers caching Signed-off-by: Adphi --- .github/workflows/ci.yaml | 7 +++++++ config_test.go | 30 ++++++++++++++++++++++++------ templates/centos.Dockerfile | 13 +++++++------ templates/debian.Dockerfile | 21 +++++++++++---------- 4 files changed, 49 insertions(+), 22 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a41d4bb..8cd440f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -61,6 +61,10 @@ jobs: - quay.io/centos/centos:stream steps: + - name: Free Disk Space (Ubuntu) + uses: linka-cloud/free-disk-space@main + if: matrix.image == 'quay.io/centos/centos:stream' + - name: Checkout uses: actions/checkout@v3 with: @@ -109,6 +113,9 @@ jobs: - centos:8 - quay.io/centos/centos:stream10 steps: + - name: Free Disk Space (Ubuntu) + uses: linka-cloud/free-disk-space@main + - name: Checkout uses: actions/checkout@v3 with: diff --git a/config_test.go b/config_test.go index 9b8f826..1940a33 100644 --- a/config_test.go +++ b/config_test.go @@ -24,12 +24,13 @@ import ( "github.com/google/uuid" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" + "go.uber.org/multierr" "go.linka.cloud/d2vm/pkg/docker" "go.linka.cloud/d2vm/pkg/exec" ) -func testConfig(t *testing.T, ctx context.Context, name, img string, config Config, luks, grubBIOS, grubEFI bool) { +func testConfig(t *testing.T, ctx context.Context, name, img string, config Config, luks, grubBIOS, grubEFI bool) func() error { require.NoError(t, docker.Pull(ctx, Arch, img)) tmpPath := filepath.Join(os.TempDir(), "d2vm-tests", strings.NewReplacer(":", "-", ".", "-").Replace(name)) require.NoError(t, os.MkdirAll(tmpPath, 0755)) @@ -37,7 +38,16 @@ func testConfig(t *testing.T, ctx context.Context, name, img string, config Conf logrus.Infof("inspecting image %s", img) r, err := FetchDockerImageOSRelease(ctx, img) require.NoError(t, err) - defer docker.Remove(ctx, img) + var fns []func() error + clean := func() (err error) { + for _, v := range fns { + err = multierr.Append(err, v()) + } + return err + } + fns = append(fns, func() error { + return docker.Remove(ctx, img) + }) if !r.SupportsLUKS() && luks { t.Skipf("LUKS not supported for %s", r.Version) } @@ -53,13 +63,16 @@ func testConfig(t *testing.T, ctx context.Context, name, img string, config Conf imgUUID := uuid.New().String() logrus.Infof("building kernel enabled image") require.NoError(t, docker.Build(ctx, false, imgUUID, p, dir, Arch)) - defer docker.Remove(ctx, imgUUID) + fns = append(fns, func() error { + return docker.Remove(ctx, imgUUID) + }) // we don't need to test the kernel location if grub is enabled if grubBIOS || grubEFI { - return + return clean } require.NoError(t, docker.RunAndRemove(ctx, imgUUID, "test", "-f", config.Kernel)) require.NoError(t, docker.RunAndRemove(ctx, imgUUID, "test", "-f", config.Initrd)) + return clean } func TestConfig(t *testing.T) { @@ -147,12 +160,17 @@ func TestConfig(t *testing.T) { } } name := strings.Join(n, "-") + var clean func() error t.Run(name, func(t *testing.T) { - t.Parallel() ctx, cancel := context.WithCancel(context.Background()) defer cancel() - testConfig(t, ctx, name, test.image, test.config, luks, grubBIOS, grubEFI) + clean = testConfig(t, ctx, name, test.image, test.config, luks, grubBIOS, grubEFI) }) + defer func() { + if clean != nil { + _ = clean() + } + }() } } } diff --git a/templates/centos.Dockerfile b/templates/centos.Dockerfile index 4dada8a..6ad9ca9 100644 --- a/templates/centos.Dockerfile +++ b/templates/centos.Dockerfile @@ -16,12 +16,6 @@ RUN yum install -y \ kernel \ systemd \ NetworkManager \ -{{- if .GrubBIOS }} - grub2 \ -{{- end }} -{{- if .GrubEFI }} - grub2 grub2-efi-x64 grub2-efi-x64-modules \ -{{- end }} e2fsprogs \ sudo && \ systemctl enable NetworkManager && \ @@ -29,6 +23,13 @@ RUN yum install -y \ systemctl unmask getty.target && \ find /boot -type l -exec rm {} \; +{{- if .GrubBIOS }} +RUN yum install -y grub2 +{{- end }} +{{- if .GrubEFI }} +RUN yum install -y grub2 grub2-efi-x64 grub2-efi-x64-modules +{{- end }} + {{ if .Luks }} RUN yum install -y cryptsetup && \ dracut --no-hostonly --regenerate-all --force --install="/usr/sbin/cryptsetup" diff --git a/templates/debian.Dockerfile b/templates/debian.Dockerfile index 3d1c23e..a97cf92 100644 --- a/templates/debian.Dockerfile +++ b/templates/debian.Dockerfile @@ -19,21 +19,22 @@ RUN ARCH="$([ "$(uname -m)" = "x86_64" ] && echo amd64 || echo arm64)"; \ DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ systemd-sysv \ systemd \ - {{- if .Grub }} - grub-common \ - grub2-common \ - {{- end }} - {{- if .GrubBIOS }} - grub-pc-bin \ - {{- end }} - {{- if .GrubEFI }} - grub-efi-${ARCH}-bin \ - {{- end }} dbus \ iproute2 \ isc-dhcp-client \ iputils-ping +{{- if .Grub }} +RUN DEBIAN_FRONTEND=noninteractive apt install -y grub-common grub2-common +{{- end }} +{{- if .GrubBIOS }} +RUN DEBIAN_FRONTEND=noninteractive apt install -y grub-pc-bin +{{- end }} +{{- if .GrubEFI }} +RUN ARCH="$([ "$(uname -m)" = "x86_64" ] && echo amd64 || echo arm64)"; \ + DEBIAN_FRONTEND=noninteractive apt install -y grub-efi-${ARCH}-bin +{{- end }} + RUN systemctl preset-all {{ if .Password }}RUN echo "root:{{ .Password }}" | chpasswd {{ end }}