Skip to content

서브모듈 적용기

joanne edited this page Jul 18, 2021 · 11 revisions

1. 서브모듈이 될 repo 만들기


서브모듈을 관리할 Private 저장소 추가

1

Private 레포에 필요한 파일 생성

2

2. 메인 프로젝트에 서브모듈 추가하기

  • backend/src/core/main/resources/dev 디렉토리에 서브모듈을 넣고싶은 상황

메인 프로젝트에서 Terminal 실행

cd backend/src/core/main/resources
git submodule add -b master [https://github.com/botobo-team/dev.git](https://github.com/botobo-team/dev.git) dev

  • 서브모듈을 만들기 싶은 경로(resources)로 가서 dev라는 서브모듈을 만들었다. 메인 프로젝트의 Repo에 서브모듈이 추가된 것을 확인할 수 있다.

3


3. 젠킨스 설정

4

Source Code Management 구간

  • 아래 두가지를 추가한다. (소스코드 레포지토리와 서브모듈 모두에 권한이 있는 계정을 사용하는 것을 추천한다.)
  • 이미 젠킨스를 사용하여 CI/CD를 구축한 상태라면 이 두 정보는 이전에 추가했을 것이다.
  1. 서비스의 코드가 있는 레포지토리 정보
  2. 그 레포지토리에 권한이 있는 계정 정보

조금 아래에 있는 Additional Behaviours에서 Add를 누르고 Advanced sub-modules behaviours를 선택한다. 서비스 코드 레포지토리에 서브모듈이 있을 경우, 젠킨스에서 빌드할 때 추가 옵션을 선택하게 해주는 기능이다.

5


아래의 사진에서 보이는 세 체크 박스를 선택한다. 체크 박스의 의미는 다음과 같다:

  1. 레포지토리에 있는 서브모듈 모두 업데이트 (서브모듈을 pull하겠다는 의미)
  2. 업데이트 할 때 서브모듈이 바라보고 있는 브랜치의 가장 최신 커밋을 가지고 오기
  3. 서브모듈 레포지토리의 권한을 확인할 때 서비스 코드 레포지토리 권한 계정 사용 6

4. 서버

7
  • 서버의 애플리케이션 실행 스크립트에 설정 파일 경로를 명시하는 플래그 추가
  • 위와 같이 설정하고 새로운 빌드를 실행시켜보자.
  • 젠킨스가 새로운 jar 파일을 빌드할 때마다 서브모듈의 변경사항을 확인하고, 변경된 부분이 있을 경우 자동으로 반영해줄 것이다.
  • 여기서 명심해야할 것은 서브모듈이 있는 Private 저장소에 push를 해도 메인 프로젝트의 서브모듈은 이전 커밋을 바라보고 있기때문에 젠킨스 배포가 시작되지 않는다. (2021-botobo는 변화하지 않았기 때문)
  • 젠킨스 배포를 시작하려면 서브모듈의 변화를 git submodule update --remote --merge의 명령어를 통해 메인 프로젝트로 가져온 뒤 push 해야한다.

5. 앞으로 프로젝트에서 서브모듈 활용법

  • 이미 메인프로젝트의 develop의 서브모듈관련 설정은 되어있다.
  • 하지만 자신의 로컬에 서브모듈 설정이 되어있지 않은 팀원들은 간단한 설정을 해야한다. (pull을 한다고해서 서브모듈의 데이터는 가져와지지 않는다.)

데이터를 가져오는 상황

로컬에 서브모듈이 처음이라면 git submodule update --init --remote

이후 서브모듈의 정보를 가져오고 싶다면 git submodule update --remote --merge (merge를 꼭 붙이자!)



데이터 푸시하는 상황 (로컬에서 서브모듈 안의 내용을 수정하는 경우)

1. 메인 프로젝트의 경로에서 싱크를 맞춘다.

git submodule update --remote --merge

2. 서브모듈 안의 내용을 수정한다.

3. 로컬에서 서브모듈의 경로로 이동하여 커밋, 푸시한다. (Private 레포의 서브모듈에 직접 푸시하는 것)

cd backend/src/main/resources/dev

4. 로컬의 메인프로젝트의 경로로 이동하여 커밋, 푸시한다. cd .. (2021-botobo 레포에 푸시하는 것)

클론하는 상황

git clone —-recurse—submodules https://xxxx.git

서브모듈이 최상위에 있을 때

build.gradle에 다음 내용을 작성한다.

task copyDev(type: Copy) {
    from '../dev/application-dev.yml'
    into './src/main/resources'
}

build {
    dependsOn copyDev
}

git에 남아있는 캐시를 확인할 때

https://stackoverflow.com/questions/4185365/no-submodule-mapping-found-in-gitmodule-for-a-path-thats-not-a-submodule/13394710#13394710

Clone this wiki locally