我想在一个需要使用Docker的CI环境中测试我的Go代码。如何创建go.mod中列出的所有依赖项已经下载和编译的Docker映像,以便docker run $IMG go test使用缓存的工件?
此图像所需的属性:
go.mod编译依赖项。我不想使用完整的源代码,因为对源代码的任何更改都会使持有缓存dependencies.docker run $IMG go test ./...的Docker层失效,不会重新下载或重新编译go.mod.现有办法
解析go.mod并使用go get
来自https://github.com/golang/go/issues/27719#issuecomment-578246826
这种方法是接近的,但在运行GOCACHE时,它似乎不使用go test。这似乎也会阻塞某些模块路径,比如gopkg.in/DataDog/dd-trace-go.v1。
FROM golang:1.13
WORKDIR /src
COPY go.mod ./
RUN set -eu \
&& go mod graph \
| cut -d '@' -f 1 \
| cut -d ' ' -f 2 \
| sort -u \
| sed -e 's#dd-trace-go.v1#&/ddtrace#' \
| xargs go get -vdocker run --mount /src:/src $IMG go test ./...使用带有挂载缓存的DOCKER_BUILDKIT
最初在https://github.com/golang/go/issues/27719#issuecomment-514747274中描述。这只适用于go build。我不能将它用于go test,因为缓存挂载是在RUN命令之后卸载的,因此它在创建的Docker映像中不存在。
这也取决于试验码头的特点。
# syntax = docker/dockerfile:experimental
FROM golang:1.13 as go-builder
ARG VERSION
WORKDIR /src
COPY . /src/
# With a mount cache, Docker will cache the target directories for future
# invocations of this RUN layer. Meaning, once this command is run once, all
# successive calls will use the already downloaded and already compiled assets.
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
go build ./server发布于 2020-07-22 02:19:20
我经常将COPY go.mod放在Dockerfile的开头,因为它不会经常更改。
FROM golang:1.14.3 as builder
WORKDIR /app
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -tags netgo -ldflags '-extldflags "-static"' -o app .
FROM centos:7
WORKDIR /root
COPY --from=builder /app/app .所以,如果你去国防部不改变,行RUN go mod download只运行第一次。
发布于 2020-12-18 14:43:12
如果你跑了去拿吧。/.它将根据go.mod和go.sum将所有依赖项下载到您的坞映像中。如果您正在处理内部自签名存储库,还可以向go get命令添加--不安全标志。非常类似于去模下载。除此之外,您还可以有一个shell脚本来启动Go测试。/.并向您的CI环境报告,如果允许的话,我知道Gitlab允许这样做。
FROM golang:1.15-alpine AS builder
RUN apk add --update git gcc musl-dev
RUN apk update && apk add bash
COPY . /app
RUN go version
WORKDIR /app
ENV CGO_ENABLED=0
RUN git config --global http.sslVerify false
RUN go get ./...
WORKDIR /app
RUN chmod +x ./unitTest.sh
RUN ./unitTest.sh
WORKDIR /app/cmd/svr
RUN go build -o app
RUN chmod 700 app
FROM alpine:latest
WORKDIR /root/
ARG build_stamp
ARG git_commit
ARG build_number
ENV BUILD_STAMP=$build_stamp
ENV GIT_COMMIT=$git_commit
ENV BUILD_NUMBER=$build_number
COPY --from=builder /app/cmd/svr .
EXPOSE 8000
CMD ["./app"]还有剧本
#!/usr/bin/env bash
TESTS=$(go test -v -covermode=count -coverprofile=count.txt ./...)
echo "$TESTS"
if echo "$TESTS" | grep -q "FAIL" ; then
echo ""
echo "One or more Unit Tests for app have Failed. Build will now fail. Pipeline will also fail..."
echo ""
exit 1
else
echo ""
echo "All Unit Tests for application have passed!"
echo "Running Code Coverage..."
echo ""
COVERAGE=$(go tool cover -func=./count.txt)
echo "$COVERAGE"
exit 0
fihttps://stackoverflow.com/questions/60200363
复制相似问题