使用Bazel将Go e2e测试二进制加入Docker镜像的testonly依赖报错解决
报错根因
Bazel内置依赖校验逻辑要求:标记为testonly=True的构建目标,仅能被同样开启testonly=True的目标依赖。
你引用的:e2e_test是通过go_test规则定义的,该规则默认自带testonly=True属性,而你编写的container_image规则未开启该属性,因此触发了非测试目标依赖测试专属目标的校验拦截。
修复操作
为container_image规则补充testonly=True属性即可解决报错,修改后的规则配置为:
container_image( name = "image", base = "@alpine_linux_amd64//image", entrypoint = ["/e2e_test"], files = [":e2e_test"], testonly = True, )
注意事项
- 该镜像的定位就是承载端到端测试任务,开启
testonly=True完全匹配其制品属性,不会拦截你直接执行bazel build //testing/e2e:image导出镜像、分发到测试环境的操作。 - 只要构建的
e2e_test是CGO_ENABLED=0编译的静态可执行文件,当前基于alpine的基础镜像就可以直接运行,无需额外增加系统依赖层。 - 如果后续调整二进制在镜像内的存放路径,需要同步修改
entrypoint中的对应启动路径,保证命令能定位到可执行文件。 - 若后续有非测试类目标需要依赖该测试二进制,可以单独将核心测试逻辑抽成非testonly属性的
go_binary目标,让go_test和container_image都指向该二进制,无需改动现有测试执行逻辑。
内容的提问来源于stack exchange,提问作者wwaldner
相关产品推荐
相关产品推荐

