외부 저장소용 CI/CD

외부 저장소용 CI/CD (CI/CD for external repositories)

GitLab CI/CD는 GitHub, Bitbucket Cloud, 그리고 다른 Git 서버와도 함께 쓸 수 있어요. 프로젝트 전체를 GitLab으로 옮기지 않아도 외부 저장소를 연결해서 GitLab CI/CD의 이점을 누릴 수 있습니다. 다만 몇 가지 알려진 이슈는 있어요.

출처: 문서

본문

외부 저장소를 연결하면 저장소 미러링(repository mirroring)이 설정되고, 이슈·MR·위키·스니펫이 비활성화된 가벼운 프로젝트가 만들어집니다. 이 기능들은 나중에 다시 활성화할 수 있어요.

외부 저장소 연결하기 (Connect to an external repository)

외부 저장소를 연결하는 방법은 이렇습니다.

  1. 오른쪽 위에서 Create new ( )와 New project/repository를 선택합니다.
  2. Run CI/CD for external repository를 선택합니다.
  3. GitHub 또는 Repository by URL을 선택합니다.
  4. 필드를 작성합니다.

만약 Run CI/CD for external repository 옵션이 보이지 않는다면 다음 두 가지일 수 있어요.

  • GitLab 인스턴스에 가져오기(import) 소스가 구성되어 있지 않을 수 있어요. 관리자에게 import sources 구성을 확인해 달라고 하세요.
  • 프로젝트 미러링이 비활성화되어 있을 수 있어요. 비활성화된 경우 관리자만 Run CI/CD for external repository 옵션을 사용할 수 있어요. 관리자에게 프로젝트 미러링 구성을 확인해 달라고 하세요.

외부 풀 리퀘스트용 파이프라인 (Pipelines for external pull requests)

GitHub의 외부 저장소와 함께 GitLab CI/CD를 쓸 때는 풀 리퀘스트(PR) 맥락에서 파이프라인을 실행할 수 있어요. GitHub의 원격 브랜치에 변경을 푸시하면 GitLab CI/CD가 그 브랜치용 파이프라인을 실행할 수 있습니다. 그런데 해당 브랜치의 풀 리퀘스트를 열거나 갱신할 때는 이런 추가 작업을 원할 수 있어요.

  • 추가 job을 실행.
  • 특정 job을 실행하지 않기.

예를 들면 이렇게요.

always-run:
  script: echo 'this should always run'

on-pull-requests:
  script: echo 'this should run on pull requests'
  rules:
    - if: $CI_PIPELINE_SOURCE == "external_pull_request_event"

except-pull-requests:
  script: echo 'This should not run for pull requests, but runs in other cases.'
  rules:
    - if: $CI_PIPELINE_SOURCE == "external_pull_request_event"
      when: never
    - when: on_success

외부 풀 리퀘스트용 파이프라인 실행 (Pipeline execution for external pull requests)

GitHub에서 저장소를 가져오면 GitLab은 pushpull_request 이벤트에 대한 웹훅을 구독해요. pull_request 이벤트를 받으면 풀 리퀘스트 데이터를 참조용으로 저장합니다. 풀 리퀘스트가 방금 생성된 경우 GitLab은 외부 풀 리퀘스트용 파이프라인을 즉시 만들어요. 풀 리퀘스트가 참조하는 브랜치에 변경이 푸시되고 풀 리퀘스트가 아직 열려 있으면 외부 풀 리퀘스트용 파이프라인이 생성됩니다.

이 경우 GitLab CI/CD는 파이프라인을 2개 만듭니다. 하나는 브랜치 푸시용, 하나는 외부 풀 리퀘스트용이에요. 풀 리퀘스트가 닫힌 뒤에는 같은 브랜치에 새 변경이 푸시되어도 외부 풀 리퀘스트용 파이프라인은 생성되지 않습니다.

추가 사전 정의 변수 (Additional predefined variables)

외부 풀 리퀘스트용 파이프라인을 쓰면 GitLab이 파이프라인 job에 추가 사전 정의 변수를 노출해요. 변수 이름은 CI_EXTERNAL_PULL_REQUEST_ 접두사로 시작합니다.

알려진 이슈 (Known issues)

이 기능이 지원하지 않는 것들이 있어요.

GitLab이 파이프라인을 두 개 만들기 때문에, 열려 있는 풀 리퀘스트를 참조하는 원격 브랜치에 변경이 푸시되면 둘 다 GitHub 통합을 통해 풀 리퀘스트 상태에 기여해요. 외부 풀 리퀘스트에서만 파이프라인을 실행하고 브랜치에서는 실행하고 싶지 않다면 job 스펙에 except: [branches]를 추가할 수 있어요. 더 알아보기.

트러블슈팅 (Troubleshooting)

더 알아보기

외부 저장소를 연결하면 이슈·MR 같은 기능이 비활성화된 가벼운 프로젝트가 생긴다는 점을 기억해 두세요. GitHub 저장소를 쓸 때는 풀 리퀘스트 이벤트와 브랜치 푸시가 각각 파이프라인을 만들 수 있으니, rules로 어떤 상황에 어떤 job을 돌릴지 명확히 정해두는 게 좋아요. 미러링이나 트리거가 안 될 때는 GitLab 인스턴스의 import 소스·미러링 설정 여부를 먼저 확인해 보세요.