Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand Down
30 changes: 24 additions & 6 deletions config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,30 @@ 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))
defer os.RemoveAll(tmpPath)
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)
}
Expand All @@ -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) {
Expand Down Expand Up @@ -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()
}
}()
}
}
}
Expand Down
6 changes: 5 additions & 1 deletion templates/alpine.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM {{ .Image }}
FROM {{ .Image }} AS rootfs

USER root

Expand Down Expand Up @@ -48,3 +48,7 @@ RUN apk add --no-cache \
{{- end }}
grub || true
{{- end }}

FROM scratch

COPY --from=rootfs / /
19 changes: 12 additions & 7 deletions templates/centos.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM {{ .Image }}
FROM {{ .Image }} AS rootfs

USER root

Expand All @@ -16,19 +16,20 @@ 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 && \
systemctl unmask systemd-remount-fs.service && \
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"
Expand All @@ -46,3 +47,7 @@ RUN cd /boot && \

RUN yum clean all && \
rm -rf /var/cache/yum

FROM scratch

COPY --from=rootfs / /
27 changes: 16 additions & 11 deletions templates/debian.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM {{ .Image }}
FROM {{ .Image }} AS rootfs

USER root

Expand All @@ -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 }}
Expand Down Expand Up @@ -77,3 +78,7 @@ RUN mv $(ls -t /boot/vmlinuz-* | head -n 1) /boot/vmlinuz && \

RUN apt-get clean && \
rm -rf /var/lib/apt/lists/*

FROM scratch

COPY --from=rootfs / /
25 changes: 15 additions & 10 deletions templates/ubuntu.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM {{ .Image }}
FROM {{ .Image }} AS rootfs

USER root

Expand All @@ -9,21 +9,22 @@ RUN ARCH="$([ "$(uname -m)" = "x86_64" ] && echo amd64 || echo arm64)"; \
initramfs-tools \
systemd-sysv \
systemd \
dbus \
isc-dhcp-client \
iproute2 \
iputils-ping && \
find /boot -type l -exec rm {} \;

{{- if .Grub }}
grub-common \
grub2-common \
RUN DEBIAN_FRONTEND=noninteractive apt install -y grub-common grub2-common
{{- end }}
{{- if .GrubBIOS }}
grub-pc-bin \
RUN DEBIAN_FRONTEND=noninteractive apt install -y grub-pc-bin
{{- end }}
{{- if .GrubEFI }}
grub-efi-${ARCH}-bin \
RUN ARCH="$([ "$(uname -m)" = "x86_64" ] && echo amd64 || echo arm64)"; \
DEBIAN_FRONTEND=noninteractive apt install -y grub-efi-${ARCH}-bin
{{- end }}
dbus \
isc-dhcp-client \
iproute2 \
iputils-ping && \
find /boot -type l -exec rm {} \;

{{ if gt .Release.VersionID "16.04" }}
RUN systemctl preset-all
Expand Down Expand Up @@ -68,3 +69,7 @@ RUN mv $(ls -t /boot/vmlinuz-* | head -n 1) /boot/vmlinuz && \

RUN apt-get clean && \
rm -rf /var/lib/apt/lists/*

FROM scratch

COPY --from=rootfs / /
Loading