이 글에서는 GitLab의 ‘Project Import’ 기능을 활용해 GitHub에서 GitLab으로 프로젝트를 마이그레이션 하는 방법을 소개합니다. 아울러 GitHub Actions에서 GitLab 파이프라인으로 수동 마이그레이션 하는 방법도 알아봅니다. A 플랫폼에서 B 플랫폼으로 마이그레이션 하는 과정을 복잡하고 어렵게 느끼는 분들도 있을 텐데요. GitLab에서는 마우스 클릭 몇 번으로 쉽고 간단하게 마이그레이션을 진행할 수 있습니다.

사전 준비

  • GitLab 관리자가 GitHub에서 프로젝트 소스를 가져오는 기능을 활성화해야 합니다.
  • 대상이 되는 GitLab 프로젝트 그룹에 Maintainer 이상 권한이 있어야 합니다.
  • GitLab 이메일 주소와 일치하는 GitHub 공개 이메일 주소가 있어야 합니다.
  • GitHub 계정에는 GitHub 공개 이메일 주소가 있어야 합니다. 이는 모든 Comment와 Contribution이 GitLab에서 동일한 사용자에게 올바르게 대응되기 위함입니다.

GitHub 리포지터리를 GitLab으로 가져오기

1. GitHub과 연동하기

GitHub과의 통합은 GitLab.com에서 기본으로 활성화되어 있습니다.

자체 관리형 GitLab 인스턴스를 사용 중이거나 GitHub Enterprise에서 가져올 때, 이 프로세스를 수행하려면 GitHub 통합을 구성해야 합니다.

  • GitLab 홈페이지 왼쪽 사이드바에서 Projects를 누른 다음, Projects 페이지 오른쪽 상단에서 New Project 버튼을 클릭합니다.
  • 그다음, Import project 상자를 클릭합니다.
photo | 인포그랩 GitLab | 인포그랩 GitLab
GitLab ‘New project’ 페이지. 출처=GitLab

  • Import project 페이지에서 GitHub 버튼을 누릅니다.
    photo | 인포그랩 GitLab | 인포그랩 GitLab
GitLab ‘Import project’ 페이지. 출처=GitLab

  • Authenticate with GitHub 버튼을 클릭합니다.

Personal Access Token을 사용하여 GitLab.com으로 가져올 수도 있습니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab
GitLab ‘Authenticate with GitHub’ 화면. 출처=GitLab

  • GitHub에 로그인합니다.
    photo | 인포그랩 GitLab | 인포그랩 GitLab
GitHub 로그인 화면. 출처=GitHub

  • 마이그레이션 하려는 프로젝트가 저장된 GitHub 조직명 맨 오른쪽에 Grant 버튼을 클릭합니다.
  • Authorize gitlabhq 버튼을 클릭해 선택한 조직에 GitLab 액세스 권한을 부여합니다.
photo | 인포그랩 GitLab | 인포그랩 GitLab
’Authorize GitLab.com’ 화면. 출처=인포그랩

2. 프로젝트 가져오기

GitHub 리포지터리의 액세스를 승인하면 GitHub에서 리포지터리 가져오기(Import repositories from GitHub) 페이지로 리디렉션되고 GitHub 리포지터리가 나열됩니다.

  • 프로젝트에서 가져올 항목을 Advanced import settings에서 선택합니다. Import issue and pull request events를 클릭해 추가 항목을 가져오겠습니다.

    마이그레이션 하려는 항목이 많을수록 가져오는 데 시간이 더 오래 걸립니다.

    photo | 인포그랩 GitLab | 인포그랩 GitLab
    프로젝트에서 가져올 항목을 GitLab ‘GitHub import’ 페이지에서 선택한 모습. 출처=GitLab

  • GitHub 프로젝트를 마이그레이션 할 GitLab 경로를 지정한 후, Import 버튼을 누르면 가져오기가 시작됩니다.

    photo | 인포그랩 GitLab | 인포그랩 GitLab
    GitLab ‘GitHub import’ 페이지에서 GitHub 프로젝트 마이그레이션 경로를 지정한 모습. 출처=GitLab

  • UI에서 진행 상황을 볼 수 있습니다.

  • 가져오기가 완료되면, 상태가 ‘complete’로 바뀝니다.

    photo | 인포그랩 GitLab | 인포그랩 GitLab
GitLab ‘GitHub import’ 페이지에서 본 프로젝트 가져오기 상태. 출처=GitLab

