Bazel
Google의 대규모 빌드 시스템
Google의 대규모 빌드 시스템
Bazel은 Google이 내부 빌드 시스템 Blaze를 기반으로 2015년 오픈소스로 공개한 빌드 및 테스트 도구입니다. 수백만 줄의 코드와 수천 명의 개발자가 있는 Google 규모의 모노레포를 효율적으로 빌드하기 위해 설계되었습니다.
핵심 특징은 재현 가능한(Reproducible) 빌드와 증분(Incremental) 빌드입니다. 모든 빌드 입력을 명시적으로 선언하므로 동일한 입력에서 항상 동일한 결과가 나옵니다. 변경된 부분만 다시 빌드하여 대규모 코드베이스에서도 빠른 빌드 시간을 유지합니다.
Starlark(Python 유사 언어)로 BUILD 파일을 작성하며, 다양한 언어(Java, C++, Go, Python, TypeScript 등)를 단일 빌드 시스템으로 통합합니다. 원격 캐싱과 원격 실행으로 팀 전체가 빌드 결과를 공유하고 분산 빌드가 가능합니다.
실무에서는 대규모 모노레포, 복잡한 의존성 그래프, 멀티 언어 프로젝트에서 빛을 발합니다. 단, 학습 곡선이 있고 작은 프로젝트에서는 오버헤드가 될 수 있습니다. Gradle, Maven에서 마이그레이션 시 전략적 접근 필요합니다.
# BUILD.bazel - Python 서비스 빌드 정의
load("@rules_python//python:defs.bzl", "py_binary", "py_library", "py_test")
load("@rules_docker//python:image.bzl", "py_image")
# 공유 라이브러리
py_library(
name = "payment_lib",
srcs = glob(["src/**/*.py"]),
deps = [
"//common:utils",
"@pip//grpcio",
"@pip//protobuf",
],
visibility = ["//visibility:public"],
)
# 메인 애플리케이션
py_binary(
name = "payment_service",
srcs = ["main.py"],
deps = [":payment_lib"],
)
# Docker 이미지 빌드
py_image(
name = "payment_image",
base = "@python3_base//image",
binary = ":payment_service",
)
# 테스트
py_test(
name = "payment_test",
srcs = ["tests/test_payment.py"],
deps = [
":payment_lib",
"@pip//pytest",
],
)
시니어: "모노레포 전체 빌드가 20분 넘게 걸려요. Bazel 도입해서 증분 빌드하고, 원격 캐시로 CI 빌드 시간도 줄이려고 합니다."
주니어: "기존 Maven 프로젝트 마이그레이션이 쉬운가요?"
시니어: "rules_jvm_external로 Maven 의존성은 그대로 쓸 수 있지만, BUILD 파일 작성은 별도 작업이에요. 점진적으로 전환합시다."
면접관: "Bazel의 Hermetic 빌드가 왜 중요한가요?"
지원자: "Hermetic 빌드는 모든 의존성을 명시적으로 선언하여 호스트 환경에 영향받지 않습니다. 같은 코드는 어디서 빌드해도 동일한 바이너리가 나오므로, 재현 가능성이 보장되고 원격 캐싱의 정확성도 확보됩니다."
리뷰어: "이 타겟의 visibility가 //visibility:public인데, 실제로 이 패키지 외부에서 사용하나요?"
개발자: "아, 필요한 곳만 명시하는 게 낫겠네요. visibility = [\"//services/payment:__subpackages__\"]로 수정하겠습니다."