Bash를 사용해 전체 GitLab 마이그레이션을 자동화한 방법 (실제 사례 연구 + Scripts)
Source: Dev.to

여러 GitLab 인스턴스 간에 리포지토리를 마이그레이션하면 그룹, 서브그룹, CI/CD 파이프라인, 변수, 태그, 이슈 등을 다룰 때 복잡하고 반복적인 작업이 빠르게 증가할 수 있습니다.
이 문제를 효율적으로 해결하기 위해 셀프‑호스팅 GitLab Community Edition에서 GitLab Enterprise (gitlab.com) 로 프로젝트를 마이그레이션하는 데 사용되는 Bash 자동화 스크립트 모음을 개발했습니다. 이 글에서는 접근 방식, 구조, 장점을 요약하고, 전체 툴킷을 커뮤니티에 오픈소스로 제공하고 있습니다.
왜 마이그레이션을 자동화할까?
대규모 환경을 마이그레이션할 때 수작업은 다음과 같은 문제를 야기합니다.
- ❌ 시간 소모가 큼
- ❌ 오류 발생 가능성 높음
- ❌ 추적·반복이 어려움
자동화를 통해 다음을 보장할 수 있습니다.
- ✔️ 재현 가능
- ✔️ 감사 가능
- ✔️ 안전함
- ✔️ 확장 가능
- ✔️ 빠름
툴킷에 포함된 내용
| 스크립트 | 목적 |
|---|---|
clone-projects.sh | 소스 GitLab 그룹의 모든 리포지토리를 복제 |
replace_gitlab-ci.sh | 새로운 경로에 맞게 .gitlab-ci.yml 참조를 업데이트 |
push-projects.sh | 브랜치와 태그를 대상 GitLab 인스턴스로 푸시 |
migrar-variaveis.sh | API를 통해 그룹 수준 환경 변수를 마이그레이션 |
migrar_issues.sh | 메타데이터를 보존하면서 이슈와 댓글을 마이그레이션 |
delete-issues.sh | 스테이징/테스트 환경을 초기화할 때 이슈 삭제 |
gitlab-clone-recursive.sh | 중첩된 그룹과 서브그룹을 재귀적으로 복제 |
gitlab-push-recursive.sh | 리포지토리를 푸시하고 누락된 서브그룹을 자동으로 재생성 |
각 스크립트에는 다음이 포함됩니다.
- 검증 로직
- 로깅
- 백업 동작
- 멱등 실행(재실행 안전)
작동 방식 (고수준 워크플로)
- 소스 GitLab에서 리포지토리를 복제합니다.
- 필요에 따라 CI/CD 경로 교체를 적용합니다.
- 리포지토리(브랜치 + 태그)를 대상 인스턴스로 푸시합니다.
- 변수, 이슈, 메타데이터를 마이그레이션합니다.
- 마이그레이션을 검증하고 최종 완료합니다.
이 흐름은 점진적 마이그레이션을 지원하므로 대규모 환경에서도 유용합니다.
전체 소스 코드
전체 소스 코드는 공개 저장소에 있습니다(간결성을 위해 링크는 생략).
최종 결과
이 자동화를 사용하여 다음을 달성했습니다.
- ✅ 모든 리포지토리의 완전한 마이그레이션
- ✅ 히스토리, 브랜치, 태그 보존
- ✅ 최소한의 수작업으로 CI/CD 파이프라인 재사용
- ✅ 통제되고 재현 가능한 프로세스
마무리 메모
이 프로젝트는 실제 GitLab 마이그레이션 과정에서 리포지토리, CI/CD 파일, 변수, 브랜치, 태그, 이슈를 구조적이고 안전하게 다루는 명확하고 완전한 자동화 가이드가 부족하다는 점을 깨닫고 시작되었습니다.
첫 번째 버전은 Linux 자동화와 셸 스크립팅에 대한 강력한 배경지식 덕분에 Bash로 구현했으며, 빠른 개발과 신뢰성 있는 마이그레이션을 가능하게 했습니다. 장기 목표는 솔루션을 Python으로 리팩터링하여 향후 확장·유지보수가 더 쉽고 모듈화된 형태로 만드는 것입니다.
기여, 기능 개선, 혹은 Python 재작성에 관심이 있다면 언제든 참여해 주세요—협업을 환영합니다.
이 프로젝트가 여러분의 시간을 절약하거나 더 나은 접근 방식을 제시했으며, 조금이라도 도움이 되었다면 공개한 보람이 있습니다. 함께라면 DevOps 커뮤니티가 더욱 강해집니다. 🚀
GitLab 마이그레이션을 계획하거나 진행 중이라면 자유롭게 포크하고, 적용하고, 개선 사항을 기여해 주세요.
피드백 및 협업을 언제든 환영합니다!