3. 결과 확인

상태가 Complete로 변경되면 지정한 경로로 이동해 마이그레이션 된 프로젝트를 볼 수 있습니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab
GitLab으로 마이그레이션 된 프로젝트 관련 화면. 출처=GitLab

  • 마이그레이션 된 프로젝트는 다음 항목의 데이터를 가져옵니다.

    • 리포지터리 설명
    • Git 리포지터리 데이터
    • 브랜치 보호 규칙 (GitLab 15.4에서 도입되었습니다.)
    • 협업자(구성원) (GitLab 15.10에 도입되었습니다. GitLab 16.0부터 추가 항목으로 가져올 수 있습니다.)
    • 이슈
    • Pull requests(PR)
    • Wiki 페이지
    • 마일스톤
    • Labels
    • 릴리즈 노트 내용
    • 첨부파일
      • 릴리즈 노트 (GitLab 15.4에 도입되었습니다.)
      • 댓글 (GitLab 15.5에 도입되었습니다.)
      • 이슈 설명 (GitLab 15.5에 도입되었습니다.)
      • PR 설명 (GitLab 15.5에 도입되었습니다.)
    • PR 리뷰 댓글
    • 일반 이슈 및 PR 댓글
    • Git Large File Storage(LFS) 오브젝트
    • PR 리뷰
    • PR 지정 리뷰어 (GitLab 15.6에 도입되었습니다.)
    • PR ‘merge된’ 정보
    • 토론에서 PR 댓글의 답글 (GitLab 14.5에 도입되었습니다.)
    • PR 리뷰 댓글 제안 (GitLab 14.7에 도입되었습니다)
    • 이슈 이벤트와 PR 이벤트 (GitLab 15.4에 github_importer_issue_events_import 기능 플래그를 기본적으로 비활성화하면서 도입되었습니다. GitLab 15.5부터 추가 항목으로 가져올 수 있습니다.)
  • 브랜치 보호 규칙 및 프로젝트 설정 대응

    GitLab 15.4 버전부터 도입되었습니다.

    GitHub 브랜치 보호 규칙GitLab의 브랜치 보호 규칙이나 GitLab 프로젝트 수준 설정값으로 대응됩니다.

    GitHub 규칙GitLab 규칙도입된 버전
    Pull Request(PR)를 merge 하기 전에 모든 토론이 해결된 상태여야 합니다.Merge Request(MR)를 merge 하기 전에 모든 토론 스레드를 완료해야 합니다.(프로젝트 설정)GitLab 15.5
    merge 하기 전에 PR이 필요합니다.‘Allowed to push and merge’ 설정에서 ‘No one’ 옵션이 선택됩니다.(브랜치 보호 규칙)GitLab 15.5
    프로젝트의 기본 브랜치에 서명된 커밋이 필요합니다.유효한 키로 서명되지 않은 커밋을 거부합니다.(푸시 규칙) 이 기능은 GitLab Premium 전용 기능입니다.GitLab 15.5
    강제 푸시 허용 - 모두강제 푸시 허용 - (브랜치 보호 규칙)GitLab 15.6
    merge 전 PR에 코드 소유자의 검토 필요merge 전 MR에 코드 소유자 검토 필요(브랜치 보호 규칙) 이 기능은 GitLab Premium 전용 기능입니다.GitLab 15.6
    merge 전 PR 요청을 우회하는 사용자 설정푸시 및 merge 허용 설정(브랜치 보호 규칙). 단, GitLab Premium 구독이 없으면 특정 사용자를 직접 지정하는 것이 아니라, 사용자 역할을 기반으로 한 권한 설정으로 제한됩니다.GitLab 15.8
  • 권한 대응(구성원)

    GitLab 15.10 버전부터 도입되었습니다.

    협업자/구성원을 마이그레이션 할 때, GitHub 권한은 아래와 같은 GitLab 구성원 권한에 대응됩니다.

    GitHub roleMapped GitLab role
    ReadGuest
    TriageReporter
    WriteDeveloper
    MaintainMaintainer
    AdminOwner

GitHub Actions를 GitLab 파이프라인으로 수동 마이그레이션

지금까지 GitHub에서 프로젝트를 마이그레이션 했습니다. 이제 GitHub Actions를 GitLab 파이프라인으로 마이그레이션 하겠습니다.

1. 프로젝트 내 Action File 구성

