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 <christopher.crone@docker.com>
This commit is contained in:
Christopher Crone 2020-05-22 13:04:27 +02:00
parent 0917acfb01
commit 3c5d37326d
2 changed files with 16 additions and 5 deletions

View File

@ -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

View File

@ -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