整合Go和Bazel测试
在我的CI系统中,我运行各种go脚本来分析我的go代码。例如,我有一个脚本,可以验证各种主文件是否可以成功启动长时间运行的应用程序。为此,我通过运行startupvalidator-pkgs=pkg1、pkg2、pk3运行go脚本。我对使用Bazel能够利用缓存进行此操作感兴趣,因为如果整合Go和Bazel测试,go,bazel,Go,Bazel,在我的CI系统中,我运行各种go脚本来分析我的go代码。例如,我有一个脚本,可以验证各种主文件是否可以成功启动长时间运行的应用程序。为此,我通过运行startupvalidator-pkgs=pkg1、pkg2、pk3运行go脚本。我对使用Bazel能够利用缓存进行此操作感兴趣,因为如果pkg1没有更改startupvalidator将能够命中pkg1的缓存,然后重新运行pkg2和pkg3 我想了几种不同的方法来做这件事,但没有一种感觉是正确的。有没有“最佳”的方法来实现这一点?这是bazel的
pkg1
没有更改startupvalidator
将能够命中pkg1
的缓存,然后重新运行pkg2
和pkg3
我想了几种不同的方法来做这件事,但没有一种感觉是正确的。有没有“最佳”的方法来实现这一点?这是bazel的合理用例吗
我考虑创建一个bash脚本,在其中运行以下内容:
go run startupvalidator $1
使用包含以下内容的BUILD.bazel
文件
sh_binary(
name = "startupvalidator-sh",
sources = [":startupvalidator.sh"],
deps = [
"//go/path/to/startupvalidator",
],
)
我还考虑在BUILD.bazel
文件中为每个pkg1
、pkg2
和pkg3
放置一个类似的sh_测试,这样我就可以运行bazel run//go/pkg1:startupvalidator
然而,这实际上并不起作用。有没有人对我应该怎么做有反馈?欢迎提供任何方向或指针。为了利用测试结果的缓存,您需要一个
*\u测试
,您可以使用bazel测试运行该测试。可能您唯一缺少的部分是bazel-run
只运行二进制文件(即使它是测试二进制文件),而bazel-test
正在查找最新的测试结果,这意味着它使用缓存
您还需要拆分二进制文件,以便在pkg2
中更改代码不会影响pkg1
中的测试操作。缓存中的操作键包括其所有输入文件的内容、正在运行的命令等。我不确定您的startupvalidator
是否编译了各种主要函数,或者它是否在运行时查找二进制文件。如果它编译它们,您将需要构建单独的。如果它在运行时加载文件,请将它在测试规则的数据中查找的文件放入,以便它们成为测试操作输入的一部分
我会在pkg1
中执行类似的操作(假设它在运行时加载文件;如果它们是在中编译的,那么您可以创建单独的go\u测试目标):
sh_测试(
名称='startupvalidator_测试',
srcs=['startupvalidator_test.sh'],
deps=['@bazel_tools//tools/bash/runfiles'],
数据=['//go/path/to/startupvalidator',':package_main'],
)
使用startupvalidator\u test.sh
进行测试,其如下所示:
#---开始runfiles.bash初始化v2---
#复制粘贴自Bazel Bash runfiles库v2。
设置失败;f=bazel_tools/tools/bash/runfiles/runfiles.bash
源“${RUNFILES_DIR:-/dev/null}/$f”2>/dev/null ||\
来源“$(grep-sm1”^$f”“${RUNFILES_MANIFEST_FILE:-/dev/null}”| cut-f2--d”“)“2>/dev/null |”\
源“$0.runfiles/$f”2>/dev/null ||\
源“$(grep-sm1”^$f”“$0.runfiles_manifest”| cut-f2--d”“)“2>/dev/null |”\
源“$(grep-sm1”^$f”“$0.exe.runfiles_manifest”| cut-f2--d”“)“2>/dev/null |”\
{echo>&2“错误:找不到$f;退出1;};f=;set-e
exec$(rlocation workspace/go/path/to/startupvalidator)\
-main=$(rlocation workspace/pkg1/package_main)
#---end runfiles.bash初始化v2---
我假设package\u main
是由startupvalidator
加载的东西。Bazel被设置为将完整路径传递给依赖项,就像传递给其他二进制文件一样,因此我假装有一个新的标志,它采用完整路径而不仅仅是包名。shell脚本用于定位各种文件
如果您想在包之间消除重复数据,我将编写一个使用来生成shell脚本的脚本。谢谢,Brian!我只是想说,你的回答真的很有帮助,为我指明了正确的方向