測試
目錄
本節重點介紹測試。本節中的示例側重於程式碼風格檢查,但相同的原則也適用於其他型別的測試,例如單元測試。程式碼風格檢查是程式碼的靜態分析,可以幫助您檢測錯誤、樣式違規和反模式。
測試程式碼的確切步驟可能會有很大差異,具體取決於您使用的程式語言或框架。本指南中使用的示例應用程式是用 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 .
匯出測試結果
除了執行測試之外,有時能夠將測試結果匯出到測試報告中也很有用。
匯出測試結果與匯出二進位制檔案沒有區別,如本指南的前一節所述。
- 將測試結果儲存到檔案。
- 使用
scratch
基礎映象在您的 Dockerfile 中建立一個新階段。 - 使用
local
匯出器匯出該階段。
如何執行此操作的確切步驟留作讀者練習 :-)
摘要
本節展示瞭如何使用 Docker 構建來執行測試(或如本節所示,程式碼風格檢查器)。
下一步
本指南中的下一個主題是使用模擬和交叉編譯的多平臺構建。