서브 모듈 프로젝트에 적용하기 by 완태 - woowacourse-teams/2021-gpu-is-mine GitHub Wiki

2021-gpu-is-mine 레포를 프로젝트, private-configuration 레포를 서브모듈로 칭하겠습니다!

프로젝트 clone 하기

  • git clone 프로젝트.git => 서브모듈의 내부는 empty
  • git clone --recurse-submodules 프로젝트.git => 서브모듈까지 모두 clone (서브모듈이 private repo일 경우 권한 필요-> github action의 ACCESS_TOKEN이 이때 필요)
  • 이미 clone 된 프로젝트의 경우 git submodule update --init = git submodule init + git submodule update

서브모듈 수정하고 반영하기

각 프로젝트 git은 그 서브모듈의 특정 시점을 기록하여 두고, 위의 방식으로 clone시 그 시점의 submodule을 가지고 옴(아래 사진을 봤을 때 @ 9049b4c는 프로젝트가 가르키고 있는 서브모듈의 특정 커밋의 해시값) submodule 그림

그렇기 때문에, 서브모듈을 업데이트 했을 때 이를 반영하기 위해서는, 프로젝트도 가르키고 있는 서브 모듈의 커밋값을 수정해줘야함.(사실 이 부분은 git에서 파일 수정처럼 진행되고 프로젝트에서 commit으로 진행됨. 아래에서 순서를 작성해보겠음)

  1. (서브 모듈 폴더 내부에서) 서브 모듈을 수정하고, 커밋 한다. (다른 사람이 수정한 부분이더라도, 서브 모듈 폴더 내부에서 pull을 땡겨서 작업할 수있다.)
  2. (서브 모듈 밖 프로젝트 폴더에서) git status를 쳐보면, 서브모듈명(new commit) 가 나온다. 이를 git add, commit, push하면 반영된다.

한가지 추가 하겠습니다. git clone 해온 상태에서는 HEAD detached at 30447ac와 같이 특정 커밋값을 가르키고 있습니다. 즉 특정 branch를 트랙킹하지 않고 있습니다. 만약 최신의 브랜치의 커밋으로 update 하기 위해서는 git checkout main을 진행하고 나서 진행해야 합니다.

서브 모듈 내부에서 작업을 하고, 이를 또 밖에서 한번더 진행한다 정도가 된다.

배포에 적용하기

위에서 설명했듯이, 기존의 clone으로는 서브모듈의 내부값을 못가지고 온다. 우리가 사용하는 github action, jenkins는 이러한 경우를 편리하게 할 수 있는 방법들을 제공한다.

Github Action

간단하게 checkout의 option을 추가해주면 된다. submodule의 깊이가 1인 경우면 submodules: true로 충분하고, submodule안에 submodule이 있는 구조의 경우 submodules: recursive옵션을 넣어주면 된다. 아래 token private repo의 권한이 있는 사용자의 토큰을 넣어주어야 한다.(현재 Wannte의 토큰이다.) secrets.ACCESS_TOKEN 같은 경우에는 github 레포 자체적으로 settings->secret 에 별도로 넣어두고 공개하지 않고 사용할 수 있다.

      - uses: actions/checkout@v2
        with:
          submodules: true
          token: ${{ secrets.ACCESS_TOKEN }}

Jenkins

젠킨스는 사용하면서 매번 느끼지만, 있을만한가? 하는 기능들은 다 이미 적용되어 있다. 아래의 설정을 진행해주면 된다.(Source Code Management-> Add Behavior)

jenkins-submodue

2번째 옵션으로 들어가 있는 부분을 추가적으로 설명하면 Update tracking submodules to tip of branch 이 옵션을 설정하게 되면, clone을 해올시 submodule의 가장 최신 커밋을 가지고 온다라는 것으로 보인다. git clone --recurse-submodules --remote-submodules와 같은 기능을 하는 것으로 보여서 궁금한 분은 검색해보면 좋을 것 같습니다.

참고 자료: 근본 Git Docs