Bazel의 핵심 개념
- 빌드 및 테스트 도구: Make, Rake와 유사하게 소프트웨어 빌드 및 테스트 실행을 위한 도구입니다.
- 모노레포 최적화: Google에서 ‘Blaze’라는 이름으로 개발되어 모노레포 환경에 특화되었습니다.
- 다국어 지원: Java, Python을 기본으로 지원하며, 확장 모듈을 통해 Go, JavaScript, Ruby 등 다양한 언어를 지원합니다.
- 효율성 및 확장성: 수천 명의 엔지니어가 사용하는 코드베이스를 위해 설계되어 매우 효율적이고 확장 가능합니다.
- 재현성(Reproducible) 및 밀폐성(Hermetic): 빌드에 필요한 모든 소프트웨어 및 도구를 격리된 환경에 설치하여 어떤 머신에서든 동일한 결과물을 보장합니다.
- 분산 빌드: 로컬 캐싱 및 원격 빌드 실행을 통해 대규모 분산 시스템에서의 빌드를 지원합니다.
빌드 및 테스트 과정
- 그래프 기반 접근: 모든 빌드 및 테스트는 입력(소스 코드, 환경 변수) -> 액션(명령어 실행) -> 출력(새로운 파일)의 세 단계로 나뉘며, 이는 방향성 비순환 그래프(DAG)로 표현됩니다.
- 지능형 캐싱: Bazel은 빌드 그래프를 메모리에 유지하며 입력 변경 사항을 추적합니다. 소스 코드 변경 시 해당 변경에 영향을 받는 타겟만 재빌드/재테스트하여 효율성을 극대화합니다.
- 병렬 실행: 격리된 샌드박스에서 여러 테스트를 병렬로 실행하여 테스트 시간을 단축합니다.
rules_ruby
를 통한 Ruby 지원
rules_ruby
소개: Bazel 생태계 내 Ruby 언어 지원을 위한 공식 규칙 세트입니다. Selenium 프로젝트에서 시작되었으며, 현재 Bazel Rule Authors SIG에서 관리됩니다.- 주요 기능:
- Ruby 인터프리터 설치: CRuby, JRuby, TruffleRuby 등 다양한 버전의 인터프리터 설치 및 관리를 지원합니다.
- 의존성 관리: Bundler를 사용하여 Gemfile에 명시된 의존성을 설치하고 추적합니다.
- 빌드 및 테스트 타겟:
ruby_library
(Ruby 파일 노출),ruby_binary
(Ruby 스크립트 실행),ruby_test
(RSpec, RuboCop 등 테스트 실행),ruby_gem
(Gem 빌드),ruby_gem_push
(Gem 푸시) 등을 제공합니다.
- 사용 예시:
MODULE.bazel
파일에서rules_ruby
모듈 로드, 인터프리터 및 Bundler 의존성을 설정합니다.BUILD.bazel
파일에서ruby_gem
,ruby_library
,ruby_test
등의 타겟을 정의하고deps
속성을 통해 의존성을 명시합니다.bazel build //:calendar
(Gem 빌드),bazel run //:calendar_release
(Gem 푸시),bazel test //spec/...
(테스트 실행) 명령어를 통해 작업을 수행합니다.
- 효율성 입증: RuboCop 테스트 예시에서 소스 코드 변경이 없을 시
cached
결과가 반환되어, Bazel의 지능적인 캐싱 능력을 보여줍니다.
rules_ruby
의 현재 상태 및 향후 과제
- 강점: 병렬 및 격리된 테스트 실행, 필요한 테스트만 실행하는 지능형 기능(Crystal Ball과 유사), 가시성 제어(Packwerk 유사), 원격 캐싱 및 실행 지원을 제공합니다.
- 제한 사항: CRuby의 원격 빌드 실행을 위해서는 컴파일 및 설치가 필요 없는 독립형 버전이 필요합니다.
- 향후 계획: 테스트 샤딩, 커버리지 지원(SimpleCov), Aspect(빌드 중 타입 체크 등 추가 명령 실행), Gemfile 의존성 관리 개선(자체 호스팅, Git 저장소), 디버깅 지원 강화 등이 있습니다.