Google Copybara: 저장소 간 코드 변환 및 이동

Google Copybara: 저장소 간 코드 변환 및 이동

Google Copybara는 저장소 간의 동기화된 코드 이동을 가능하게 합니다

Google Copybara는 저장소 간에 소스 코드를 변환하고 이동시키기 위한 도구입니다. 주로 기밀(비공개) 저장소와 공개 저장소 간의 동기화를 유지하는 데 사용되며, 단일한 신뢰할 수 있는 소스(source of truth)를 유지하면서 코드가 여러 위치에 존재할 수 있도록 보장합니다.

핵심 기능 및 사용 사례

Copybara는 개발자가 콘텐츠에 변환을 적용하면서 저장소 간에 코드를 이동할 수 있도록 합니다. 주요 사용 사례는 다음과 같습니다:

  • Private-to-Public Syncing: 기밀 저장소의 특정 코드 섹션을 공개 저장소로 가져오기.
  • Public-to-Private Syncing: 공개 저장소의 코드를 기밀 저장소로 다시 가져오기.
  • Contribution Management: 비권위적 저장소(예: 공개 기여자의 PR)의 변경 사항을 권위적 저장소로 이동시키고, 내부 구조에 맞게 코드를 변환하기.
  • One-time Migrations: 히스토리를 보존하면서 코드를 새로운 저장소로 한 번 이동하기.

기술 아키텍처 및 상태 관리

Copybara는 상태를 유지하지 않는(stateless) 방식으로 설계되었습니다. 무엇이 이동되었는지에 대한 외부 데이터베이스를 유지하는 대신, 커밋 메시지의 라벨을 사용하여 대상 저장소 내에 상태를 저장합니다. 이러한 아키텍처 덕분에 여러 사용자나 자동화된 서비스가 동일한 저장소에 대해 동일한 구성을 실행하여 일관된 결과를 얻을 수 있습니다.

현재 Copybara는 Git 저장소를 공식적으로 지원하며, Mercurial에 대한 실험적 지원을 제공합니다. 확장 가능한 아키텍처는 다양한 사용 사례를 위해 맞춤형 origin 및 destination을 추가할 수 있도록 설계되었습니다.

구성 및 구현

Copybara는 워크플로우를 정의하기 위해 구성 언어(일반적으로 .sky 파일)를 사용합니다. 워크플로우는 origin, destination, 이동할 파일(glob 사용), 그리고 적용할 변환을 정의합니다.

Example Workflow Logic:

core.workflow(
    name = "default",
    origin = git.github_origin(
      url = "https://github.com/google/copybara.git",
      ref = "master",
    ),
    destination = git.destination(
        url = "file:///tmp/foo",
    ),
    destination_files = glob(["third_party/copybara/**"], exclude = ["README_INTERNAL.txt"]),
    transformations = [
        core.replace(
                before = "//third_party/bazel/bashunit",
                after = "//another/path:bashunit",
                paths = glob(["**/BUILD"])),
        core.move("", "third_party/copybara")
    ],
)

설치 및 배포 옵션

Copybara는 환경에 따라 여러 방식으로 배포할 수 있습니다:

  • Pre-built Binaries: 매주 스냅샷 릴리스가 GitHub에 제공되며, Java Runtime 21 이상이 필요합니다.
  • Bazel Build: JDK 11 및 Bazel을 사용하여 소스에서 컴파일할 수 있습니다. 또한 제공된 편의 매크로를 사용하여 외부 Bazel 저장소로 통합할 수 있습니다.
  • Docker: 실험적 Docker 이미지가 제공되어 사용자가 컨테이너를 통해 Copybara를 실행할 수 있습니다. 이 방법은 실행을 제어하기 위한 환경 변수(예: COPYBARA_CONFIG, COPYBARA_WORKFLOW)를 지원하며, 저장소 접근을 위한 .gitconfig 및 SSH 자격 증명을 마운트할 수 있습니다.

커뮤니티 인사이트 및 대안

사용자와 개발자들은 다른 버전 관리 전략과 비교했을 때 Copybara의 유용성에 대해 다음과 같은 관점을 제시했습니다:

  • Monorepo Productivity: 일부 사용자는 내부 monorepo의 공개용 컴포넌트를 관리하기 위해 Copybara를 사용할 때 상당한 생산성 향상을 보고했습니다.
  • History Preservation: 폴더를 새로운 저장소로 이동하면서 Git blame 히스토리를 보존하는

Sources