测试

本节重点介绍测试。本节中的示例重点关注 linting,但相同的原则也适用于其他类型的测试,例如单元测试。代码检查是对代码的静态分析,可帮助您检测错误、样式违规和反模式。

根据您使用的编程语言或框架,测试代码的具体步骤可能会有很大差异。本指南中使用的示例应用程序是用 Go 编写的。您将添加一个golangci-lint使用 Go 流行的 linters运行程序的构建步骤 。

运行测试

golangci-lint工具在 Docker Hub 上以镜像形式提供。在将 lint 步骤添加到 Dockerfile 之前,您可以使用docker run 命令进行尝试。

$ docker run -v $PWD:/test -w /test \
  golangci/golangci-lint golangci-lint run

您会注意到它是golangci-lint有效的:它发现代码中缺少错误检查的问题。

cmd/server/main.go:23:10: Error return value of `w.Write` is not checked (errcheck)
		w.Write([]byte(translated))
		      ^

现在您可以将其作为一个步骤添加到 Dockerfile 中。

  # syntax=docker/dockerfile:1
  ARG GO_VERSION=1.21
+ ARG GOLANGCI_LINT_VERSION=v1.52
  FROM golang:${GO_VERSION}-alpine AS base
  WORKDIR /src
  RUN --mount=type=cache,target=/go/pkg/mod/ \
      --mount=type=bind,source=go.sum,target=go.sum \
      --mount=type=bind,source=go.mod,target=go.mod \
      go mod download -x

  FROM base AS build-client
  RUN --mount=type=cache,target=/go/pkg/mod/ \
      --mount=type=bind,target=. \
      go build -o /bin/client ./cmd/client

  FROM base AS build-server
  ARG APP_VERSION="0.0.0+unknown"
  RUN --mount=type=cache,target=/go/pkg/mod/ \
      --mount=type=bind,target=. \
      go build -ldflags "-X main.version=$APP_VERSION" -o /bin/server ./cmd/server

  FROM scratch AS client
  COPY --from=build-client /bin/client /bin/
  ENTRYPOINT [ "/bin/client" ]

  FROM scratch AS server
  COPY --from=build-server /bin/server /bin/
  ENTRYPOINT [ "/bin/server" ]

  FROM scratch AS binaries
  COPY --from=build-client /bin/client /
  COPY --from=build-server /bin/server /
+
+ FROM golangci/golangci-lint:${GOLANGCI_LINT_VERSION} as lint
+ WORKDIR /test
+ RUN --mount=type=bind,target=. \
+     golangci-lint run

添加的lint阶段使用golangci/golangci-lintDocker Hub 中的映像来调用golangci-lint run具有构建上下文的绑定安装的命令。

lint 阶段独立于 Dockerfile 中的任何其他阶段。因此,运行常规构建不会导致 lint 步骤运行。要检查代码,您必须指定lint阶段:

$ docker build --target=lint .

导出测试结果

除了运行测试之外,有时能够将测试结果导出到测试报告也很有用。

导出测试结果与导出二进制文件没有什么不同,如本指南的上一节所示:

  1. 将测试结果保存到文件中。
  2. 使用基础镜像在 Dockerfile 中创建一个新阶段scratch
  3. 使用导出器导出该阶段local

有关如何执行此操作的确切步骤留给读者练习:-)

概括

本节展示了如何使用 Docker 构建来运行测试(或如本节所示,linter)的示例。

下一步

本指南的下一个主题是使用模拟和交叉编译的多平台构建。