From e787e99036fee6263f747deadd1d1c6327fdc233 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Tue, 17 Jan 2023 12:02:32 +0100 Subject: [PATCH] dockerfile to build and run tests Signed-off-by: CrazyMax --- .dockerignore | 2 ++ dev.Dockerfile | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ docker-bake.hcl | 53 ++++++++++++++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 .dockerignore create mode 100644 dev.Dockerfile create mode 100644 docker-bake.hcl diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..ccc2930 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +/coverage +/node_modules diff --git a/dev.Dockerfile b/dev.Dockerfile new file mode 100644 index 0000000..8295c54 --- /dev/null +++ b/dev.Dockerfile @@ -0,0 +1,76 @@ +# syntax=docker/dockerfile:1 + +ARG NODE_VERSION=16 +ARG DOCKER_VERSION=20.10.22 +ARG BUILDX_VERSION=0.10.0 + +FROM node:${NODE_VERSION}-alpine AS base +RUN apk add --no-cache cpio findutils git +WORKDIR /src + +FROM base AS deps +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn install && mkdir /vendor && cp yarn.lock /vendor + +FROM scratch AS vendor-update +COPY --from=deps /vendor / + +FROM deps AS vendor-validate +RUN --mount=type=bind,target=.,rw <&2 'ERROR: Vendor result differs. Please vendor your package with "docker buildx bake vendor-update"' + git status --porcelain -- yarn.lock + exit 1 +fi +EOT + +FROM deps AS build +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn run build && mkdir /out && cp -Rf dist /out/ + +FROM scratch AS build-update +COPY --from=build /out / + +FROM build AS build-validate +RUN --mount=type=bind,target=.,rw <&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"' + git status --porcelain -- dist + exit 1 +fi +EOT + +FROM deps AS format +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn run format \ + && mkdir /out && find . -name '*.ts' -not -path './node_modules/*' | cpio -pdm /out + +FROM scratch AS format-update +COPY --from=format /out / + +FROM deps AS lint +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + yarn run lint + +FROM docker:${DOCKER_VERSION} as docker +FROM docker/buildx-bin:${BUILDX_VERSION} as buildx + +FROM deps AS test +RUN --mount=type=bind,target=.,rw \ + --mount=type=cache,target=/src/node_modules \ + --mount=type=bind,from=docker,source=/usr/local/bin/docker,target=/usr/bin/docker \ + --mount=type=bind,from=buildx,source=/buildx,target=/usr/libexec/docker/cli-plugins/docker-buildx \ + yarn run test --coverageDirectory=/tmp/coverage + +FROM scratch AS test-coverage +COPY --from=test /tmp/coverage / diff --git a/docker-bake.hcl b/docker-bake.hcl new file mode 100644 index 0000000..2942972 --- /dev/null +++ b/docker-bake.hcl @@ -0,0 +1,53 @@ +group "default" { + targets = ["build"] +} + +group "pre-checkin" { + targets = ["vendor-update", "format", "build"] +} + +group "validate" { + targets = ["lint", "build-validate", "vendor-validate"] +} + +target "build" { + dockerfile = "dev.Dockerfile" + target = "build-update" + output = ["."] +} + +target "build-validate" { + dockerfile = "dev.Dockerfile" + target = "build-validate" + output = ["type=cacheonly"] +} + +target "format" { + dockerfile = "dev.Dockerfile" + target = "format-update" + output = ["."] +} + +target "lint" { + dockerfile = "dev.Dockerfile" + target = "lint" + output = ["type=cacheonly"] +} + +target "vendor-update" { + dockerfile = "dev.Dockerfile" + target = "vendor-update" + output = ["."] +} + +target "vendor-validate" { + dockerfile = "dev.Dockerfile" + target = "vendor-validate" + output = ["type=cacheonly"] +} + +target "test" { + dockerfile = "dev.Dockerfile" + target = "test-coverage" + output = ["./coverage"] +}