로컬 CI 설정을 통해 Pika 프로젝트는 CI 실행 시간을 획기적으로 단축하고 안정성을 높였습니다.
ci.rb 스크립트 구성
로컬 CI의 핵심은 ci.rb 스크립트에 있습니다. 이 스크립트는 다음과 같은 단계로 구성됩니다:
-
설정:
bin/setup --skip-server로 환경 초기화. -
보안 검사:
bundler-audit,brakeman(코드 분석),importmap audit(취약점 검사)를 수행합니다.importmap audit를 위해Gemfile에openssl젬 추가가 필요합니다. -
테스트 실행:
bin/rails test(일반 테스트) 및bin/rails test:system(시스템 테스트)를 실행합니다. 테스트 환경의 시드 데이터 재설정을 위해db:seed:replant도 포함됩니다. -
결과 처리: 모든 단계 성공 시
gh signoff를 호출하여 승인하고, 실패 시 수정 메시지를 표시합니다.
시스템 테스트 환경 최적화
application_system_test_case.rb 파일에서는 시스템 테스트의 안정성을 높이기 위한 설정이 적용되었습니다:
-
ENV["PARALLEL_WORKERS"] ||= "1"을 설정하여 시스템 테스트의 병렬 실행을 방지, 불안정성을 줄였습니다. -
Selenium WebDriver Chrome 옵션을 세밀하게 조정하여 헤드리스 모드와 일반 모드 모두에서 일관된 테스트 환경을 제공합니다. 이는 37signals의 Fizzy 저장소에서 영감을 받아 최적화되었습니다.
로컬 CI 실행 전제 조건 및 과정
로컬 CI를 실행하기 위해서는 GitHub CLI(gh) 설치, 로그인, gh-signoff 확장 설치 및 저장소 활성화가 필수적입니다. 실행 과정은 간단합니다: 변경 사항을 브랜치에 푸시하고 PR을 생성한 후, 로컬 환경이 깨끗한 상태에서 bin/ci 명령어를 실행하면 됩니다. Pika 프로젝트의 경우, 이 과정을 통해 CI 실행 시간이 10분 이상에서 3분 미만으로 단축되는 놀라운 개선을 이루었습니다. 비상 시에는 gh signoff create -f 명령어로 CI를 건너뛸 수 있습니다. 또한, GitHub 저장소의 브랜치 보호 규칙에서 “Do not allow bypassing the above settings” 옵션을 활성화하여 관리자도 무단 푸시를 방지할 수 있도록 보안을 강화했습니다.