From 3c5d37326ddd13956950d4b27326fd6cf9712ccc Mon Sep 17 00:00:00 2001 From: Christopher Crone Date: Fri, 22 May 2020 13:04:27 +0200 Subject: [PATCH] Use docker build for lint This approach allows better caching of results (so faster subsequent lints). It also avoids bind mounts which are slow. Benchmarks on my machine (2017 MacBook Pro 13"): * bind mount lint: 2m 38s * new lint (after docker builder prune): 1m 35s * old lint (rerun no changes): 2m 38s * new lint (rerun added println in random Go file): 9s Signed-off-by: Christopher Crone --- Dockerfile | 16 +++++++++++++--- Makefile | 5 +++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index fcdb81bc5..96b38530d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ # syntax = docker/dockerfile:experimental ARG GO_VERSION=1.14.3-alpine +ARG GOLANGCI_LINT_VERSION=1.27.0 FROM golang:${GO_VERSION} AS base ARG TARGET_OS=unknown @@ -32,14 +33,23 @@ ADD . ${PWD} FROM protos-base AS make-protos RUN make -f builder.Makefile protos +FROM golangci/golangci-lint:v${GOLANGCI_LINT_VERSION}-alpine AS lint-base + +FROM base AS lint +COPY --from=lint-base /usr/bin/golangci-lint /usr/bin/golangci-lint +ENV CGO_ENABLED=0 +RUN --mount=id=build,type=cache,target=/root/.cache/go-build \ + --mount=id=lint,type=cache,target=/root/.cache/golangci-lint \ + make -f builder.Makefile lint + FROM base AS make-cli -RUN --mount=type=cache,target=/root/.cache/go-build \ +RUN --mount=id=build,type=cache,target=/root/.cache/go-build \ GOOS=${TARGET_OS} \ GOARCH=${TARGET_ARCH} \ - make -f builder.Makefile cli + make -f builder.Makefile cli FROM base AS make-cross -RUN --mount=type=cache,target=/root/.cache/go-build \ +RUN --mount=id=build,type=cache,target=/root/.cache/go-build \ make -f builder.Makefile cross FROM scratch AS protos diff --git a/Makefile b/Makefile index b32125075..f2988dfdf 100644 --- a/Makefile +++ b/Makefile @@ -62,7 +62,8 @@ cache-clear: ## Clear the builder cache @docker builder prune --force --filter type=exec.cachemount --filter=unused-for=24h lint: ## run linter(s) - docker run --rm -t -v $(PWD):/app -w /app golangci/golangci-lint:v1.27-alpine golangci-lint run --timeout 10m0s ./... + @docker build . \ + --target lint classic-link: ## create docker-classic symlink if does not already exist ln -s /usr/local/bin/docker-classic /Applications/Docker.app/Contents/Resources/bin/docker @@ -73,4 +74,4 @@ help: ## Show help FORCE: -.PHONY: all protos cli e2e-local cross test cache-clear lint help classic-link +.PHONY: all protos cli e2e-local cross test cache-clear lint classic-link help