首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用Bazel将Go测试二进制文件添加到container_image

基础概念

Bazel 是一个开源的构建和测试工具,类似于 Make、Maven 和 Gradle,但具有不同的设计目标和特性。它主要用于支持大型代码库的构建和测试,并且能够处理复杂的依赖关系。

Go 测试二进制文件是指使用 Go 语言编写的测试程序,它可以独立运行并执行一系列的测试用例。

container_image 是指 Docker 镜像,它是一个轻量级的、独立的、可执行的软件包,包含运行某个应用所需的所有内容,如代码、运行时、库、环境变量和配置文件。

相关优势

  1. 构建速度:Bazel 能够并行执行任务,利用多核处理器提高构建速度。
  2. 可扩展性:Bazel 支持自定义构建规则,可以轻松集成新的构建系统和工具。
  3. 依赖管理:Bazel 能够精确地跟踪和管理项目的依赖关系,确保构建的可重复性。
  4. 容器化支持:Bazel 提供了对 Docker 镜像构建的内置支持,使得将应用程序打包成容器镜像变得简单。

类型

Bazel 支持多种类型的构建目标,包括:

  • cc_binary:用于构建 C/C++ 二进制文件。
  • go_binary:用于构建 Go 二进制文件。
  • go_test:用于构建 Go 测试二进制文件。
  • container_image:用于构建 Docker 镜像。

应用场景

在持续集成/持续部署(CI/CD)流程中,Bazel 可以用于自动化构建和测试 Go 应用程序,并将测试二进制文件打包成 Docker 镜像,以便在不同的环境中运行。

如何将 Go 测试二进制文件添加到 container_image

以下是一个简单的示例,展示如何使用 Bazel 将 Go 测试二进制文件添加到 Docker 镜像中。

1. 创建一个简单的 Go 测试程序

代码语言:txt
复制
// test.go
package main

import (
    "fmt"
    "testing"
)

func TestHello(t *testing.T) {
    fmt.Println("Hello, World!")
}

2. 创建 Bazel 构建文件

代码语言:txt
复制
# BUILD
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_test")

go_test(
    name = "test_binary",
    srcs = ["test.go"],
    visibility = ["//visibility:public"],
)

container_image(
    name = "test_image",
    base = "@docker//container/base:debian-buster",
    files = [":test_binary"],
)

3. 配置 Bazel 规则

确保你已经安装了 rules_gorules_docker 规则集。如果没有安装,可以通过以下命令添加:

代码语言:txt
复制
bazel run @bazel_tools//tools/build_defs/repo:http.bzl#http_archive -- \
    name = "io_bazel_rules_go" \
    urls = ["https://github.com/bazelbuild/rules_go/releases/download/v0.29.0/rules_go-v0.29.0.tar.gz"] \
    sha256 = "a8d6b1b370ec7bf0fe415a0e68e2f9da9d0c04d2dda1c7f1f36234d3

bazel run @bazel_tools//tools/build_defs/repo:http.bzl#http_archive -- \
    name = "com_github_bazelbuild_rules_docker" \
    urls = ["https://github.com/bazelbuild/rules_docker/releases/download/v0.14.4/rules_docker-v0.14.4.tar.gz"] \
    sha256 = "e8f8b6e5a2d3c1f9d05e513e8f9b3b9d0d8a7f9f9c9d5a6e5a2d3c1f9d05e513e8f9b3b9"

4. 构建 Docker 镜像

代码语言:txt
复制
bazel build //:test_image

5. 运行 Docker 镜像

代码语言:txt
复制
docker run bazel-bin/test_image

参考链接

通过以上步骤,你可以使用 Bazel 将 Go 测试二进制文件打包成 Docker 镜像,并在不同的环境中运行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

静态资源嵌入go二进制文件

embed 通过embed 包可以在go应用程序运行时访问嵌入的文件go1.16功能 在import "embed" 后的Go文件可以使用// go:embed指令在编译时从包目录或子目录读取文件内容来初始化...//go:embed image/* template/*//go:embed html/index.htmlvar content embed.FS Go构建系统识别指令,并安排使用文件系统中的匹配文件填充声明的变量...模式是相对于包含源文件的软件包目录来解释的。即使在Windows系统上,路径分隔符也是一个正斜杠。为了命名名称中带有空格的文件,可以模式写为Go双引号或反引号字符串文字。...要匹配当前目录中的所有内容,请使用"*"而不是"."。 如果任何模式无效或匹配无效,则构建失败。...// go:embed指令即使使用String或[]byte也需要导入"embed"。在不引用embed.FS的源文件中,使用空白导入(import _"embed")。

