GitLab CI/CD에서 Git 서브모듈 사용하기

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated

Git 서브모듈을 사용하여 Git 저장소를 다른 Git 저장소의 하위 디렉토리로 유지합니다. 프로젝트 내에서 다른 저장소를 복제하고 커밋을 따로 관리할 수 있습니다.

.gitmodules 파일 구성

Git 서브모듈을 사용할 때 프로젝트에 .gitmodules 파일이 있어야 합니다. GitLab CI/CD 작업에서 작동하도록 구성하는 여러 가지 옵션이 있습니다.

절대 URL 사용

예를 들어, 생성된 .gitmodules 구성은 다음과 같을 수 있습니다.

  • 당신의 프로젝트가 https://gitlab.com/secret-group/my-project에 위치해 있고,
  • 당신의 프로젝트가 서브모듈로 포함하고자 하는 https://gitlab.com/group/project에 의존하며,
  • SSH 주소인 git@gitlab.com:secret-group/my-project.git로 소스를 체크아웃합니다.
[submodule "project"]
  path = project
  url = git@gitlab.com:secret-group/project.git

이 경우, GitLab Runner가 서브모듈을 복제하기 전에 URL을 HTTPS로 변환하도록 GIT_SUBMODULE_FORCE_HTTPS 변수를 사용합니다.

또한, 만약 로컬에서도 HTTPS를 사용한다면 HTTPS URL을 구성할 수 있습니다.

[submodule "project"]
  path = project
  url = https://gitlab.com/secret-group/project.git

이 경우 추가적인 변수를 구성할 필요는 없지만, 로컬에서 복제하려면 개인 액세스 토큰을 사용해야 합니다.

상대 URL 사용

경고: 상대 URL을 사용하는 경우 포크 워크플로우에서 서브모듈이 잘못 해석될 수 있습니다. 당신의 프로젝트에 포크가 생길 것으로 예상된다면 상대 URL 대신 절대 URL을 사용하세요.

당신의 서브모듈이 동일한 GitLab 서버에 있는 경우, .gitmodules 파일에서 상대 URL을 사용할 수 있습니다.

[submodule "project"]
  path = project
  url = ../../project.git

위의 구성은 Git이 소스를 복제할 때 사용할 URL을 자동으로 추론하도록 지시합니다. 모든 CI/CD 작업에서 HTTPS로 복제할 수 있으며, 로컬에서는 여전히 SSH를 사용할 수 있습니다.

같은 GitLab 서버에 없는 서브모듈의 경우 항상 전체 URL을 사용하세요.

[submodule "project-x"]
  path = project-x
  url = https://gitserver.com/group/project-x.git

CI/CD 작업에서 Git 서브모듈 사용하기

서브모듈이 CI/CD 작업에서 올바르게 작동하려면 다음을 수행할 수 있습니다:

  1. 실행자에게 서브모듈을 작업 전에 가져오도록 GIT_SUBMODULE_STRATEGY 변수를 normal 또는 recursive로 설정할 수 있습니다.

    variables:
      GIT_SUBMODULE_STRATEGY: recursive
    
  2. GitLab 서버에 있는 서브모듈에 대해 Git 또는 SSH URL로 구성했는지 확인하고, GIT_SUBMODULE_FORCE_HTTPS 변수가 설정되어 있는지 확인하세요.

  3. GIT_DEPTH 변수와 독립적으로 서브모듈의 클론 깊이를 구성하려면 GIT_SUBMODULE_DEPTH를 사용하세요.

    variables:
      GIT_SUBMODULE_DEPTH: 1
    
  4. 특정 서브모듈을 필터링하거나 제외하여 동기화를 제어하려면 GIT_SUBMODULE_PATHS를 사용하세요.

    variables:
      GIT_SUBMODULE_PATHS: submoduleA submoduleB
    
  5. 고급 체크아웃 동작을 제어하기 위해 추가 플래그를 제공할 수 있으며, 이는 GIT_SUBMODULE_UPDATE_FLAGS를 사용하여 수행할 수 있습니다.

    variables:
      GIT_SUBMODULE_STRATEGY: recursive
      GIT_SUBMODULE_UPDATE_FLAGS: --jobs 4
    

만약 파이프라인 작업에서 서브모듈을 복제하려면, 해당 작업을 실행하는 사용자는 상위 서브모듈 프로젝트에서 파이프라인을 트리거할 수 있는 권한을 가진 역할에 할당되어 있어야 합니다. 추가로, 상위 서브모듈 프로젝트에서 CI/CD 작업 토큰 액세스가 적절히 구성되어 있어야 합니다.

문제 해결

.gitmodules 파일을 찾을 수 없음

.gitmodules 파일을 찾기 어려울 수 있습니다. 보통 이 파일은 숨김 파일(hidden file)입니다. 특정 OS의 문서를 확인하여 숨김 파일을 찾고 표시하는 방법에 대해 알아볼 수 있습니다.

만약 .gitmodules 파일이 없다면, 서브모듈 설정이 git config 파일에 있을 수 있습니다.

fatal: run_command returned non-zero status 오류

이 오류는 GIT_STRATEGYfetch로 설정되었을 때 서브모듈을 사용할 때 발생할 수 있습니다.

GIT_STRATEGYclone으로 설정하면 문제가 해결될 수 있습니다.