본문 바로가기
프로그램 (PHP,Python)

외부 Git 저장소를 내부 저장소 복제 및 동기화 통합 자동화 가이드

by 날으는물고기 2025. 1. 20.

외부 Git 저장소를 내부 저장소 복제 및 동기화 통합 자동화 가이드

외부 Git 저장소(GitHub, GitLab 등)를 내부 GitLab에 그대로 복제 및 동기화하는 방법입니다.

사전 준비

  1. 내부 GitLab 계정 생성: 내부 GitLab에서 사용할 프로젝트를 미리 생성하세요.
  2. 외부 저장소 접근: 외부 저장소에 대한 읽기 권한을 확인하세요.
    • 공개 저장소인 경우 읽기 권한이 기본으로 제공됩니다.
    • 비공개 저장소인 경우 Personal Access Token(PAT) 또는 SSH 키를 생성하여 인증을 설정해야 합니다.

내부 GitLab 프로젝트 생성

  1. GitLab에 로그인
    • 내부 GitLab에서 새로운 프로젝트를 생성합니다.
    • 프로젝트 이름은 외부 저장소 이름과 동일하게 설정해도 좋습니다.
  2. 빈 저장소 준비
    • 새로운 프로젝트를 생성할 때 "빈 프로젝트"를 선택하세요.
    • 초기화 작업(Git ignore, README 추가 등)은 하지 않습니다.

외부 저장소 복제

내부 GitLab 저장소를 외부 저장소와 동기화하려면 먼저 외부 저장소의 URL을 복제합니다.

1. Git 명령어를 통한 초기 복제

# 외부 저장소 복제
git clone --mirror https://external-repository-url.git

# 복제한 저장소로 이동
cd repository-name.git

--mirror 옵션은 저장소의 모든 브랜치, 태그, Git 히스토리를 그대로 복사합니다.

2. 내부 GitLab 원격 저장소 추가

# 내부 GitLab 저장소를 원격으로 추가
git remote set-url --push origin https://internal-gitlab-repository-url.git

동기화 작업

1. 최초 푸시

내부 GitLab에 외부 저장소를 처음으로 푸시합니다.

git push --mirror

2. 정기 동기화 설정

외부 저장소의 변경 사항을 내부 저장소에 동기화하려면 주기적으로 다음 작업을 수행합니다.

  1. 외부 변경 사항 가져오기
    git fetch origin
  2. 내부 GitLab에 푸시
    git push --mirror

3. 자동화

동기화 작업을 자동화하려면 Crontab이나 CI/CD 파이프라인을 설정합니다.

# 매일 새벽 2시에 동기화 작업 수행
0 2 * * * cd /path/to/repository-name.git && git fetch origin && git push --mirror

추가적인 고려사항

  1. Access Token 사용
    외부 저장소가 비공개인 경우 HTTPS URL에 Access Token을 포함해야 합니다.
    https://<username>:<token>@external-repository-url.git
  2. SSH 인증
    SSH를 사용할 경우 SSH 키를 생성하고 외부 및 내부 저장소에 등록합니다.
    git clone --mirror git@external-repository-url.git

GitLab CI/CD를 활용한 동기화

GitLab의 CI/CD 파이프라인을 활용해 동기화를 자동화할 수도 있습니다.

.gitlab-ci.yml 예제

stages:
  - sync

sync:
  stage: sync
  script:
    - git clone --mirror https://external-repository-url.git temp-repo
    - cd temp-repo
    - git remote set-url --push origin https://internal-gitlab-repository-url.git
    - git fetch origin
    - git push --mirror
  only:
    - schedules

이 스크립트는 GitLab의 스케줄 기능과 함께 사용하여 동기화를 주기적으로 실행합니다.

결과 확인

  • 내부 GitLab 저장소에 외부 저장소의 브랜치, 태그, 커밋 히스토리가 제대로 복제되었는지 확인하세요.
  • 정기적인 동기화 작업이 올바르게 수행되는지 검증하세요.

 

이 과정을 통해 외부 저장소의 모든 데이터를 내부 GitLab으로 복제 및 동기화할 수 있습니다. n8n을 사용하여 외부 Git 저장소(GitHub, GitLab 등)를 내부 GitLab으로 복제 및 동기화하는 자동화 워크플로를 구성하는 방법입니다.