1.4K20
  • 构建Golang项目

    1 `rules_go` 与 `gazelle` 2 `go build` 到 `bazel build` 2.1 初始化 Bazel 构建 2.2 编译 Go 项目 2.3 测试编译结果 2.4 Go...`gazelle`[2] 这个项目可以 Go 项目转为 Bazel 方式构建,包括生成 BUILD.bazel 文件,根据 go.mod 文件自动生成下载依赖模块规则 go_repository。...rules_go 主要特性支持包括: 构建库、二进制可执行文件测试go_library、go_binary、go_test) Vendoring cgo 交叉编译 通过 nogo[3] 进行构建时代码分析...gazelle 的另一种方式就是直接和 Bazel 集成使用,作为一个外部规则导入使用,WORKSPACE 文件中:。...项目)根目录执行运行 gazelle 生成相关依赖模块导入代码和 BUILD.bazel 文件: # 根据 go.mod,go_repository规则写入一个单独的宏文件并将其加载到 WORKSPACE

    3.9K10

    使用Zig在arm64上引导Uber的基础设施

    既然我们的核心基础设施需要提供一流的 arm64 支持,那么这个项目就很自然地被分成两个部分: 第一个任务是包含了我们几乎所有基础架构代码的 Go 代码库编译成 arm64 二进制文件; 修改与构建、...我们开始使用 Zig, zig cc 整合到我们的 Go 代码库中。...2022 年 2 月,Go 代码库对 zig cc 的初步支持是通过添加到一个配置标志来实现的: bazel build –config=hermetic-cc 最开始所有的东西都不正常,大部分的测试都无法构建通过...例如: 当开发人员在 Go 代码库中定义了 Docker 镜像(使用 rules_docker,它相当于 Dockerfile,只是是在 Bazel使用),CI 编译 x86_64 和 arm64...目前不可能在我们的 Go 代码库中声明一个不能编译到 arm64 的新的 Debian 包。 在能够程序编译为 arm64 之后,我们开始采用所有可以存储、下载和执行原生二进制文件的系统。

    34330

    连1.0版本都没有,Uber为什么会采用这样一项新技术?

    现在,Uber 只在 Go Monorepo 中使用 bazel-zig-cc,但计划尽可能地zig cc推广到其他需要 C/C++ 工具链的语言。...不可避免地,我们的一些 Go 代码要使用 CGo,所以它需要一个 C/C++ 编译器。然后,CGo Go 和 C 部分链接成最终的可执行文件。...否则,如果构建主机上 glibc 的版本比生产主机上的新,那么生成的二进制文件链接到较新的 glibc 版本,就会与生产主机上的旧版本不兼容。...Go 的新版本的官方二进制文件在构建时使用的 GCC 版本,比我们的一些构建机器上的新。在这些机器上,我们不得不通过从源代码编译 Go 来解决这个问题。...该项目是用 Bazel 构建的,并使用了 CGo。我希望我的二进制文件是静态的,但 Bazel 并没有让这个过程变得简单。

    1.5K20

    扩展 Bazel 的构建语言

    本篇介绍何使用宏和规则扩展 Bazel 的构建语言。 在学习更高级的概念之前,先了解以下几个知识点: 了解 BUILD 和 .bzl 文件使用的 Starlark 语言。...当 BUILD 文件过于重复或过于复杂时,它就非常有用,因为它允许您重复使用某些代码。 规则比宏更强大。它可以访问 Bazel 内部信息,并完全掌控将要处理的内容。例如,它可以信息传递给其他规则。...对新语言的支持通常通过规则来实现,例如 rules_go( https://github.com/bazelbuild/rules_go )。...规则实例化,将其添加到图表中。 分析阶段。执行规则的代码(其 implementation 函数),并将操作实例化。...如果文件缺失,或者某个命令无法生成一条输出,则构建会失败。在此阶段可选运行测试

    1.7K10

    repository_rule() vs rule()

    这样就会出现一个问题,即构建是不可复制的,如果同一项目上的两个开发人员安装了不同版本的 Go SDK,则他们构建不同的二进制文件。它还会中断远程执行,即主机的工具链可能在执行平台上不可用。...git 仓库 与 http 相关的规则:@bazel_tools//tools/build_defs/repo:http.bzl http_archive: Bazel 相关的压缩的存档文件远程仓库下载下来...://docs.bazel.build/versions/master/skylark/lib/repository_ctx.html 3 使用 repository_rule 实现文件读取/生成 conf...query @{工作区名称}//:* 4 使用 repository_rule 实现下载工具链 我们可以 Bazel 配置为使用本地工具链,但是为了实现构建环境的可复制性,我们可以工具链统一远端管理...最后实现 go_binary,输入(源文件)传入规则,并调用具体的动作实现最后的可执行文件生成。

    2.4K20

    入坑搞定Python多种任务,Go 1.11 新版本正式发布!

    这允许程序员Go程序编译为与四种主流Web浏览器兼容的二进制格式。...由于添加了新的GOOS值“js”和GOARCH值“wasm”,Go工具现在忽略名为* _js.go或* _wasm.goGo文件,除非使用了那些GOOS/GOARCH值。...调试 编译器现在可以为优化的二进制文件生成更精确的调试信息,包括可变位置信息、行号和断点位置。这将使调试没有-N -l编译的二进制文件成为可能。...这也解决了使用-race编译的混合Go/C二进制文件二进制文件中的“address space conflict”故障。...在macOS和iOS上,运行时现在使用libSystem.so,而不是直接调用内核。这应该使Go二进制文件与未来版本的macOS和iOS更加兼容。

    95010

    TensorFlow开发环境搭建(Ubuntu16.04+GPU+TensorFlow源码编译)

    vs 源码安装 同时,安装时可以考虑采用二进制安装,还是源码安装, 4 二进制安装 二进制安装可以有很多选择, 5 实际使用选择 手头上有两台电脑, MacBook Pro (Retina, 13-...CUDA安装结束后,则可以恢复到图形界面模式, sudo service lightdm start 到这里,CUDA的安装还不算结束,需要将CUDA相关的内容添加到系统环境变量中。...,还是GCC做了降级(PS,在安装时可以先不降级,看看是否会出问题),GCC降级方法如下, sudo apt-get install g++-4.9 sudo update-alternatives...Bazel是一个构建工具,即一个可以运行编译和测试来组装软件的工具,跟Make、Ant、Gradle、Buck、Pants和Maven一样。...10 环境测试 可以通过如下代码进行测试, # Python import tensorflow as tf hello = tf.constant('Hello, TensorFlow!')

    1.7K60

    编译kubernetes源码

    cd $working_dir/kubernetes 执行一些校验操作如 hack/update-gofmt.sh 确定所有文件都被格式化 hack/update-bazel.sh 更新bazel编译依赖的文件...运行命令行测试 build/copy-output.sh 此脚本会把docker中的 _output/dockerized/bin 拷贝到本地的 _output/dockerized/bin, 编译完的二进制同样在该目录...,读者可自行到源码的 build/build-image 目录找到 发布 build/release.sh脚本用于发布包, 编译二进制程序,跑测试用例和build运行时的Docker镜像 会输出kubernetes.tar.gz...文件包含: 交叉编译的客户端工具 在不同平台运行的选择脚本 例子 各种云上部署集群的脚本 所有二进制程序tar包 还会创建一些额外的压缩包 kubernetes-client-*.tar.gz 指定平台客户端二进制...KUBE_BUILD_PLATFORMS=linux/amd64 \ make all WHAT=cmd/kubeadm GOFLAGS=-v KUBE_GIT_VERSION 环境变量是需要的,否则编译出来的二进制文件没有版本信息

    2.4K10

    dotnet 使用 MSTestRunner 单元测试制作为独立可执行文件

    这就限制了运行单元测试的环境了,有时候开发者可能期望在无 SDK 或开发环境下执行单元测试,这时就可以用到本文介绍的 MSTestRunner 功能,单元测试制作为独立可执行文件 单元测试制作为可执行文件...可执行文件可以作为独立框架发布的方式,如此可以在一些纯净的环境里面运行,或者是单元测试打包分发给测试同事,请测试同事在大批量的设备上进行执行。...,现有的性能调试工具基本都对独立应用程序支持的非常好,通过单元测试制作为独立可执行文件可以更加方便与现有的性能调试工具进行对接 以下和大家介绍如何利用 MSTestRunner 的功能,单元测试制作为独立可执行文件...通过单元测试构建为独立可执行文件,我就可以在 UOS 上只做测试的活,不参与具体的开发。...单元测试构建出来的可执行文件归档起来,通过单元测试可以更好的批量的测试其系统版本之间的行为差异 本文以上代码放在github 和 gitee 欢迎访问 可以通过如下方式获取本文的源代码,先创建一个空文件

    22810

    测试使用navicat工具MySQL格式SQL文件导入到MogDB数据库

    前言 当我们想把mysql格式的SQL文件导入到MogDB数据库时,我们可以借助navicat工具,先将SQL文件导入到mysql数据库中,再使用数据传输功能把SQL中的对象和数据直接导入到MogDB...操作方法 Part 1:mysql格式SQL文件(mysql.sql)导入到mysql的test数据库: mysql.sql 文件内容: CREATE TABLE `mysql` ( `ID` int...'; 使用navicat工具连接mysql: 右键点击打开连接: 双击test用户,右键选择运行SQL文件: 选择mysql.sql文件位置,并点击开始: 导入成功后,点击关闭: 查询test...MogDB数据库: 方法二:导入到test数据库的数据库对象导出为PostgreSQL格式的SQL文件export.sql,再将export.sql文件导入到mogdb的mys1数据库。...mysql" ADD PRIMARY KEY ("ID"); 打开MogDB,右键点击mysql数据库选择运行SQL文件export.sql文件导入: 确认无误,点击开始。

    3.4K30
    领券