Bazel for Ruby

[EN] Bazel for Ruby / Alex Rodionov @p0deje

3줄 요약

  • Bazel은 Google에서 개발된 모노레포지토리 환경에 최적화된 고효율 빌드 및 테스트 도구입니다.
  • Ruby 프로젝트에서는 `rules_ruby` 확장을 통해 루비 인터프리터, 의존성, 빌드 및 테스트를 효율적으로 관리할 수 있습니다.
  • 이를 통해 병렬 테스트 실행, 지능형 캐싱, 분산 빌드 및 테스트 기능을 활용하여 개발 생산성과 CI/CD 효율성을 극대화할 수 있습니다.

Bazel은 Google이 개발한 대규모 모노레포지토리용 고효율 빌드 및 테스트 도구입니다. 다국어 지원, 확장성, 재현성, 분산 처리 기능이 특징입니다. 본 발표는 Bazel의 작동 원리와 함께, Ruby 프로젝트를 위한 공식 확장인 `rules_ruby`의 기능 및 활용법을 상세히 다루며, Ruby 애플리케이션 개발 효율성 극대화 방안을 제시합니다.

Bazel은 모든 빌드 및 테스트 과정을 ‘입력 → 동작 → 출력’의 DAG(방향성 비순환 그래프)로 관리하여, 변경 시 필요한 작업만 재실행하고 캐시를 활용해 빌드 시간을 단축합니다. 이는 빌드 환경의 재현성을 보장하고 다양한 언어를 통합 관리하는 ‘Hermetic’ 및 ‘Polyglot’ 특성을 제공합니다.

rules_ruby는 Bazel 내 Ruby 언어 지원을 추가하는 핵심 규칙 세트입니다. Ruby 인터프리터 설치(C Ruby, JRuby, TruffleRuby 지원), Bundler를 통한 의존성 관리, 그리고 ruby_library, ruby_binary, ruby_test, ruby_gem_build, ruby_gem_push와 같은 주요 빌드/테스트 타겟 정의 기능을 제공합니다.

사용자는 module.bazel에서 rules_ruby를 로드하고 의존성을 설정하며, BUILD 파일에 소스 노출, gem 빌드/배포 타겟을 정의합니다. 테스트는 ruby_test로 RSpec/RuboCop 등을 정의하고, bazel test ...로 병렬 실행 및 캐싱을 활용합니다. Bazel은 독립적인 샌드박스에서 테스트를 실행하여 간섭을 방지하고 CPU를 효율적으로 사용합니다.

rules_ruby를 통해 Bazel의 강력한 기능들을 Ruby 프로젝트에서 활용할 수 있습니다. 소스 변경 시 관련된 테스트만 선별적으로 재실행하는 기능, 코드 가시성 제어, 빌드/테스트 결과의 원격 캐싱 및 원격 실행 기능은 대규모 프로젝트의 CI/CD 효율성을 혁신적으로 개선합니다. 현재 C Ruby의 휴대용 버전 부재가 원격 빌드 실행의 제약 사항으로 언급됩니다.

결론적으로, Bazel과 `rules_ruby`는 Ruby 프로젝트의 빌드 및 테스트 프로세스를 현대화하고 최적화하는 강력한 솔루션입니다. Bazel의 병렬 처리, 지능형 캐싱, 격리된 실행 환경, 분산 기능은 대규모 코드베이스 관리 및 CI/CD 병목 현상을 효과적으로 해결합니다. `rules_ruby`는 지속적으로 발전하며, 향후 테스트 샤딩, 코드 커버리지, 타입 체크 통합, Gemfile 의존성 관리 개선, 디버깅 지원 강화 등 더 많은 고급 기능들을 Ruby 생태계에 가져올 것으로 기대됩니다. Ruby 개발자들은 이를 통해 더욱 효율적이고 안정적인 개발 워크플로우를 구축할 수 있습니다.