n8n 워크플로 개요

n8n은 HTTP Request 및 Shell Command 노드를 사용하여 외부 저장소를 내부 GitLab으로 복제 및 동기화할 수 있습니다.

워크플로 동작 흐름

  1. 외부 Git 저장소에서 데이터를 가져오기 (HTTP Request 노드)
  2. 내부 GitLab에 프로젝트 확인 및 생성 (HTTP Request 노드)
  3. Git 명령어 실행 (Execute Command 노드)
    • 저장소 복제 및 동기화
  4. 결과 확인 및 알림

워크플로 상세 구성

1. Trigger Node

  • 워크플로 시작 트리거를 설정합니다.
    • 정기적으로 동기화를 실행하려면 Cron 노드를 사용하세요.
    • 예: 매일 새벽 2시 실행
      {
        "nodes": [
          {
            "parameters": {
              "triggerTimes": {
                "item": [
                  {
                    "mode": "everyDay",
                    "hour": 2
                  }
                ]
              }
            },
            "name": "Cron",
            "type": "n8n-nodes-base.cron",
            "typeVersion": 1,
            "position": [
              250,
              300
            ]
          }
        ]
      }

2. HTTP Request (외부 저장소 확인)

  • 외부 저장소 정보를 가져옵니다.
  • 노드 설정
    • 메서드: GET
    • URL: https://api.github.com/repos/{owner}/{repo} (GitHub 예시)
    • 인증: Personal Access Token
    • 출력 값
      • 외부 저장소 URL

3. HTTP Request (내부 GitLab 저장소 확인 및 생성)

  • 내부 GitLab에 프로젝트가 존재하는지 확인하고 없으면 생성합니다.
  • 노드 설정
    • 메서드: GET
    • URL: https://gitlab.example.com/api/v4/projects/{project_id_or_name}
    • 인증: GitLab Personal Access Token
  • 없는 경우
    • 새 프로젝트 생성
      • 메서드: POST
      • URL: https://gitlab.example.com/api/v4/projects
      • Body:
        {
          "name": "repository-name",
          "visibility": "private"
        }

4. Execute Command (Git 명령어 실행)

Git 명령어를 실행하여 동기화 작업을 수행합니다.

 

명령어 구성

# Git 저장소 복제
git clone --mirror https://external-token@github.com/owner/repository.git /tmp/repository.git

# 내부 저장소로 Push 설정
cd /tmp/repository.git
git remote set-url --push origin https://internal-token@gitlab.example.com/owner/repository.git

# 동기화
git fetch origin
git push --mirror

노드 설정

  • 명령어: 위 Git 명령어 입력
  • 실행 환경
    • n8n 서버가 Git 명령어를 실행할 수 있어야 합니다.
    • 필요한 경우 Git 및 SSH 키를 설정하세요.

5. 알림

  • 동기화 성공 여부를 Slack, 이메일 등으로 알림 설정.
  • Slack 노드 예시
    • 메서드: POST
    • URL: https://slack.com/api/chat.postMessage
    • Body:
      {
        "channel": "#notifications",
        "text": "Git 저장소가 성공적으로 동기화되었습니다."
      }

워크플로 실행 및 모니터링

  1. n8n에서 워크플로를 저장하고 활성화합니다.
  2. 워크플로가 실행되면 동기화 작업이 진행됩니다.
  3. 내부 GitLab에서 저장소 및 히스토리를 확인하세요.

추가 고려사항

  1. 오류 처리
    • 동기화 실패 시 알림을 설정합니다.
    • HTTP Response 코드 또는 Git 명령어 실행 결과를 기반으로 예외 처리를 추가하세요.
  2. 보안
    • Access Token은 환경 변수 또는 n8n Credentials에 저장하세요.
    • 토큰을 명령어에 직접 포함하지 않도록 주의합니다.

이 과정을 통해 n8n을 사용하여 외부 저장소를 내부 GitLab으로 자동 복제 및 동기화할 수 있습니다. 필요에 따라 알림 또는 추가 처리를 설정하여 워크플로를 확장할 수 있습니다.

728x90

댓글