Bazel: 언제 사용해야 할까? (2023)
(earthly.dev)- Bazel은 Google이 대규모 모노레포를 효율적으로 빌드하기 위해 개발한 오픈 소스 빌드 시스템
- 복잡한 프로젝트를 정확하고 빠르게 빌드하며, 특히 대규모 코드베이스와 다중 언어 종속성을 다룰 때 효과적
- Bazel의 핵심 개념
- 정확성 기반의 속도: Bazel은 빌드를 순수 함수로 간주, 동일한 입력이 동일한 출력을 생성하도록 보장
- 효율적인 캐싱: Google의 대규모 환경에서 캐싱은 필수이며, 정확성이 이를 가능하게 함
- 청소 없는 빌드: 소스 변경 후 "clean build" 없이도 안정적 빌드 가능
- Bazel의 사용 시점
- 사용 권장
- 대규모 모노레포: 코드 라인이 수백만에 이르고 여러 언어를 사용하는 경우
- 다양한 언어의 종속성 관리: 예를 들어 Python으로 모델 학습, Scala로 데이터 처리 등
- 빠르고 정확한 CI/CD 요구: 개발 속도를 높이고 충돌 방지
- 사용 비추천
- 소규모 프로젝트: 코드 라인이 10만 이하이고, 단일 언어를 사용하는 경우
- 오픈 소스 라이브러리: Bazel은 배포 가능한 아티팩트 생성에는 적합하지만, 재사용 가능한 라이브러리 배포에는 미흡
- 사용 권장
- Bazel 도입 시 고려 사항
- 초기 학습 곡선이 높고, 빌드 파일 작성 및 유지보수에 추가 리소스 필요
- 캐시 서버 및 원격 실행 설정 등의 인프라 구축이 필수
- 성공적인 Bazel 사례
- Netflix
- 문제점: 25만-30만 라인의 코드가 포함된 레포에서 CI 시간이 45분-1시간 소요
- 해결책: Bazel 도입 후 빌드 시간이 20분에서 6분으로 감소
- 효과: 병합 충돌 감소, PR 처리 속도 개선
- Open Systems
- 문제점: 느린 빌드 시간과 비효율적인 작업 흐름
- 해결책: Bazel로 전환 후 피드백 루프를 20분에서 5분으로 단축
- 교훈: 개발자 교육과 소통이 중요
- Netflix
- Bazel 도입의 장단점
- 장점
- 빠른 빌드 시간: 캐싱 및 증분 빌드로 속도 개선
- 정확성과 재현성: 복잡한 종속성 그래프를 정확히 표현
- 다중 언어 통합: Haskell, TypeScript, Python 등 다양한 언어 지원
- 단점
- 높은 도입 비용: 초기 설정 및 학습 곡선이 가파름
- 빌드 파일 관리 필요: 입력/출력 명시가 필수적이며, 자동화 도구 활용 필요
- JavaScript 및 프론트엔드 툴링: 핫 리로딩 등 기존 워크플로와 호환 어려움
- 장점
- Bazel 마이그레이션 팁
- 핵심 팀 구성: Bazel을 이해하고 설정할 수 있는 전문가 확보
- 교육 및 소통: 도입 초기, 개발자 교육과 기대치 설정 필수
- 언어별 복잡성: 각 언어마다 다른 빌드 설정 요구
- 빌드 파일 자동화: Gazelle 같은 도구 활용
- 결론
- Bazel은 대규모 모노레포와 복잡한 종속성을 처리하는 데 탁월하지만, 도입 비용이 높음
- 수백만 라인의 코드와 다중 언어를 다루는 조직에 적합
- 소규모 프로젝트나 점진적 전환을 원하는 경우, Bazel 대신 Earthly 같은 대안 검토
Bazel 도입 실패사례도 언급이 되면 좋을 것 같군요.
AOSP의 경우 최근 몇년동안 BazelCon 에서 기존의 빌드시스템(Soong)에서 Bazel로 마이그레이션하는 부분에 대해 몇가지 발표를 하였습니다.
https://developers.googleblog.com/en/…
하지만 올해 Bazelcon 에서는 AOSP관련 내용 공유가 빠져있고, 최근 AOSP의 빌드관련 문서에서는 Bazel 이전이 중단되었다는 안내가 나왔습니다.
Bazel 마이그레이션 관련해서 AOSP팀이라면 많은 도움을 받을 수 있을텐데, 도입을 포기했다는 것에 대해 많은 시사점을 보여주는 것 같습니다.