測試

本節重點介紹測試。本節中的示例側重於程式碼風格檢查,但相同的原則也適用於其他型別的測試,例如單元測試。程式碼風格檢查是程式碼的靜態分析,可以幫助您檢測錯誤、樣式違規和反模式。

測試程式碼的確切步驟可能會有很大差異,具體取決於您使用的程式語言或框架。本指南中使用的示例應用程式是用 Go 編寫的。您將新增一個使用 golangci-lint(Go 的流行程式碼風格檢查器執行器)的構建步驟。

執行測試

golangci-lint 工具在 Docker Hub 上以映象形式提供。在將程式碼風格檢查步驟新增到 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.59
  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 階段使用來自 Docker Hub 的 golangci/golangci-lint 映象來呼叫 golangci-lint run 命令,並使用繫結掛載來掛載構建上下文。

lint 階段獨立於 Dockerfile 中的任何其他階段。因此,執行常規構建不會導致程式碼風格檢查步驟執行。要進行程式碼風格檢查,您必須指定 lint 階段

$ docker build --target=lint .

匯出測試結果

除了執行測試之外,有時能夠將測試結果匯出到測試報告中也很有用。

匯出測試結果與匯出二進位制檔案沒有區別,如本指南的前一節所述。

  1. 將測試結果儲存到檔案。
  2. 使用 scratch 基礎映象在您的 Dockerfile 中建立一個新階段。
  3. 使用 local 匯出器匯出該階段。

如何執行此操作的確切步驟留作讀者練習 :-)

摘要

本節展示瞭如何使用 Docker 構建來執行測試(或如本節所示,程式碼風格檢查器)。

下一步

本指南中的下一個主題是使用模擬和交叉編譯的多平臺構建。