서브 모듈 프로젝트에 적용하기 by 완태 - woowacourse-teams/2021-gpu-is-mine GitHub Wiki
2021-gpu-is-mine 레포를
프로젝트
, private-configuration 레포를서브모듈
로 칭하겠습니다!
프로젝트 clone 하기
git clone 프로젝트.git
=> 서브모듈의 내부는 emptygit 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는 프로젝트가 가르키고 있는 서브모듈의 특정 커밋의 해시값)
그렇기 때문에, 서브모듈을 업데이트 했을 때 이를 반영하기 위해서는, 프로젝트도 가르키고 있는 서브 모듈의 커밋값을 수정해줘야함.(사실 이 부분은 git에서 파일 수정처럼 진행되고 프로젝트에서 commit으로 진행됨. 아래에서 순서를 작성해보겠음)
- (서브 모듈 폴더 내부에서) 서브 모듈을 수정하고, 커밋 한다. (다른 사람이 수정한 부분이더라도, 서브 모듈 폴더 내부에서 pull을 땡겨서 작업할 수있다.)
- (서브 모듈 밖 프로젝트 폴더에서) 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)
2번째 옵션으로 들어가 있는 부분을 추가적으로 설명하면
Update tracking submodules to tip of branch
이 옵션을 설정하게 되면, clone을 해올시 submodule의 가장 최신 커밋을 가지고 온다라는 것으로 보인다.
git clone --recurse-submodules --remote-submodules
와 같은 기능을 하는 것으로 보여서 궁금한 분은 검색해보면 좋을 것 같습니다.
참고 자료: 근본 Git Docs