푸시 미러링
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
푸시 미러 는 업스트림 리포지터리에 이루어진 커밋을 미러링하는 다운스트림 리포지터리입니다. 풀 미러링은 업스트림 리포지터리에서 주기적으로 업데이트를 가져오지만, 푸시 미러는 다음 경우에만 변경 사항을 전달받습니다. 업스트림 리포지터리에 변경 사항을 푸시하면 푸시 미러는 5분 이내에, Only mirror protected branches 설정이 켜져 있으면 1분 이내에 이를 전달받습니다.
푸시 미러 는 업스트림 리포지터리에 이루어진 커밋을 미러링하는 다운스트림 리포지터리입니다. 푸시 미러는 업스트림 리포지터리에 이루어진 커밋의 사본을 수동적으로 전달받습니다. 미러가 업스트림 리포지터리와 어긋나지 않도록, 다운스트림 미러에 직접 커밋을 푸시하지 않습니다. 대신 업스트림 리포지터리에 커밋을 푸시합니다.
풀 미러링은 업스트림 리포지터리에서 주기적으로 업데이트를 가져오지만, 푸시 미러는 다음 경우에만 변경 사항을 전달받습니다.
- 업스트림 GitLab 리포지터리에 커밋이 푸시된 경우
- 관리자가 미러를 강제로 업데이트한 경우
업스트림 리포지터리에 변경 사항을 푸시하면 푸시 미러는 5분 이내에, Only mirror protected branches 설정이 켜져 있으면 1분 이내에 이를 전달받습니다.
브랜치가 기본 브랜치에 병합되고 소스 프로젝트에서 삭제되면, 다음 푸시에서 원격 미러에서도 삭제됩니다. 병합되지 않은 변경 사항이 있는 브랜치는 유지됩니다. 브랜치가 어긋나면 Mirroring repositories 섹션에 오류가 표시됩니다.
GitLab Silent Mode는 원격 미러로의 푸시와 원격 미러로부터의 풀을 비활성화합니다.
푸시 미러 제한#
각 프로젝트는 최대 10개의 푸시 미러를 활성화할 수 있습니다. 자세한 내용은 프로젝트 푸시 미러 최대 개수를 참고합니다.
푸시 미러링 구성#
사전 요구 사항:
- GitLab 리포지터리와 원격 리포지터리가 동일한 오브젝트 형식을 사용해야 합니다. SHA-1 리포지터리와 SHA-256 리포지터리 사이에는 미러링할 수 없습니다.
기존 프로젝트에 푸시 미러링을 설정하려면 다음 단계를 따릅니다.
- 상단 바에서 Search or go to를 선택하고 프로젝트를 찾습니다.
- 왼쪽 사이드바에서 Settings > Repository를 선택합니다.
- Mirroring repositories를 확장합니다.
- 리포지터리 URL을 입력합니다.
- Mirror direction 드롭다운 목록에서 Push를 선택합니다.
- Authentication method를 선택합니다. 자세한 내용은 미러의 인증 방법을 참고합니다.
- 필요하면 Only mirror protected branches를 선택합니다.
- 원하면 Keep divergent refs를 선택합니다.
- 구성을 저장하려면 Mirror repository를 선택합니다.
API를 통한 푸시 미러 구성#
원격 미러 API를 통해 프로젝트 푸시 미러를 만들고 수정할 수도 있습니다.
벗어난 참조 유지#
기본적으로 원격(다운스트림) 미러의 참조(브랜치 또는 태그)가 로컬 리포지터리와 어긋나면, 업스트림 리포지터리가 원격의 변경 사항을 덮어씁니다.
- 리포지터리가
main과develop브랜치를 원격으로 미러링합니다. - 원격 미러의
develop에 새 커밋이 추가됩니다. - 다음 푸시에서 원격 미러가 업스트림 리포지터리와 일치하도록 업데이트됩니다.
- 원격 미러의
develop에 추가된 새 커밋이 사라집니다.
Keep divergent refs를 선택하면 변경 사항이 다르게 처리됩니다.
- 원격 미러의
develop브랜치 업데이트를 건너뜁니다. - 원격 미러의
develop브랜치는 업스트림 리포지터리에 없는 커밋을 유지합니다. 원격 미러에는 있고 업스트림에는 없는 참조는 그대로 둡니다. - 업데이트는 실패로 표시됩니다.
미러를 만든 뒤에는 원격 미러 API를 통해서만 Keep divergent refs 값을 수정할 수 있습니다.
GitLab에서 GitHub으로 푸시 미러 설정#
GitLab에서 GitHub으로 커밋을 푸시하면 GitHub은 이메일 주소를 기준으로 커밋 작성자를 판단합니다. 커밋 이메일 주소가 GitHub 사용자 계정에서 확인된 이메일과 일치하면, GitHub은 해당 사용자의 커밋으로 표시합니다. 일치하지 않으면 커밋은 작성자 없이 커밋 메타데이터의 이름과 이메일만 표시됩니다.
사전 요구 사항:
- 리포지터리 콘텐츠에 대한
읽기 및 쓰기 권한을 가진 GitHub
세분화된 개인 액세스 토큰.
리포지터리에
.github/workflows디렉터리가 있다면 Workflows에 대한 읽기 및 쓰기 권한도 부여해야 합니다. 접근 범위를 더 세분화하려면 특정 리포지터리에만 적용되도록 토큰을 구성합니다.
미러를 설정하려면 다음 단계를 따릅니다.
-
Git repository URL에 다음 형식으로 URL을 입력합니다.
https://github.com/GROUP/PROJECT.gitGROUP: GitHub의 그룹입니다.PROJECT: GitHub의 프로젝트입니다.
-
Username에 개인 액세스 토큰 소유자의 사용자 이름을 입력합니다.
-
Password에 GitHub 개인 액세스 토큰을 입력합니다.
-
Mirror repository를 선택합니다.
미러링된 리포지터리가 목록에 표시됩니다. 예를 들면 다음과 같습니다.
https://*****:*****@github.com/<your_github_group>/<your_github_project>.git
리포지터리는 잠시 후 푸시됩니다. 푸시를 강제로 실행하려면 Update now ([retry])를 선택합니다.
GitLab에서 AWS CodeCommit으로 푸시 미러 설정#
AWS CodeCommit 푸시 미러링은 GitLab 리포지터리를 AWS CodePipeline에 연결하는 가장 좋은 방법입니다. GitLab은 아직 CodePipeline의 소스 코드 관리(SCM) 공급자로 지원되지 않습니다. 새 AWS CodePipeline을 만들 때마다 상당한 AWS 인프라 설정이 필요합니다. 또한 브랜치마다 개별 파이프라인이 필요합니다.
CodePipeline의 마지막 단계가 AWS CodeDeploy 라면, 대신 다음 도구를 조합해 배포를 구성할 수 있습니다.
- GitLab CI/CD 파이프라인
.gitlab-ci.yml의 마지막 job에서 CodeDeploy로 배포하는 AWS CLI
GitLab에서 AWS CodeCommit으로 미러를 설정하려면 다음 단계를 따릅니다.
-
AWS IAM 콘솔에서 IAM 사용자를 만듭니다.
-
리포지터리 미러링에 필요한 최소 권한을 inline policy로 추가합니다.
Amazon 리소스 이름(ARN)에는 리전과 계정을 명시해야 합니다. 이 IAM 정책은 샘플 리포지터리 두 개에 대한 미러링 접근 권한을 부여합니다. 이 권한은 미러링에 필요한 최소 권한으로 검증되었습니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "MinimumGitLabPushMirroringPermissions", "Effect": "Allow", "Action": [ "codecommit:GitPull", "codecommit:GitPush" ], "Resource": [ "arn:aws:codecommit:us-east-1:111111111111:MyDestinationRepo", "arn:aws:codecommit:us-east-1:111111111111:MyDemo*" ] } ] } -
사용자를 만든 뒤 AWS IAM 사용자 이름을 선택합니다.
-
Security credentials 탭을 선택합니다.
-
HTTPS Git credentials for AWS CodeCommit에서 Generate credentials를 선택합니다.
[!note] 이 Git 사용자 ID와 비밀번호는 CodeCommit과 통신할 때만 사용합니다. 해당 사용자의 IAM 사용자 ID 나 AWS 키와 혼동하지 않도록 주의합니다.
-
전용 Git HTTPS 사용자 ID와 비밀번호를 복사하거나 다운로드합니다.
-
AWS CodeCommit 콘솔에서 GitLab 리포지터리를 미러링할 새 리포지터리를 만듭니다.
-
새 리포지터리를 열고 오른쪽 위에서 Code > Clone HTTPS (**Clone HTTPS (GRC)**가 아님)를 선택합니다.
-
GitLab에서 푸시 미러링할 리포지터리를 엽니다.
-
Settings > Repository를 선택한 다음 Mirroring repositories를 확장합니다.
-
Git repository URL 필드를 다음 형식으로 채웁니다. 이때
<aws-region>은 AWS 리전으로,<your_codecommit_repo>는 CodeCommit의 리포지터리 이름으로 바꿉니다.https://git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo> -
Authentication method에서 Username and Password를 선택합니다.
-
Username에 AWS special HTTPS Git user ID를 입력합니다.
-
Password에 앞서 AWS에서 만든 IAM Git 클론 사용자 ID의 비밀번호를 입력합니다.
-
CodeCommit에서는 Only mirror protected branches 옵션을 그대로 둡니다. 이 옵션을 쓰면 푸시 주기가 5분에서 1분으로 짧아집니다.
CodePipeline은 AWS CI를 설정하려는 명명된 브랜치마다 개별 파이프라인 설정을 요구합니다. 동적 이름을 가진 피처 브랜치는 지원되지 않으므로, Only mirror protected branches를 구성해도 CodePipeline 연동에서 유연성 문제가 생기지 않습니다. CodePipeline을 구성하려는 명명된 브랜치는 모두 보호된 브랜치로 지정해야 합니다.
-
Mirror repository를 선택합니다. 미러링된 리포지터리가 다음과 같이 표시됩니다.
https://*****:*****@git-codecommit.<aws-region>.amazonaws.com/v1/repos/<your_codecommit_repo>
푸시를 강제로 실행해 미러링을 테스트하려면 Update now (반원 화살표)를 선택합니다.
Last successful update에 날짜가 표시되면 미러링이 올바르게 구성된 것입니다.
올바르게 동작하지 않으면 빨간색 error 태그가 나타나고, 마우스를 올리면 오류 메시지가 표시됩니다.
2FA가 활성화된 다른 GitLab 인스턴스로 푸시 미러 설정#
- 대상 GitLab 인스턴스에서
write_repository스코프를 가진 개인 액세스 토큰을 만듭니다. - 소스 GitLab 인스턴스에서 다음 단계를 따릅니다.
- Git repository URL을 다음 형식으로 입력합니다.
https://<destination host>/<your_gitlab_group_or_name>/<your_gitlab_project>.git - Username에
oauth2를 입력합니다. - Password를 입력합니다. 대상 GitLab 인스턴스에서 만든 GitLab 개인 액세스 토큰을 사용합니다.
- Mirror repository를 선택합니다.
- Git repository URL을 다음 형식으로 입력합니다.