はじめに

自分が立ち上げたプロジェクトでバックエンドもフロントも言語が違うコンポーネントを一つのリポジトリで管理するモノレポを採用している

このモノレポという開発手法は Google や Facebook でも用いられている

自分の考え方としては、ベンチャーという組織においては価値を生むことが最優先なので、開発言語や特定の役割にとらわれるのではなく開発技術・言語にとらわれず一貫したプロダクトの開発を行えるようにという思いもある

今までは各コンポーネントで Docker-Compose を使っていたけど、Bazel を使ってみる

ビルド方法

公式のドキュメント におけるチュートリアルは C++, Java, Android, iOS のみ存在する

Golang に関しては、 rules_go を参照すると良い

まずはビルドするディレクトリ構成について

# ディレクトリ構成$ tree ..├── BUILD.bazel├── WORKSPACE.bazel├── go.mod└── main.go

main.gohello world! を出力するシンプルなもの

package mainimport "fmt"func main() {    fmt.Println("hello world!")}

bazel 導入に必要なファイルは WORKSPACE.bazelBUILD.bazel

bazel には WORKSPACE という概念があり、ソースコードとビルドされたファイルを管理するためのディレクトリ定義する必要がある

WORKSPACE.bazel は WORKSPACE を定義し、各言語の設定などを記述する

c++や java の場合はファイル再存在すれば動作をするが、golang の場合 WORKSPACE.bazel に下記の記述が必要になる

$  cat WORKSPACE.bazelload("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")http_archive(    name = "io_bazel_rules_go",    sha256 = "207fad3e6689135c5d8713e5a17ba9d1290238f47b9ba545b63d9303406209c6",    urls = [        "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.24.7/rules_go-v0.24.7.tar.gz",        "https://github.com/bazelbuild/rules_go/releases/download/v0.24.7/rules_go-v0.24.7.tar.gz",    ],)load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")go_rules_dependencies()go_register_toolchains()

そして、ソースコードのビルドの設定は BUILD.bazel に記述します

$ cat BUILD.bazel
load("@io_bazel_rules_go//go:def.bzl", "go_binary")

go_binary(
    name = "hello_world", # ビルドターゲット名
    srcs = ["main.go"],   # ソースコードの指定
)

この状態でターゲット名を指定してビルドを行います

# hello_worldをbazelでビルド$ bazel build //:hello_worldINFO: Analyzed target //:hello_world (1 packages loaded, 2 targets configured).INFO: Found 1 target...Target //:hello_world up-to-date:  bazel-bin/hello_world_/hello_worldINFO: Elapsed time: 0.149s, Critical Path: 0.01sINFO: 1 process: 1 internal.INFO: Build completed successfully, 1 total action

ビルドを行うと WORKSPACE で指定したディレクトリに bazel に関するファイル群が生成されます

$ tree . -L 1
.
├── BUILD.bazel
├── WORKSPACE.bazel
├── bazel-bazel_sample
├── bazel-bin
├── bazel-out
├── bazel-testlogs
├── go.mod
└── main.go

ビルドされた実行ファイルは bazel-bin 配下に含まれているので、実行してみましょう

$ ./bazel-bin/hello_world_/hello_world
hello world!

無事 bazel で、go 言語をビルドして実行することができました