1. Conductor.build와 Git Worktree의 결합
Conductor.build는 Git Worktree의 강력한 격리 기능을 추상화하여 개발자가 복잡한 명령어를 익히지 않고도 브랜치별 독립된 디렉토리를 운영할 수 있게 합니다. 일반적인 브랜치 전환 방식은 git checkout 시 데이터베이스 스키마가 현재 브랜치와 일치하지 않아 발생하는 오류가 잦지만, Conductor는 각 브랜치를 별도의 폴더로 체크아웃하여 이러한 간섭을 원천 차단합니다.
2. 핵심 환경 변수 및 워크스페이스 구조
Conductor는 워크스페이스를 생성할 때 다음과 같은 주요 환경 변수를 제공하여 스크립트 자동화를 지원합니다. - CONDUCTOR_ROOT_PATH: 메인 소스 코드가 위치한 루트 경로입니다. - CONDUCTOR_PORT: 각 워크스페이스에 할당된 고유 포트 번호입니다. - CONDUCTOR_WORKSPACE_NAME: 워크스페이스 식별을 위한 고유 명칭입니다. - CONDUCTOR_WORKSPACE_PATH: 현재 작업 중인 워크스페이스의 실제 디렉토리 경로입니다.
3. Rails 최적화를 위한 3단계 스크립트 구성
성공적인 격리 환경을 위해 conductor.json에 정의된 세 가지 핵심 스크립트를 다음과 같이 구현합니다.
3.1. Setup (bin/conductor-setup)
가장 복잡하고 중요한 단계로, 메인 경로에서 무시된(ignored) 파일들을 가져오는 역할을 합니다.
- 환경 설정 복사: .env 파일이나 config/master.key를 심볼릭 링크하거나 복사하여 애플리케이션 실행에 필요한 비밀 정보를 주입합니다.
- 데이터베이스 격리: SQLite를 사용하는 경우 기존 DB를 백업 복사하여 데이터를 유지하고, Postgres/MySQL의 경우 database.yml 설정을 통해 워크스페이스 전용 DB를 생성합니다.
- ActiveStorage 처리: 로컬 저장소의 블롭(blobs) 파일들을 복사하여 이미지나 첨부 파일이 깨지지 않도록 처리합니다.
- 의존성 및 마이그레이션: bundle install 및 bin/rails db:prepare를 실행하여 즉시 개발 가능한 상태를 만듭니다.
3.2. Run (bin/conductor-server)
Conductor가 할당한 CONDUCTOR_PORT를 애플리케이션이 인식하도록 설정합니다. 일반적으로 export PORT="${CONDUCTOR_PORT:-3000}"와 같이 설정한 후 bin/dev를 실행하여 서버를 띄웁니다.
3.3. Archive (bin/conductor-archive)
작업이 완료된 워크스페이스를 정리하는 단계입니다. 생성되었던 워크스페이스 전용 데이터베이스를 삭제(bin/rails db:drop)하거나 임시 생성된 API 키 등을 폐기하여 리소스 낭비를 방지합니다.
4. Rails 설정 파일 수정 사항
격리된 환경이 정상 작동하려면 애플리케이션 코드 내에서 다음 두 가지 수정이 권장됩니다.
- Action Mailer: development.rb에서 메일러의 호스트 포트를 ENV.fetch("PORT", 3000)로 동적 할당하여 워크스페이스별 포트가 반영되도록 합니다.
- Database Config: database.yml에서 데이터베이스 이름 뒤에 <%= "_#{ENV['CONDUCTOR_WORKSPACE_NAME']}" if ENV['CONDUCTOR_WORKSPACE_NAME'] %>와 같은 로직을 추가하여 DB 이름 충돌을 방지합니다.
5. 고급 시나리오: 서브도메인 처리
서브도메인(admin.domain 등)을 사용하는 복잡한 앱의 경우, Caddy와 같은 외부 리버스 프록시를 활용하여 Conductor 스크립트 내에서 동적으로 도메인을 등록하고 연결하는 방식을 통해 완벽한 테스트 환경을 구축할 수 있습니다.