프로젝트의 .github/workflows 폴더에는 아래와 같이 세 가지 Action file이 있습니다.

  • lint.yml : 이 파일에는 flake8을 사용하여 소스 코드에 Linting을 수행하는 Action이 포함되어 있습니다. 이는 python:3.10 Docker 이미지를 사용하고 lint를 수행하기 전 애플리케이션 요구 사항을 설치합니다.

    name: "Lint"

    on:
    push:
    branches: [ master ]
    pull_request:
    branches: [ master ]

    jobs:
    lint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python 3.10
    uses: actions/setup-python@v4
    with:
    python-version: "3.10"
    - name: Install dependencies
    run: |
    python -m pip install --upgrade pip
    pip install flake8 pytest
    if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
    - name: Lint with flake8
    run: |
    # stop the build if there are Python syntax errors or undefined names
    flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
    # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
    flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
  • smoke.yml : 이 파일에는 CLI 도움말 메뉴를 실행하여 스모크 테스트를 수행하는 Action이 포함되어 있습니다. 이는 python:3.10 Docker 이미지를 사용하고, 스모크 테스트를 수행하기 전에 애플리케이션 요구 사항을 설치합니다.

    name: "Smoke Tests"

    on:
    push:
    branches: [ master ]
    pull_request:
    branches: [ master ]

    jobs:
    smoke-tests:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python 3.10
    uses: actions/setup-python@v4
    with:
    python-version: "3.10"
    - name: Install dependencies
    run: |
    python -m pip install --upgrade pip
    pip install setuptools
    if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
    - name: Install Sentiment Analysis Application
    run: |
    python setup.py install
    - name: Run smoke tests
    run: |
    reddit-sentiment --help
  • unit.yml : 이 파일에는 pytest를 사용하여 단위 테스트를 수행하는 Action이 포함되어 있습니다. 이는 python:3.10 Docker 이미지를 사용하고, 단위 테스트를 실행하는 애플리케이션 요구 사항을 설치합니다.

    name: "Unit Tests"

    on:
    push:
    branches: [ master ]
    pull_request:
    branches: [ master ]

    jobs:
    unit-tests:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python 3.10
    uses: actions/setup-python@v4
    with:
    python-version: "3.10"
    - name: Install dependencies
    run: |
    python -m pip install --upgrade pip
    pip install pytest
    if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
    - name: Test with pytest
    run: |
    python -m pip install --upgrade pip
    if [ -f test-requirements.txt ]; then pip install -r test-requirements.txt; fi
    pytest tests/
    ```

2. .gitlab-ci.yml 파일 생성

GitLab에서 마이그레이션 된 reddit-sentiment-analyzer 프로젝트의 루트에 .gitlab-ci.yml 파일을 생성합니다. 이 파일은 GitLab 파이프라인을 정의합니다. 이후 GitHub Actions 작업을 GitLab 파이프라인 구성에 추가합니다. 파이프라인을 생성하고 구성하는 방법을 자세히 알아보려면 GitLab CI/CD 문서를 확인하세요.

# .gitlab-ci.yml

# 아래는 작업이 실행될 Stage를 생성합니다.
# 기본적으로 모든 Job은 Stage에서 병렬로 실행됩니다.
# Job이 성공적으로 완료되면 다음 Stage로 이동합니다.
# 작업 실행 방식을 완전히 구성할 수 있습니다.
stages:
- test

# include 문을 사용하면 외부 YAML에서 미리 정의된 Job을 빠르게 추가할 수 있습니다.
# 아래에 포함한 SAST Job은 GitLab에서 제공하고 유지하며,
# 파이프라인에 정적 애플리케이션 보안 테스트(SAST)를 추가합니다.
include:
- template: Jobs/SAST.gitlab-ci.yml

# 아래는 unit.yml의 GitHub Action에서 정의한 것을 정확히 수행하는 단위 테스트 Job입니다.
# 이는 python:3.10 Docker 이미지를 사용하고 애플리케이션 의존성을 설치한 다음,
# pytest로 단위 테스트를 실행합니다.
# 이는 간단한 복사 및 붙여넣기와 약간의 구문 변경으로 추가되었습니다.
unit:
image: python:3.10
stage: test
before_script:
- python -m pip install --upgrade pip
- pip install pytest
- if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
script:
- pytest tests/

# 아래는 lint.yml의 GitHub Action에서 정의한 것을 정확히 수행하는 lint Job입니다.
# 이는 python:3.10 Docker 이미지를 사용하고 애플리케이션 의존성을 설치한 다음,
# flake8로 linting을 수행합니다.
# 이는 간단한 복사 및 붙여넣기와 약간의 구문 변경으로 추가되었습니다.
lint:
image: python:3.10
stage: test
before_script:
- python -m pip install --upgrade pip
- pip install flake8
- if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
script:
- flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
- flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics

# 아래는 smoke.yml의 GitHub Action에서 정의한 것을 정확히 수행하는 스모크 테스트 Job입니다.
# 이는 python:3.10 Docker 이미지를 사용하고 애플리케이션 의존성을 설치한 다음,
# Reddit 감정 분석 CLI로 스모크 테스트를 실행합니다.
# 이는 간단한 복사 및 붙여넣기와 약간의 구문 변경으로 추가되었습니다.
smoke:
image: python:3.10
stage: test
before_script:
- python -m pip install --upgrade pip
- pip install setuptools
- if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- python setup.py install
script:
- reddit-sentiment --help

3. 파이프라인 실행

작성한 .gitlab-ci.yml 파일을 커밋하면 파이프라인이 자동으로 실행됩니다.

왼쪽 사이드바에서 Build > Pipelines를 클릭하여 실행된 파이프라인이 ‘running’ 상태임을 확인합니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab
GitLab ‘Pipelines’ 페이지에서 본 파이프라인 실행 상태. 출처=GitLab

Pipeline을 클릭하면 .gitlab-ci.yml 파일에 구성한 4개의 Job이 실행된 것을 볼 수 있습니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab
GitLab ‘Pipeline’에서 본 Job 실행 모습. 출처=GitLab

unit Job을 클릭하여 단위 테스트가 성공적으로 실행된 것을 확인합니다.

photo | 인포그랩 GitLab | 인포그랩 GitLab
단위 테스트 실행 결과 화면. 출처=GitLab

리포지터리 미러링 및 파이프라인 상태 공유 방법

가져온 리포지터리를 GitHub 사본과 동기화 상태로 유지하도록 리포지터리 미러링을 설정할 수 있습니다.

또한 GitLab에서 파이프라인 상태 업데이트로 GitHub을 업데이트할 수 있습니다. 이 기능은 GitLab Premium 전용 기능입니다.

외부 리포지터리용 CI/CD를 사용하여 프로젝트를 가져오면, 위 두 가지가 모두 자동으로 구성됩니다. 이 기능도 GitLab Premium 전용 기능입니다.

그룹 및 프로젝트 가져오기 자동화 방법

GitLab 전문 서비스 팀은 Congregate를 사용하여 사용자, 그룹 및 프로젝트 가져오기 API 호출을 조율합니다. Congregate를 활용하면 아래에 언급한 곳에서 GitLab으로 데이터를 마이그레이션 할 수 있습니다.

  • 기타 GitLab 인스턴스
  • GitHub 엔터프라이즈
  • GitHub.com
  • Bitbucket 서버
  • Bitbucket 데이터 센터

*이 기능은 GitLab Premium 전용 기능입니다.

GitLab으로 가져올 수 있는 다른 플랫폼

본 가이드는 GitLab 16.2를 기준으로 작성되었습니다.

맺음말

지금까지 GitLab의 ‘Project Import’ 기능을 사용해 GitHub에서 GitLab으로 프로젝트를 마이그레이션 하는 방법과 GitHub Actions에서 GitLab 파이프라인으로 수동 마이그레이션 하는 방법을 살펴봤습니다. GitLab은 어떤 플랫폼에서든 GitLab으로 쉽고 간단하게 마이그레이션 하도록 지원합니다. GitLab에 마이그레이션 하는 방안을 두고 오랫동안 고민했다면 더는 어렵게 생각하지 말고 위 방법을 실제 활용해 보세요.

인포그랩은 GitLab 및 DevOps에 대한 맞춤 기술 지원을 제공합니다. GitLab(Omnibus/Cloud Native Hybrid) 구축 관련한 지원이 필요하시면 문의하기 로 연락 주십시오.

<참고 자료>

1.GitHub에서 GitLab으로 쉽게 마이그레이션 하기

2.Import your project from GitHub to GitLab

3.GitHub에서 GitLab으로 가져오기

본 포스트는 영문 포스트를 우리말로 번역하고 요약 및 내용을 추가한 글입니다.