5

在多阶段 docker build 中,我执行单元测试,生成覆盖率报告并在构建阶段构建可执行文件,然后将可执行文件复制到运行阶段:

FROM golang:1.13 AS build-env
COPY . /build
WORKDIR /build

# execute tests
RUN go test ./... -coverprofile=cover.out
# execute build
RUN go build -o executable

FROM gcr.io/distroless/base:latest
COPY --from=build-env /build/executable /executable
ENTRYPOINT ["/executable"]

如何cover.out在 Jenkins 环境中提取以发布覆盖率报告?

4

3 回答 3

3

在 Docker 17.05 中,我所知道的唯一选项已发布:重构以使用运行命令和卷挂载运行该步骤,或者正如您所做的那样,docker cp. 每个选项都需要使用该选项构建特定的构建目标--target,我怀疑这是您最初的问题。

使用 19.03 中的 BuildKit,可以选择构建图像以外的东西。那看起来像:

# import code
FROM golang:1.13 AS code
COPY . /build
WORKDIR /build

# execute tests
FROM code as test
RUN go test ./... -coverprofile=cover.out

# execute build
FROM code as build
RUN go build -o executable

# add a stage for artifacts you wish to extract from the build
FROM scratch as artifacts
COPY --from test /build/coverage.xml /
COPY --from test /build/report.xml /

# and finally the release stage
FROM gcr.io/distroless/base:latest as release
COPY --from=build /build/executable /executable
ENTRYPOINT ["/executable"]

然后您的构建命令如下所示:

mkdir -p artifacts
DOCKER_BUILDKIT=1 docker build -o type=local,dest=artifacts/. --target artifacts .
DOCKER_BUILDKIT=1 docker build -t myapp .

重要的细节是--outputor-o选项,它指定 BuildKit 应该对生成的图像做什么。默认情况下,它会被导入回本地 docker 引擎。但在这种情况下,它将结果写入本地文件系统。

于 2019-12-16T13:42:52.913 回答
1

您应该使用 Docker Compose 文件运行测试,以便它可以轻松地以非交互方式提取输出,并使构建逻辑与管道的其余部分分离(更不用说它更快)。

您应该将 adocker-compose.yml与绑定挂载一起使用到$PWD. 这是来自所述 Docker Compose 文件的片段,它将输出镜像到您的主机:

version: '3.7'
services:
  app:
    image: golang:1.13
    command: go test ./... -coverprofile=cover.out
    volumes:
      - type: bind
        source: .
        target: /app

现在可以像往常一样在 CI 管道中保存工件。

于 2019-12-14T05:00:59.463 回答
1

我现在通过--target在 docker 构建期间使用标志解决了这个问题:

docker build --target build-env -t myapp:build .
docker create --name myapp-build myapp:build
docker cp myapp-build:/build/coverage.xml .
docker cp myapp-build:/build/report.xml .
docker rm myapp-build
#proceed with normal build
docker build -t myapp .

但是,这个docker-compose建议对我来说看起来更干净。

于 2019-12-15T18:37:16.833 回答