로컬 CI가 해결하는 문제점
기존 웹 애플리케이션은 GitHub Actions, CircleCI와 같은 서드파티 클라우드 CI 서비스를 활용하여 변경 사항을 배포하기 전 필요한 검사를 수행합니다. 그러나 이러한 서비스는 초기 설정 시간이 오래 걸리고, 무료 또는 엔트리 레벨 티어의 가상 환경은 종종 성능이 저하되어 느리거나 일관성 없는 결과를 초래합니다. 이는 팀의 배포 속도를 저해하는 주요 병목 현상으로 작용할 수 있습니다.
Rails 8.1의 로컬 CI는 이러한 병목 현상을 해소하기 위해 로컬 개발 시스템이 업데이트 준비 상태를 확인하는 동일한 역할을 수행하도록 합니다. 현대 개발 시스템의 강력한 하드웨어 리소스를 활용하여 클라우드 기반 CI 서비스보다 훨씬 빠른 시간 내에 동일한 CI 흐름을 실행할 수 있습니다.
Rails 앱에 로컬 CI 설정하기
새로운 Rails 8.1 애플리케이션은 로컬 CI 기능이 기본으로 활성화되어 있지만, 기존 앱은 다음 단계를 통해 설정해야 합니다.
-
Rails 8.1로 앱 업그레이드:
Gemfile에서 Rails 버전을~> 8.1.1로 업데이트합니다. -
bin/rails app:update태스크 실행: 이 태스크는 새로운 스크립트와 설정 파일을 생성하고 기존 파일을 업데이트하여 Rails 8.1의 변경 사항을 적용합니다. 특히config/ci.rb와bin/ci파일이 생성됩니다. -
프레임워크 기본값 로드:
config/application.rb에서config.load_defaults 8.1로 설정하여 Rails 8.1의 새로운 기본 설정을 로드합니다.
로컬 CI 설정 파일 탐색
bin/rails app:update 실행 후에는 config/ci.rb와 bin/ci 두 가지 새로운 파일이 생성됩니다.
-
bin/ci스크립트: 애플리케이션 종속성을 로드하고, 새로운ActiveSupport::ContinuousIntegration라이브러리를 요구하여 로컬 CI의 핵심인 DSL을 사용할 수 있도록 합니다. -
config/ci.rb:CI.run블록 내에서step메서드를 사용하여 CI 실행 단계를 정의합니다. 각step은 표시할 메시지와 실행할 명령어를 인자로 받습니다. 기본 설정에는bin/setup,bin/rubocop,bin/importmap audit등이 포함되어 있으며, 필요에 따라bin/rails spec과 같은 단위 테스트 단계를 추가할 수 있습니다.
로컬 CI 실행 및 빌드 서명
bin/ci 스크립트를 터미널에서 실행하면 config/ci.rb에 정의된 각 단계가 실행되고 성공 여부 및 소요 시간이 표시됩니다. 이를 통해 클라우드 CI에서 2분 이상 걸리던 Rubocop 검사 등을 로컬에서 10초 이내에 완료하여 즉각적인 피드백을 받을 수 있습니다.
선택적으로, 로컬 CI 실행 후 GitHub 커밋 상태를 설정하는 ‘빌드 서명(Signoff)’ 기능을 사용할 수 있습니다. 이는 gh CLI와 gh extension install basecamp/gh-signoff 확장을 필요로 하며, success? 메서드를 통해 모든 단계 통과 시 gh signoff 명령어를 실행하여 최신 커밋에 대한 상태를 GitHub에 전송합니다.
로컬 CI가 도움이 되지 않는 경우
로컬 CI는 개발 워크플로우를 가속화하는 데 효과적이지만, 모든 시나리오에 적합하지는 않습니다.
-
다중 아키텍처 빌드: 개발 환경과 다른 아키텍처(예: ARM vs X64)에서 앱이 작동하는지 확인해야 하는 경우.
-
복잡한 빌드: 엔드 투 엔드 테스트와 같이 로컬에서 실행하기 어려운 추가 서비스가 필요한 경우.
-
아티팩트 생성: 팀 전체에 공유해야 하는 스크린샷, 로그 등 빌드 아티팩트 생성이 필요한 경우.