你是否曾经在持续集成 (CI) 执行过测试时,感到测试速度缓慢,并花费大量时间?我们都知道,在 CI 中测试是一个必要的步骤。虽然测试策略可以提高代码质量,但执行结果确实会对立即上线和用户满意度产生直接影响。在这种情况下,我们需要一种测试更快的解决方案。即使缓存测试结果可能不是全部给出的,但也为测试策略提供了一个非常有用的机制,以加快测试执行时间。
在这里,我们将探讨如何在 CI 中缓存 Golang 测试。使用缓存会减少因为某些依赖项未更改而导致的重复测试。
第一步是设置依赖缓存。我们可以使用Docker或者其他的方式。 如果您选择使用Docker,可以使用以下命令:
“`RUN –mount=type=cache,target=/go/pkg/mod/cache \
–mount=type=cache,target=/root/.cache/go-build \
go mod download
“`
此命令指定了两个缓存位置。第一个是 Golang 存储依赖项的缓存位置,而第二个是存储编译结果的目录。这可以在多次构建期间在其它的Docker镜像中使用。
下一步是使用缓存。 我们可以使用以下命令:
“`
– name: Test
run: |
if [[ -f reports/test-results.xml ]] && [[$(cat reports/test-results.xml| wc -l) -gt 1]]; then
echo “Tests already run”
else
go test ./… | tee reports/test-results.xml
fi
“`
这里,我们使用了条件语句,如果之前的测试已经缓存,则不在运行测试。否则,我们将继续运行测试, 并将结果保存在 reports/test-results.xml 文件中。这种方法可以显著减少因为无需进行测试而导致的时间浪费。
最后一步是在 CI 构建中使用缓存。 我们可以使用以下命令:
“`
– name: Build
run: |
if [[ -f cache/${{ runner.os }}-go1.14/go.mod ]] && [[ -f cache/${{ runner.os }}-go1.14/go.sum ]]; then
echo “Cache exists”
else
mkdir -p cache/${{ runner.os }}-go1.14
rsync -avz /go/pkg/mod cache/${{ runner.os }}-go1.14/
fi
“`
此命令搜索以前在之前的构建中使用的缓存,如果缓存存在,则直接使用缓存,否则则创建新的缓存,并将机器上不同的 GO 版本和操作系统移动到缓存目录中。这样,不仅能够节省时间和资源,而且还可以在整个 CI 工作流中保持一致性。
在 CI 环境中缓存 Golang 测试的好处是明显的。这可以大大减少构建时间,从而更快地获得反馈,使整个开发过程更加流畅。此外, 缓存还可以保持构建的稳定性,保证了软件的可靠性。这个方法肯定会让你的测试流程更加高效,让你的团队往上走。
结论
在 CI 环境中缓存 Golang 测试确实可以为测试流程提供巨大的帮助。通过缓存您的测试结果,可以显著降低构建时间,减少不必要的测试,并保持构建的稳定性。这些方法提供了一种简单而有用的解决方案,以确保更快的反馈,从而加速整个开发过程。现在,您可以享受快速而精确的测试,以创建出更具价值的软件。
了解更多有趣的事情:https://blog.ds3783.com/