你是否曾经在持续集成 (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/