2022-07-07 23:56:51 +00:00
VERSION 0.6
FROM alpine
2022-08-12 13:49:41 +00:00
ARG VARIANT=core # core, lite, framework
2023-01-25 09:15:24 +00:00
ARG FLAVOR=opensuse-leap
2022-09-17 16:43:51 +00:00
ARG IMAGE=quay.io/kairos/${VARIANT}-${FLAVOR}:latest
ARG ISO_NAME=kairos-${VARIANT}-${FLAVOR}
2023-02-08 08:57:19 +00:00
# renovate: datasource=docker depName=quay.io/luet/base
2023-02-03 17:40:41 +00:00
ARG LUET_VERSION=0.34.0
2022-09-17 16:43:51 +00:00
ARG OS_ID=kairos
2022-11-21 08:48:23 +00:00
ARG REPOSITORIES_FILE=framework-profile.yaml
2023-03-10 09:21:32 +00:00
# renovate: datasource=docker depName=aquasec/trivy
2023-03-14 12:19:17 +00:00
ARG TRIVY_VERSION=0.38.3
2022-09-17 16:43:51 +00:00
ARG COSIGN_SKIP=".*quay.io/kairos/.*"
2022-07-07 23:56:51 +00:00
2022-09-21 01:16:24 +00:00
IF [ "$FLAVOR" = "ubuntu" ]
ARG COSIGN_REPOSITORY=raccos/releases-orange
ELSE
ARG COSIGN_REPOSITORY=raccos/releases-teal
END
2022-07-07 23:56:51 +00:00
ARG COSIGN_EXPERIMENTAL=0
ARG CGO_ENABLED=0
2023-02-09 08:37:31 +00:00
# renovate: datasource=docker depName=quay.io/kairos/osbuilder-tools versioning=semver-coerced
2023-03-14 09:40:10 +00:00
ARG OSBUILDER_VERSION=v0.5.3
2023-02-09 08:37:31 +00:00
ARG OSBUILDER_IMAGE=quay.io/kairos/osbuilder-tools:$OSBUILDER_VERSION
2022-08-08 08:27:41 +00:00
ARG GOLINT_VERSION=1.47.3
2023-02-08 08:57:19 +00:00
# renovate: datasource=docker depName=golang
2022-08-08 08:31:00 +00:00
ARG GO_VERSION=1.18
2023-02-08 08:57:19 +00:00
# renovate: datasource=docker depName=hadolint/hadolint versioning=docker
ARG HADOLINT_VERSION=2.12.0-alpine
2023-02-10 08:35:43 +00:00
# renovate: datasource=docker depName=renovate/renovate versioning=docker
2023-03-14 09:39:28 +00:00
ARG RENOVATE_VERSION=35
2023-02-23 12:36:49 +00:00
# renovate: datasource=docker depName=koalaman/shellcheck-alpine versioning=docker
ARG SHELLCHECK_VERSION=v0.9.0
2022-07-14 18:05:58 +00:00
2023-02-28 16:58:17 +00:00
ARG IMAGE_REPOSITORY_ORG=quay.io/kairos
2022-07-14 18:05:58 +00:00
all:
2023-03-10 17:11:48 +00:00
BUILD +image
2023-03-02 08:43:30 +00:00
BUILD +image-sbom
2023-03-02 17:37:00 +00:00
BUILD +trivy-scan
2023-03-08 08:13:08 +00:00
BUILD +grype-scan
2022-07-14 18:05:58 +00:00
BUILD +iso
BUILD +netboot
BUILD +ipxe-iso
all-arm:
2023-03-10 17:11:48 +00:00
BUILD --platform=linux/arm64 +image
2023-03-02 08:43:30 +00:00
BUILD +image-sbom
2023-03-02 17:37:00 +00:00
BUILD +trivy-scan
2023-03-08 08:13:08 +00:00
BUILD +grype-scan
2022-07-14 18:05:58 +00:00
BUILD +arm-image
2022-07-07 23:56:51 +00:00
go-deps:
2022-08-08 08:31:00 +00:00
ARG GO_VERSION
FROM golang:$GO_VERSION
2022-07-07 23:56:51 +00:00
WORKDIR /build
COPY go.mod go.sum ./
RUN go mod download
RUN apt-get update && apt-get install -y upx
SAVE ARTIFACT go.mod AS LOCAL go.mod
SAVE ARTIFACT go.sum AS LOCAL go.sum
2023-02-03 10:04:02 +00:00
test:
2023-03-17 15:45:43 +00:00
FROM +go-deps
2023-02-03 10:04:02 +00:00
WORKDIR /build
2022-09-29 22:06:25 +00:00
COPY +luet/luet /usr/bin/luet
2022-07-16 13:19:23 +00:00
COPY . .
2023-03-17 15:45:43 +00:00
RUN go run github.com/onsi/ginkgo/v2/ginkgo --fail-fast --slow-spec-threshold 30s --covermode=atomic --coverprofile=coverage.out -p -r ./pkg ./internal ./cmd ./sdk
2022-07-16 13:19:23 +00:00
SAVE ARTIFACT coverage.out AS LOCAL coverage.out
2022-08-08 10:40:55 +00:00
OSRELEASE:
COMMAND
ARG OS_ID
ARG OS_NAME
ARG OS_REPO
ARG OS_VERSION
ARG OS_LABEL
2022-08-17 08:02:18 +00:00
ARG VARIANT
ARG FLAVOR
2022-08-18 07:09:52 +00:00
ARG GITHUB_REPO
ARG BUG_REPORT_URL
ARG HOME_URL
2022-08-18 08:43:00 +00:00
2022-08-08 10:40:55 +00:00
# update OS-release file
2022-08-08 17:45:24 +00:00
RUN envsubst >/etc/os-release </usr/lib/os-release.tmpl
2022-08-08 10:40:55 +00:00
2022-07-09 18:13:25 +00:00
BUILD_GOLANG:
COMMAND
2022-07-07 23:56:51 +00:00
WORKDIR /build
COPY . ./
ARG CGO_ENABLED
2022-07-09 18:13:25 +00:00
ARG BIN
ARG SRC
2023-02-28 16:58:17 +00:00
2022-07-07 23:56:51 +00:00
ENV CGO_ENABLED=${CGO_ENABLED}
2023-01-16 18:24:11 +00:00
ARG LDFLAGS="-s -w -X 'github.com/kairos-io/kairos/internal/common.VERSION=$VERSION'"
RUN echo "Building ${BIN} from ${SRC} using ${VERSION}"
RUN echo ${LDFLAGS}
RUN go build -o ${BIN} -ldflags "${LDFLAGS}" ./cmd/${SRC} && upx ${BIN}
2022-07-09 18:13:25 +00:00
SAVE ARTIFACT ${BIN} ${BIN} AS LOCAL build/${BIN}
2022-10-02 22:16:01 +00:00
uuidgen:
FROM alpine
RUN apk add uuidgen
COPY . ./
RUN echo $(uuidgen) > UUIDGEN
SAVE ARTIFACT UUIDGEN UUIDGEN
2022-08-12 13:49:41 +00:00
version:
FROM alpine
RUN apk add git
COPY . ./
2023-01-16 18:24:11 +00:00
RUN --no-cache echo $(git describe --always --tags --dirty) > VERSION
2022-08-12 13:49:41 +00:00
2023-01-16 18:24:11 +00:00
ARG VERSION=$(cat VERSION)
2022-08-12 13:49:41 +00:00
SAVE ARTIFACT VERSION VERSION
2022-07-09 18:13:25 +00:00
2023-01-16 18:24:11 +00:00
2022-09-17 16:43:51 +00:00
build-kairos-agent:
2022-07-09 18:13:25 +00:00
FROM +go-deps
2023-01-10 13:21:15 +00:00
COPY +webui-deps/node_modules ./internal/webui/public/node_modules
2023-01-28 20:44:24 +00:00
COPY +docs/public/local ./internal/webui/public/local
2022-09-17 16:43:51 +00:00
DO +BUILD_GOLANG --BIN=kairos-agent --SRC=agent --CGO_ENABLED=$CGO_ENABLED
2022-07-09 18:13:25 +00:00
build:
2022-09-17 16:43:51 +00:00
BUILD +build-kairos-agent
2022-07-07 23:56:51 +00:00
2022-07-16 14:28:22 +00:00
dist:
2022-08-08 08:31:00 +00:00
ARG GO_VERSION
FROM golang:$GO_VERSION
2022-09-29 22:06:25 +00:00
COPY +luet/luet /usr/bin/luet
RUN mkdir -p /etc/luet/repos.conf.d/
RUN luet repo add kairos --yes --url quay.io/kairos/packages --type docker
2022-08-17 08:40:24 +00:00
RUN luet install -y utils/goreleaser
2022-07-16 14:28:22 +00:00
WORKDIR /build
COPY . .
RUN goreleaser build --rm-dist --skip-validate --snapshot
SAVE ARTIFACT /build/dist/* AS LOCAL dist/
2023-02-05 17:10:51 +00:00
golint:
2022-08-08 08:31:00 +00:00
ARG GO_VERSION
FROM golang:$GO_VERSION
2022-08-08 08:27:41 +00:00
ARG GOLINT_VERSION
RUN wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s v$GOLINT_VERSION
2022-07-16 14:28:22 +00:00
WORKDIR /build
COPY . .
RUN golangci-lint run
2023-02-05 17:10:51 +00:00
hadolint:
ARG HADOLINT_VERSION
2023-02-08 08:57:19 +00:00
FROM hadolint/hadolint:$HADOLINT_VERSION
2023-02-05 17:10:51 +00:00
WORKDIR /images
COPY images .
RUN ls
RUN find . -name "Dockerfile*" -print | xargs -r -n1 hadolint
2023-02-08 23:55:09 +00:00
renovate-validate:
ARG RENOVATE_VERSION
FROM renovate/renovate:$RENOVATE_VERSION
WORKDIR /usr/src/app
COPY renovate.json .
RUN renovate-config-validator
2023-02-23 12:36:49 +00:00
shellcheck-lint:
ARG SHELLCHECK_VERSION
FROM koalaman/shellcheck-alpine:$SHELLCHECK_VERSION
WORKDIR /mnt
COPY . .
RUN find . -name "*.sh" -print | xargs -r -n1 shellcheck
yamllint:
FROM cytopia/yamllint
COPY . .
RUN yamllint .github/workflows/ overlay/
2023-02-05 17:10:51 +00:00
lint:
BUILD +golint
BUILD +hadolint
2023-02-08 23:55:09 +00:00
BUILD +renovate-validate
2023-02-23 12:36:49 +00:00
BUILD +shellcheck-lint
2023-02-17 13:17:07 +00:00
BUILD +yamllint
2023-02-05 17:10:51 +00:00
2023-03-02 08:43:30 +00:00
syft:
FROM anchore/syft:latest
SAVE ARTIFACT /syft syft
image-sbom:
2023-03-10 17:11:48 +00:00
# Use base-image so it can read original os-release file
FROM +base-image
2023-03-02 08:43:30 +00:00
WORKDIR /build
COPY +version/VERSION ./
ARG VERSION=$(cat VERSION)
ARG FLAVOR
2023-03-02 15:47:52 +00:00
ARG VARIANT
2023-03-02 08:43:30 +00:00
COPY +syft/syft /usr/bin/syft
RUN syft / -o json=sbom.syft.json -o spdx-json=sbom.spdx.json
2023-03-02 15:47:52 +00:00
SAVE ARTIFACT /build/sbom.syft.json sbom.syft.json AS LOCAL build/${VARIANT}-${FLAVOR}-${VERSION}-sbom.syft.json
SAVE ARTIFACT /build/sbom.spdx.json sbom.spdx.json AS LOCAL build/${VARIANT}-${FLAVOR}-${VERSION}-sbom.spdx.json
2023-03-02 08:43:30 +00:00
2022-07-07 23:56:51 +00:00
luet:
FROM quay.io/luet/base:$LUET_VERSION
SAVE ARTIFACT /usr/bin/luet /luet
2022-10-02 22:16:01 +00:00
###
### Image Build targets
###
2022-07-07 23:56:51 +00:00
framework:
ARG COSIGN_SKIP
ARG REPOSITORIES_FILE
ARG COSIGN_EXPERIMENTAL
ARG COSIGN_REPOSITORY
2023-02-28 16:58:17 +00:00
ARG FLAVOR
ARG VERSION
2023-01-16 18:24:11 +00:00
ARG LDFLAGS="-s -w -X 'github.com/kairos-io/kairos/internal/common.VERSION=$VERSION'"
2022-07-07 23:56:51 +00:00
2022-11-21 08:48:23 +00:00
FROM golang:alpine
WORKDIR /build
2022-07-07 23:56:51 +00:00
COPY +luet/luet /usr/bin/luet
# cosign keyless verify
ENV COSIGN_EXPERIMENTAL=${COSIGN_EXPERIMENTAL}
# Repo containing signatures
ENV COSIGN_REPOSITORY=${COSIGN_REPOSITORY}
# Skip this repo artifacts verify as they are not signed
ENV COSIGN_SKIP=${COSIGN_SKIP}
ENV USER=root
2022-11-21 08:48:23 +00:00
COPY . /build
2023-01-16 18:24:11 +00:00
RUN go run -ldflags "${LDFLAGS}" ./cmd/profile-build/main.go ${FLAVOR} $REPOSITORIES_FILE /framework
2022-07-14 18:05:58 +00:00
2023-02-21 15:52:09 +00:00
# Copy kairos binaries
COPY +build-kairos-agent/kairos-agent /framework/usr/bin/kairos-agent
2022-10-01 20:20:52 +00:00
COPY +luet/luet /framework/usr/bin/luet
2022-09-22 12:59:01 +00:00
2022-10-01 20:20:52 +00:00
RUN luet cleanup --system-target /framework
2023-02-28 16:58:17 +00:00
# Copy overlay files
2022-07-07 23:56:51 +00:00
COPY overlay/files /framework
2023-02-28 16:58:17 +00:00
# Copy flavor-specific overlay files
IF [ "$FLAVOR" = "alpine-opensuse-leap" ] || [ "$FLAVOR" = "alpine-ubuntu" ]
COPY overlay/files-alpine/ /framework
END
IF [ "$FLAVOR" = "alpine-arm-rpi" ]
COPY overlay/files-alpine/ /framework
COPY overlay/files-opensuse-arm-rpi/ /framework
ELSE IF [ "$FLAVOR" = "opensuse-leap-arm-rpi" ] || [ "$FLAVOR" = "opensuse-tumbleweed-arm-rpi" ]
COPY overlay/files-opensuse-arm-rpi/ /framework
ELSE IF [ "$FLAVOR" = "fedora" ] || [ "$FLAVOR" = "rockylinux" ]
COPY overlay/files-fedora/ /framework
ELSE IF [ "$FLAVOR" = "debian" ] || [ "$FLAVOR" = "ubuntu" ] || [ "$FLAVOR" = "ubuntu-20-lts" ] || [ "$FLAVOR" = "ubuntu-22-lts" ]
COPY overlay/files-ubuntu/ /framework
END
2022-07-14 18:05:58 +00:00
RUN rm -rf /framework/var/luet
RUN rm -rf /framework/var/cache
2023-02-03 10:34:56 +00:00
SAVE ARTIFACT --keep-own /framework/ framework
2022-07-07 23:56:51 +00:00
2023-02-28 16:58:17 +00:00
build-framework-image:
COPY +version/VERSION ./
ARG VERSION=$(cat VERSION)
ARG FLAVOR
BUILD +framework-image --VERSION=$VERSION --FLAVOR=$FLAVOR
2022-07-14 18:05:58 +00:00
framework-image:
FROM scratch
2023-02-28 16:58:17 +00:00
ARG VERSION
2022-07-14 18:05:58 +00:00
ARG IMG
2022-08-30 09:15:39 +00:00
ARG FLAVOR
2023-02-28 16:58:17 +00:00
COPY (+framework/framework --VERSION=$VERSION --FLAVOR=$FLAVOR) /
SAVE IMAGE --push $IMAGE_REPOSITORY_ORG/framework:${VERSION}_${FLAVOR}
2022-07-14 18:05:58 +00:00
2023-03-10 17:11:48 +00:00
base-image:
2022-08-08 10:40:55 +00:00
ARG FLAVOR
2022-08-12 13:49:41 +00:00
ARG VARIANT
2022-07-13 22:23:47 +00:00
IF [ "$BASE_IMAGE" = "" ]
# Source the flavor-provided docker file
FROM DOCKERFILE -f images/Dockerfile.$FLAVOR .
ELSE
FROM $BASE_IMAGE
END
2022-08-08 10:40:55 +00:00
2022-09-17 16:43:51 +00:00
ARG KAIROS_VERSION
IF [ "$KAIROS_VERSION" = "" ]
2022-08-12 13:49:41 +00:00
COPY +version/VERSION ./
ARG VERSION=$(cat VERSION)
RUN echo "version ${VERSION}"
2022-08-17 08:02:18 +00:00
ARG OS_VERSION=${VERSION}
2022-08-12 13:49:41 +00:00
RUN rm VERSION
ELSE
2022-09-17 16:43:51 +00:00
ARG OS_VERSION=${KAIROS_VERSION}
2022-07-13 22:23:47 +00:00
END
2022-08-08 10:40:55 +00:00
2022-07-09 18:13:25 +00:00
# Includes overlay/files
2023-02-28 16:58:17 +00:00
COPY (+framework/framework --FLAVOR=$FLAVOR --VERSION=$OS_VERSION) /
2022-07-07 23:56:51 +00:00
2022-08-14 16:52:38 +00:00
RUN rm -rf /etc/machine-id && touch /etc/machine-id && chmod 444 /etc/machine-id
2023-03-03 12:57:43 +00:00
# Avoid to accidentally push keys generated by package managers
RUN rm -rf /etc/ssh/ssh_host_*
2022-07-07 23:56:51 +00:00
2022-11-14 17:35:27 +00:00
# Enable services
IF [ -f /sbin/openrc ]
RUN mkdir -p /etc/runlevels/default && \
ln -sf /etc/init.d/cos-setup-boot /etc/runlevels/default/cos-setup-boot && \
ln -sf /etc/init.d/cos-setup-network /etc/runlevels/default/cos-setup-network && \
ln -sf /etc/init.d/cos-setup-reconcile /etc/runlevels/default/cos-setup-reconcile && \
ln -sf /etc/init.d/kairos-agent /etc/runlevels/default/kairos-agent
# Otherwise we assume systemd
ELSE
2023-02-28 23:02:10 +00:00
RUN ls -liah /etc/systemd/system
RUN systemctl enable cos-setup-reconcile.timer && \
systemctl enable cos-setup-fs.service && \
systemctl enable cos-setup-boot.service && \
systemctl enable cos-setup-network.service
2022-11-14 17:35:27 +00:00
END
2022-07-09 18:13:25 +00:00
2023-03-02 14:46:15 +00:00
# TEST IMMUCORE FROM BRANCH
ARG IMMUCORE_DEV
ARG IMMUCORE_DEV_BRANCH=master
IF [ "$IMMUCORE_DEV" = "true" ]
2023-03-09 17:57:00 +00:00
RUN rm -Rf /usr/lib/dracut/modules.d/28immucore
RUN rm /etc/dracut.conf.d/10-immucore.conf
RUN rm /etc/dracut.conf.d/02-kairos-setup-initramfs.conf || exit 0
RUN rm /etc/dracut.conf.d/50-kairos-initrd.conf || exit 0
2023-03-02 14:46:15 +00:00
COPY github.com/kairos-io/immucore:$IMMUCORE_DEV_BRANCH+build-immucore/immucore /usr/bin/immucore
2023-03-09 17:57:00 +00:00
COPY github.com/kairos-io/immucore:$IMMUCORE_DEV_BRANCH+dracut-artifacts/28immucore /usr/lib/dracut/modules.d/28immucore
2023-03-02 14:46:15 +00:00
COPY github.com/kairos-io/immucore:$IMMUCORE_DEV_BRANCH+dracut-artifacts/10-immucore.conf /etc/dracut.conf.d/10-immucore.conf
END
# END
2022-12-16 07:47:43 +00:00
IF [ "$FLAVOR" = "debian" ]
RUN rm -rf /boot/initrd.img-*
END
2022-07-09 18:13:25 +00:00
# Regenerate initrd if necessary
2023-01-30 21:11:48 +00:00
IF [ "$FLAVOR" = "opensuse-leap" ] || [ "$FLAVOR" = "opensuse-leap-arm-rpi" ] || [ "$FLAVOR" = "opensuse-tumbleweed-arm-rpi" ] || [ "$FLAVOR" = "opensuse-tumbleweed" ]
2022-07-07 23:56:51 +00:00
RUN mkinitrd
2022-10-05 19:45:09 +00:00
ELSE IF [ "$FLAVOR" = "fedora" ] || [ "$FLAVOR" = "rockylinux" ]
RUN kernel=$(ls /boot/vmlinuz-* | head -n1) && \
ln -sf "${kernel#/boot/}" /boot/vmlinuz
RUN kernel=$(ls /lib/modules | head -n1) && \
dracut -v -N -f "/boot/initrd-${kernel}" "${kernel}" && \
ln -sf "initrd-${kernel}" /boot/initrd
RUN kernel=$(ls /lib/modules | head -n1) && depmod -a "${kernel}"
# https://github.com/kairos-io/elemental-cli/blob/23ca64435fedb9f521c95e798d2c98d2714c53bd/pkg/elemental/elemental.go#L553
RUN rm -rf /boot/initramfs-*
2022-12-16 07:47:43 +00:00
ELSE IF [ "$FLAVOR" = "debian" ] || [ "$FLAVOR" = "ubuntu" ] || [ "$FLAVOR" = "ubuntu-20-lts" ] || [ "$FLAVOR" = "ubuntu-22-lts" ]
2022-07-07 23:56:51 +00:00
RUN kernel=$(ls /boot/vmlinuz-* | head -n1) && \
ln -sf "${kernel#/boot/}" /boot/vmlinuz
RUN kernel=$(ls /lib/modules | head -n1) && \
dracut -f "/boot/initrd-${kernel}" "${kernel}" && \
ln -sf "initrd-${kernel}" /boot/initrd
RUN kernel=$(ls /lib/modules | head -n1) && depmod -a "${kernel}"
END
2022-10-10 21:04:37 +00:00
IF [ ! -e "/boot/vmlinuz" ]
# If it's an ARM flavor, we want a symlink here from zImage/Image
IF [ -e "/boot/Image" ]
RUN ln -sf Image /boot/vmlinuz
ELSE IF [ -e "/boot/zImage" ]
RUN ln -sf zImage /boot/vmlinuz
ELSE
RUN kernel=$(ls /lib/modules | head -n1) && \
ln -sf "${kernel#/boot/}" /boot/vmlinuz
END
2022-07-07 23:56:51 +00:00
END
2023-03-10 13:28:14 +00:00
RUN rm -rf /tmp/*
2023-03-10 17:11:48 +00:00
image:
FROM +base-image
ARG FLAVOR
ARG VARIANT
ARG KAIROS_VERSION
IF [ "$KAIROS_VERSION" = "" ]
COPY +version/VERSION ./
ARG VERSION=$(cat VERSION)
RUN echo "version ${VERSION}"
ARG OS_VERSION=${VERSION}
RUN rm VERSION
ELSE
ARG OS_VERSION=${KAIROS_VERSION}
END
ARG OS_ID
ARG OS_NAME=${OS_ID}-${VARIANT}-${FLAVOR}
ARG OS_REPO=quay.io/kairos/${VARIANT}-${FLAVOR}
ARG OS_LABEL=latest
DO +OSRELEASE --HOME_URL=https://github.com/kairos-io/kairos --BUG_REPORT_URL=https://github.com/kairos-io/kairos/issues --GITHUB_REPO=kairos-io/kairos --VARIANT=${VARIANT} --FLAVOR=${FLAVOR} --OS_ID=${OS_ID} --OS_LABEL=${OS_LABEL} --OS_NAME=${OS_NAME} --OS_REPO=${OS_REPO} --OS_VERSION=${OS_VERSION}
2022-07-07 23:56:51 +00:00
SAVE IMAGE $IMAGE
2023-03-10 17:11:48 +00:00
image-rootfs:
FROM +image
2023-02-03 10:34:56 +00:00
SAVE ARTIFACT --keep-own /. rootfs
2022-07-07 23:56:51 +00:00
2022-10-02 22:16:01 +00:00
###
### Artifacts targets (ISO, netboot, ARM)
###
2022-07-07 23:56:51 +00:00
iso:
2022-09-22 12:59:01 +00:00
ARG OSBUILDER_IMAGE
2022-07-07 23:56:51 +00:00
ARG ISO_NAME=${OS_ID}
ARG IMG=docker:$IMAGE
ARG overlay=overlay/files-iso
2022-09-22 12:59:01 +00:00
FROM $OSBUILDER_IMAGE
2022-07-07 23:56:51 +00:00
WORKDIR /build
COPY . ./
2023-03-10 17:11:48 +00:00
COPY --keep-own +image-rootfs/rootfs /build/image
2023-02-03 10:03:20 +00:00
RUN /entrypoint.sh --name $ISO_NAME --debug build-iso --squash-no-compression --date=false dir:/build/image --overlay-iso /build/${overlay} --output /build/
2022-09-17 16:43:51 +00:00
SAVE ARTIFACT /build/$ISO_NAME.iso kairos.iso AS LOCAL build/$ISO_NAME.iso
SAVE ARTIFACT /build/$ISO_NAME.iso.sha256 kairos.iso.sha256 AS LOCAL build/$ISO_NAME.iso.sha256
2022-07-07 23:56:51 +00:00
netboot:
2022-10-16 16:43:52 +00:00
ARG OSBUILDER_IMAGE
FROM $OSBUILDER_IMAGE
2022-11-30 13:50:09 +00:00
COPY +version/VERSION ./
ARG VERSION=$(cat VERSION)
RUN echo "version ${VERSION}"
2022-07-07 23:56:51 +00:00
ARG ISO_NAME=${OS_ID}
2022-11-24 22:57:07 +00:00
ARG FROM_ARTIFACT
2022-07-07 23:56:51 +00:00
WORKDIR /build
2022-12-03 10:30:15 +00:00
ARG RELEASE_URL
2022-11-24 22:57:07 +00:00
2022-07-07 23:56:51 +00:00
COPY . .
2022-11-24 22:57:07 +00:00
IF [ "$FROM_ARTIFACT" = "" ]
2022-11-30 13:50:09 +00:00
COPY +iso/kairos.iso kairos.iso
2022-11-24 22:57:07 +00:00
RUN /build/scripts/netboot.sh kairos.iso $ISO_NAME $VERSION
ELSE
RUN /build/scripts/netboot.sh $FROM_ARTIFACT $ISO_NAME $VERSION
END
2022-07-07 23:56:51 +00:00
SAVE ARTIFACT /build/$ISO_NAME.squashfs squashfs AS LOCAL build/$ISO_NAME.squashfs
SAVE ARTIFACT /build/$ISO_NAME-kernel kernel AS LOCAL build/$ISO_NAME-kernel
SAVE ARTIFACT /build/$ISO_NAME-initrd initrd AS LOCAL build/$ISO_NAME-initrd
SAVE ARTIFACT /build/$ISO_NAME.ipxe ipxe AS LOCAL build/$ISO_NAME.ipxe
arm-image:
2022-10-15 14:19:51 +00:00
ARG OSBUILDER_IMAGE
FROM $OSBUILDER_IMAGE
2022-07-07 23:56:51 +00:00
ARG MODEL=rpi64
ARG IMAGE_NAME=${FLAVOR}.img
WORKDIR /build
ENV STATE_SIZE="6200"
ENV RECOVERY_SIZE="4200"
ENV SIZE="15200"
ENV DEFAULT_ACTIVE_SIZE="2000"
2023-03-10 17:11:48 +00:00
COPY --platform=linux/arm64 +image-rootfs/rootfs /build/image
2022-07-07 23:56:51 +00:00
# With docker is required for loop devices
WITH DOCKER --allow-privileged
2022-10-15 14:19:51 +00:00
RUN /build-arm-image.sh --model $MODEL --directory "/build/image" /build/$IMAGE_NAME
2022-07-07 23:56:51 +00:00
END
2022-10-15 14:19:51 +00:00
RUN xz -v /build/$IMAGE_NAME
SAVE ARTIFACT /build/$IMAGE_NAME.xz img AS LOCAL build/$IMAGE_NAME.xz
SAVE ARTIFACT /build/$IMAGE_NAME.sha256 img-sha256 AS LOCAL build/$IMAGE_NAME.sha256
2022-07-09 22:38:33 +00:00
ipxe-iso:
FROM ubuntu
ARG ipxe_script
RUN apt update
RUN apt install -y -o Acquire::Retries=50 \
mtools syslinux isolinux gcc-arm-none-eabi git make gcc liblzma-dev mkisofs xorriso
# jq docker
WORKDIR /build
2022-11-23 15:52:54 +00:00
ARG ISO_NAME=${OS_ID}
COPY +version/VERSION ./
ARG VERSION=$(cat VERSION)
2022-12-03 10:30:15 +00:00
ARG RELEASE_URL
2022-11-30 13:50:09 +00:00
RUN echo "version ${VERSION}"
2022-11-23 15:52:54 +00:00
2022-07-09 22:38:33 +00:00
RUN git clone https://github.com/ipxe/ipxe
IF [ "$ipxe_script" = "" ]
2022-12-03 10:30:15 +00:00
COPY (+netboot/ipxe --VERSION=$VERSION --RELEASE_URL=$RELEASE_URL) /build/ipxe/script.ipxe
2022-07-09 22:38:33 +00:00
ELSE
COPY $ipxe_script /build/ipxe/script.ipxe
END
2022-11-23 15:52:54 +00:00
RUN cd ipxe/src && \
sed -i 's/#undef\tDOWNLOAD_PROTO_HTTPS/#define\tDOWNLOAD_PROTO_HTTPS/' config/general.h && \
make EMBED=/build/ipxe/script.ipxe
2022-07-09 22:38:33 +00:00
SAVE ARTIFACT /build/ipxe/src/bin/ipxe.iso iso AS LOCAL build/${ISO_NAME}-ipxe.iso.ipxe
SAVE ARTIFACT /build/ipxe/src/bin/ipxe.usb usb AS LOCAL build/${ISO_NAME}-ipxe-usb.img.ipxe
2022-07-07 23:56:51 +00:00
2022-10-02 22:16:01 +00:00
# Generic targets
# usage e.g. ./earthly.sh +datasource-iso --CLOUD_CONFIG=tests/assets/qrcode.yaml
datasource-iso:
2022-10-15 14:19:51 +00:00
ARG OSBUILDER_IMAGE
2022-10-02 22:16:01 +00:00
ARG CLOUD_CONFIG
2022-10-15 14:19:51 +00:00
FROM $OSBUILDER_IMAGE
2022-10-02 22:16:01 +00:00
WORKDIR /build
RUN touch meta-data
COPY ${CLOUD_CONFIG} user-data
RUN cat user-data
RUN mkisofs -output ci.iso -volid cidata -joliet -rock user-data meta-data
SAVE ARTIFACT /build/ci.iso iso.iso AS LOCAL build/datasource.iso
2022-07-07 23:56:51 +00:00
2022-10-02 22:16:01 +00:00
###
### Security target scan
###
2022-07-14 18:05:58 +00:00
trivy:
2023-03-10 09:21:32 +00:00
ARG TRIVY_VERSION
FROM aquasec/trivy:$TRIVY_VERSION
2023-03-02 17:37:00 +00:00
SAVE ARTIFACT /contrib contrib
2022-07-14 18:05:58 +00:00
SAVE ARTIFACT /usr/local/bin/trivy /trivy
trivy-scan:
2023-03-10 17:11:48 +00:00
# Use base-image so it can read original os-release file
FROM +base-image
2022-07-14 18:05:58 +00:00
COPY +trivy/trivy /trivy
2023-03-02 17:37:00 +00:00
COPY +trivy/contrib /contrib
COPY +version/VERSION ./
ARG VERSION=$(cat VERSION)
ARG FLAVOR
ARG VARIANT
WORKDIR /build
2023-03-10 13:28:14 +00:00
RUN /trivy filesystem --skip-dirs /tmp --format sarif -o report.sarif --no-progress /
RUN /trivy filesystem --skip-dirs /tmp --format template --template "@/contrib/html.tpl" -o report.html --no-progress /
RUN /trivy filesystem --skip-dirs /tmp -f json -o results.json --no-progress /
2023-03-02 17:37:00 +00:00
SAVE ARTIFACT /build/report.sarif report.sartif AS LOCAL build/${VARIANT}-${FLAVOR}-${VERSION}-trivy.sarif
SAVE ARTIFACT /build/report.html report.html AS LOCAL build/${VARIANT}-${FLAVOR}-${VERSION}-trivy.html
SAVE ARTIFACT /build/results.json results.json AS LOCAL build/${VARIANT}-${FLAVOR}-${VERSION}-trivy.json
2022-07-14 18:05:58 +00:00
2023-03-08 08:13:08 +00:00
grype:
FROM anchore/grype
SAVE ARTIFACT /grype /grype
grype-scan:
2023-03-10 17:11:48 +00:00
# Use base-image so it can read original os-release file
FROM +base-image
2023-03-08 08:13:08 +00:00
COPY +grype/grype /grype
COPY +version/VERSION ./
ARG VERSION=$(cat VERSION)
ARG FLAVOR
ARG VARIANT
WORKDIR /build
2023-03-10 17:11:48 +00:00
RUN /grype dir:/ --output sarif --add-cpes-if-none --file report.sarif
RUN /grype dir:/ --output json --add-cpes-if-none --file report.json
2023-03-08 08:13:08 +00:00
SAVE ARTIFACT /build/report.sarif report.sarif AS LOCAL build/${VARIANT}-${FLAVOR}-${VERSION}-grype.sarif
SAVE ARTIFACT /build/report.json report.json AS LOCAL build/${VARIANT}-${FLAVOR}-${VERSION}-grype.json
2022-07-14 18:05:58 +00:00
linux-bench:
2022-08-08 08:31:00 +00:00
ARG GO_VERSION
FROM golang:$GO_VERSION
2022-07-14 18:05:58 +00:00
GIT CLONE https://github.com/aquasecurity/linux-bench /linux-bench-src
RUN cd /linux-bench-src && CGO_ENABLED=0 go build -o linux-bench . && mv linux-bench /
SAVE ARTIFACT /linux-bench /linux-bench
# The target below should run on a live host instead.
# However, some checks are relevant as well at container level.
# It is good enough for a quick assessment.
linux-bench-scan:
2023-03-10 17:11:48 +00:00
FROM +image
2022-07-14 18:05:58 +00:00
GIT CLONE https://github.com/aquasecurity/linux-bench /build/linux-bench
WORKDIR /build/linux-bench
COPY +linux-bench/linux-bench /build/linux-bench/linux-bench
2022-07-20 16:41:33 +00:00
RUN /build/linux-bench/linux-bench
2022-10-02 22:16:01 +00:00
###
### Test targets
###
2022-11-19 10:38:41 +00:00
# usage e.g. ./earthly.sh +run-qemu-datasource-tests --FLAVOR=alpine-opensuse-leap --FROM_ARTIFACTS=true
2022-10-02 22:16:01 +00:00
run-qemu-datasource-tests:
2023-03-17 15:45:43 +00:00
FROM +go-deps
2023-02-03 10:04:02 +00:00
RUN apt install -y qemu-system-x86 qemu-utils golang git
2022-07-20 16:41:33 +00:00
WORKDIR /test
ARG FLAVOR
2023-03-03 13:54:32 +00:00
ARG PREBUILT_ISO
2022-07-20 16:41:33 +00:00
ARG TEST_SUITE=autoinstall-test
ENV FLAVOR=$FLAVOR
2023-02-03 10:04:02 +00:00
ENV SSH_PORT=60023
2022-07-20 16:41:33 +00:00
ENV CREATE_VM=true
2022-10-02 22:16:01 +00:00
ARG CLOUD_CONFIG="./tests/assets/autoinstall.yaml"
2022-07-20 16:41:33 +00:00
ENV USE_QEMU=true
ENV CLOUD_CONFIG=$CLOUD_CONFIG
2022-10-02 22:16:01 +00:00
COPY . .
2023-03-03 13:54:32 +00:00
IF [ -n "$PREBUILT_ISO" ]
2023-03-03 18:42:49 +00:00
ENV ISO=/test/$PREBUILT_ISO
2022-07-20 16:41:33 +00:00
ELSE
2022-09-17 16:43:51 +00:00
COPY +iso/kairos.iso kairos.iso
ENV ISO=/test/kairos.iso
2022-10-02 22:16:01 +00:00
END
2023-03-02 13:29:40 +00:00
RUN echo "Using iso from $ISO"
2022-10-02 22:16:01 +00:00
IF [ ! -e /test/build/datasource.iso ]
COPY ( +datasource-iso/iso.iso --CLOUD_CONFIG=$CLOUD_CONFIG) datasource.iso
2022-07-20 16:41:33 +00:00
ENV DATASOURCE=/test/datasource.iso
2022-10-02 22:16:01 +00:00
ELSE
ENV DATASOURCE=/test/build/datasource.iso
2022-07-20 16:41:33 +00:00
END
2022-10-02 22:16:01 +00:00
ENV CLOUD_INIT=/tests/tests/$CLOUD_CONFIG
2022-07-20 16:41:33 +00:00
2023-03-17 15:45:43 +00:00
RUN go run github.com/onsi/ginkgo/v2/ginkgo -v --label-filter "$TEST_SUITE" --fail-fast -r ./tests/
2022-09-22 22:32:50 +00:00
2023-02-03 10:04:02 +00:00
run-qemu-netboot-test:
2023-03-17 15:45:43 +00:00
FROM +go-deps
2022-12-03 10:30:15 +00:00
COPY . /test
WORKDIR /test
ARG ISO_NAME=${OS_ID}
COPY +version/VERSION ./
ARG VERSION=$(cat VERSION)
RUN apt update
2023-02-03 10:04:02 +00:00
RUN apt install -y qemu qemu-utils qemu-system git && apt clean
2022-12-03 10:30:15 +00:00
# This is the IP at which qemu vm can see the host
ARG IP="10.0.2.2"
COPY (+netboot/squashfs --VERSION=$VERSION --RELEASE_URL=http://$IP) ./build/$VERSION/$ISO_NAME.squashfs
COPY (+netboot/kernel --VERSION=$VERSION --RELEASE_URL=http://$IP) ./build/$VERSION/$ISO_NAME-kernel
COPY (+netboot/initrd --VERSION=$VERSION --RELEASE_URL=http://$IP) ./build/$VERSION/$ISO_NAME-initrd
COPY (+netboot/ipxe --VERSION=$VERSION --RELEASE_URL=http://$IP) ./build/$VERSION/$ISO_NAME.ipxe
COPY (+ipxe-iso/iso --VERSION=$VERSION --RELEASE_URL=http://$IP) ./build/${ISO_NAME}-ipxe.iso
ENV ISO=/test/build/$ISO_NAME-ipxe.iso
ENV CREATE_VM=true
ENV USE_QEMU=true
ARG TEST_SUITE=netboot-test
2023-02-03 10:04:02 +00:00
2022-12-03 10:30:15 +00:00
# TODO: use --pull or something to cache the python image in Earthly
WITH DOCKER
RUN docker run -d -v $PWD/build:/build --workdir=/build \
--net=host -it python:3.11.0-bullseye python3 -m http.server 80 && \
2023-03-17 15:45:43 +00:00
go run github.com/onsi/ginkgo/v2/ginkgo --label-filter "$TEST_SUITE" --fail-fast -r ./tests/
2022-12-03 10:30:15 +00:00
END
2022-10-02 22:16:01 +00:00
run-qemu-test:
2023-03-17 15:45:43 +00:00
FROM +go-deps
2023-02-03 10:04:02 +00:00
RUN apt install -y qemu-system-x86 qemu-utils git && apt clean
2022-09-22 22:32:50 +00:00
ARG FLAVOR
ARG TEST_SUITE=upgrade-with-cli
2023-03-03 15:48:20 +00:00
ARG PREBUILT_ISO
2022-09-22 22:32:50 +00:00
ARG CONTAINER_IMAGE
ENV CONTAINER_IMAGE=$CONTAINER_IMAGE
ENV FLAVOR=$FLAVOR
ENV SSH_PORT=60022
ENV CREATE_VM=true
ENV USE_QEMU=true
COPY . .
2023-03-03 15:48:20 +00:00
IF [ -n "$PREBUILT_ISO" ]
2023-03-03 18:42:49 +00:00
ENV ISO=/build/$PREBUILT_ISO
2023-02-03 10:04:02 +00:00
ELSE
COPY +iso/kairos.iso kairos.iso
ENV ISO=/build/kairos.iso
END
2023-03-17 15:45:43 +00:00
RUN go run github.com/onsi/ginkgo/v2/ginkgo -v --label-filter "$TEST_SUITE" --fail-fast -r ./tests/
2022-10-02 22:16:01 +00:00
2022-10-04 19:44:27 +00:00
###
### Artifacts targets
###
## Gets the latest release artifacts for a given release
pull-release:
FROM alpine
RUN apk add curl wget
RUN curl -s https://api.github.com/repos/kairos-io/kairos/releases/latest | grep "browser_download_url.*${FLAVOR}.*iso" | cut -d : -f 2,3 | tr -d \" | wget -i -
RUN mkdir build
RUN mv *.iso build/
SAVE ARTIFACT build AS LOCAL build
## Pull build artifacts from BUNDLE_IMAGE (expected arg)
pull-build-artifacts:
ARG OSBUILDER_IMAGE
FROM $OSBUILDER_IMAGE
RUN zypper in -y jq docker
COPY +uuidgen/UUIDGEN ./
COPY +version/VERSION ./
ARG UUIDGEN=$(cat UUIDGEN)
ARG BUNDLE_IMAGE=ttl.sh/$UUIDGEN:8h
COPY +luet/luet /usr/bin/luet
RUN luet util unpack $BUNDLE_IMAGE build
SAVE ARTIFACT build AS LOCAL build
## Push build artifacts as BUNDLE_IMAGE (expected arg, common is to use ttl.sh/$(uuidgen):8h)
push-build-artifacts:
ARG OSBUILDER_IMAGE
FROM $OSBUILDER_IMAGE
RUN zypper in -y jq docker
COPY +uuidgen/UUIDGEN ./
COPY +version/VERSION ./
ARG UUIDGEN=$(cat UUIDGEN)
ARG BUNDLE_IMAGE=ttl.sh/$UUIDGEN:8h
COPY . .
COPY +luet/luet /usr/bin/luet
RUN cd build && tar cvf ../build.tar ./
RUN luet util pack $BUNDLE_IMAGE build.tar image.tar
WITH DOCKER
RUN docker load -i image.tar && docker push $BUNDLE_IMAGE
END
2022-10-02 22:16:01 +00:00
# bundles tests needs to run in sequence:
# +prepare-bundles-tests
# +run-bundles-tests
prepare-bundles-tests:
ARG OSBUILDER_IMAGE
FROM $OSBUILDER_IMAGE
RUN zypper in -y jq docker
COPY +uuidgen/UUIDGEN ./
COPY +version/VERSION ./
ARG UUIDGEN=$(cat UUIDGEN)
ARG BUNDLE_IMAGE=ttl.sh/$UUIDGEN:8h
# BUILD +examples-bundle --BUNDLE_IMAGE=$BUNDLE_IMAGE
ARG VERSION=$(cat VERSION)
RUN echo "version ${VERSION}"
WITH DOCKER --load $IMG=(+examples-bundle --BUNDLE_IMAGE=$BUNDLE_IMAGE --VERSION=$VERSION)
RUN docker push $BUNDLE_IMAGE
END
BUILD +examples-bundle-config --BUNDLE_IMAGE=$BUNDLE_IMAGE
run-qemu-bundles-tests:
ARG FLAVOR
2023-03-03 13:54:32 +00:00
ARG PREBUILT_ISO
BUILD +run-qemu-datasource-tests --PREBUILT_ISO=$PREBUILT_ISO --CLOUD_CONFIG=./bundles-config.yaml --TEST_SUITE="bundles-test" --FLAVOR=$FLAVOR
2022-10-02 22:16:01 +00:00
###
### Examples
###
### ./earthly.sh +examples-bundle --BUNDLE_IMAGE=ttl.sh/testfoobar:8h
examples-bundle:
ARG BUNDLE_IMAGE
ARG VERSION
FROM DOCKERFILE --build-arg VERSION=$VERSION -f examples/bundle/Dockerfile .
SAVE IMAGE $BUNDLE_IMAGE
## ./earthly.sh +examples-bundle-config --BUNDLE_IMAGE=ttl.sh/testfoobar:8h
## cat bundles-config.yaml
examples-bundle-config:
ARG BUNDLE_IMAGE
FROM alpine
2023-01-19 11:01:41 +00:00
RUN apk add gettext
2022-10-02 22:16:01 +00:00
COPY . .
2023-01-19 11:01:41 +00:00
RUN envsubst >> tests/assets/live-overlay.yaml < tests/assets/live-overlay.tmpl
2022-10-02 22:16:01 +00:00
SAVE ARTIFACT tests/assets/live-overlay.yaml AS LOCAL bundles-config.yaml
2023-01-10 13:21:15 +00:00
webui-deps:
2023-02-17 13:17:07 +00:00
FROM node:19-alpine
2023-01-10 13:21:15 +00:00
COPY . .
WORKDIR ./internal/webui/public
RUN npm install
SAVE ARTIFACT node_modules /node_modules AS LOCAL internal/webui/public/node_modules
2023-01-28 20:44:24 +00:00
docs:
2023-02-17 13:17:07 +00:00
FROM node:19-bullseye
2023-02-20 16:18:59 +00:00
ARG TARGETARCH
# Install dependencies
2023-02-17 13:17:07 +00:00
RUN apt install git
# renovate: datasource=github-releases depName=gohugoio/hugo
ARG HUGO_VERSION="0.110.0"
2023-02-20 16:18:59 +00:00
RUN wget --quiet "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-${TARGETARCH}.tar.gz" && \
tar xzf hugo_extended_${HUGO_VERSION}_linux-${TARGETARCH}.tar.gz && \
rm -r hugo_extended_${HUGO_VERSION}_linux-${TARGETARCH}.tar.gz && \
mv hugo /usr/bin
2023-01-28 20:44:24 +00:00
COPY . .
WORKDIR ./docs
2023-02-20 16:18:59 +00:00
2023-02-17 13:17:07 +00:00
RUN npm install postcss-cli
2023-02-20 16:18:59 +00:00
RUN npm run prepare
2023-02-17 13:17:07 +00:00
RUN HUGO_ENV="production" /usr/bin/hugo --gc -b "/local/" -d "public/local"
2023-01-28 20:44:24 +00:00
SAVE ARTIFACT public /public AS LOCAL docs/public
2023-02-13 10:43:19 +00:00
## ./earthly.sh --push +temp-image --FLAVOR=ubuntu
## all same flags than the `docker` target plus
## - the EXPIRATION time, defaults to 24h
## - the NAME of the image in ttl.sh, defaults to the branch name + short sha
## the push flag is optional
##
## you will have access to an image in ttl.sh e.g. ttl.sh/add-earthly-target-to-build-temp-images-339dfc7:24h
temp-image:
FROM alpine
RUN apk add git
COPY . ./
IF [ "$EXPIRATION" = "" ]
ARG EXPIRATION="24h"
END
ARG BRANCH=$(git symbolic-ref --short HEAD)
ARG SHA=$(git rev-parse --short HEAD)
IF [ "$NAME" = "" ]
ARG NAME="${BRANCH}-${SHA}"
END
ARG TTL_IMAGE = "ttl.sh/${NAME}:${EXPIRATION}"
2023-03-10 17:11:48 +00:00
FROM +image
2023-02-13 10:43:19 +00:00
SAVE IMAGE --push $TTL_IMAGE
2023-02-16 10:46:48 +00:00
generate-schema:
FROM alpine
COPY . ./
COPY +version/VERSION ./
COPY +build-kairos-agent/kairos-agent /usr/bin/kairos-agent
ARG RELEASE_VERSION=$(cat VERSION)
RUN mkdir "docs/static/$RELEASE_VERSION"
ARG SCHEMA_FILE="docs/static/$RELEASE_VERSION/cloud-config.json"
RUN kairos-agent print-schema > $SCHEMA_FILE
SAVE ARTIFACT ./docs/static/* AS LOCAL docs/static/