如何解决集成Go和Bazel测试
在我的CI系统中,我运行着各种go脚本来分析Go代码。例如,我有一个脚本来验证各种主文件是否可以成功启动长时间运行的应用程序。为此,我通过go run startupvalidator -pkgs=pkg1,pkg2,pk3
运行go脚本。我对使用Bazel能够利用此缓存感兴趣,因为如果pkg1
未被更改,startupvalidator
可以访问pkg1
的缓存,然后重新运行pkg2
和pkg3
。
我想到了几种不同的方法来做到这一点,但是没有一种感觉是正确的。是否有“最佳”方式来实现这一目标?这是bazel的合理用例吗?
我考虑过要创建一个运行以下命令的bash脚本:
go run statrupvalidator $1
包含一个BUILD.bazel
文件
sh_binary(
name = "startupvalidator-sh",sources = [":startupvalidator.sh"],deps = [
"//go/path/to/startupvalidator",],)
我还考虑过在BUILD.bazel
,pkg1
和pkg2
的{{1}}文件中放置一个类似的sh_test,以便我可以运行pkg3
。
但是,这实际上不起作用。有人对我应该如何处理有反馈吗?任何方向或指针,不胜感激。
解决方法
要利用测试结果的缓存,您需要一个*_test
,它与bazel test
一起运行。也许您唯一缺少的部分是bazel run
仅运行二进制文件(即使它是测试二进制文件),而bazel test
则在寻找最新的测试结果,这意味着它使用了缓存?
您还需要拆分二进制文件,因此更改pkg2
中的代码不会影响pkg1
中的测试操作。缓存中操作的键包括其所有输入文件的内容,正在运行的命令等。我不确定您的startupvalidator
是否已编译了各种主要功能,或者它是否在寻找二进制文件在运行时。如果将它们编译进去,则需要构建单独的文件。如果要在运行时加载文件,请将要查找的文件放入测试规则的data
中,以便它们成为测试操作输入的一部分。
我会在pkg1
中做类似的事情(假设它是在运行时加载文件的;如果文件是在运行时编译的,则可以只创建单独的go_test
目标):
sh_test(
name = 'startupvalidator_test',srcs = ['startupvalidator_test.sh'],deps = ['@bazel_tools//tools/bash/runfiles'],data = ['//go/path/to/startupvalidator',':package_main'],)
带有startupvalidator_test.sh
,看起来像:
# --- begin runfiles.bash initialization v2 ---
# Copy-pasted from the Bazel Bash runfiles library v2.
set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
source "$0.runfiles/$f" 2>/dev/null || \
source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
{ echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
exec $(rlocation workspace/go/path/to/startupvalidator) \
-main=$(rlocation workspace/pkg1/package_main)
# --- end runfiles.bash initialization v2 ---
我假设package_main
是startupvalidator
加载的东西。 Bazel设置为将完整路径传递给依赖项,例如将其传递给其他二进制文件,因此我假装有一个采用完整路径而不仅仅是包名称的新标志。 Shell脚本使用runfiles.bash来定位各种文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。