영권's
깃 서브모듈 사용하기 본문
이번에 작은 프로젝트를 하면서 깃헙 레포를 public으로 관리하게 되었는데 민감정보들을 어떻게 해야될까? 라고 고민하면서 그 중 가장 쉽게 할 수 있을것 같았던 서브모듈을 private으로 구성하고 거기서 민감정보에 대한 설정 파일들을 관리하고 프로젝트 빌드 시 gradle에서 해당 파일들을 읽고 resources 위치에 카피 후에 사용할 수 있도록 해보았습니다.
Git의 서브모듈은 Git 저장소 안에 다른 Git 저장소를 디렉토리로 분리해 넣는 것이 서브모듈이다.
서브 모듈 생성하는 방법은 먼저 서브모듈에 해당하는 레포지토리를 깃헙에서 private으로 생성 후 상위 모듈에서 아래와 같은 명령어를 통해 서브모듈로 등록할 수 있다.
$ git submodule add https://github.com/choiyoungkwon12/test-submodule-repo.git
위에서는 test-submodule-repo라는 레포지토리를 만들고 서브모듈로 등록해주었다.
이런 명령어를 수행하고 git status를 실행하면 .gitmodules, test-submodule-repo 이 추가된 것을 볼 수 있는데 .gitmodules는 서브디렉토리와 하위 프로젝트 URL의 매핑 정보를 담은 설정파일이다.
브모듈 개수만큼 이 항목이 생기고 이 파일도 .gitignore 파일처럼 버전을 관리한다. 다른 파일처럼 Push 하고 Pull 한다. 이 프로젝트를 Clone 하는 사람은 .gitmodules 파일을 보고 어떤 서브모듈 프로젝트가 있는지 알 수 있다.
Git은 test-submodule-repo 디렉토리를 서브모듈로 취급하기 때문에 해당 디렉토리 아래의 파일 수정사항을 직접 추적하지 않는다. 대신 서브모듈 디렉토리를 통째로 특별한 커밋으로 취급한다.
이게 무슨뜻이냐면
처음에는 원격 저장소에 있는 README.md만 존재한다.
그 뒤에 application.properties 라는 파일을 추가 후 서브모듈에서 커밋을 해주었다.
그리고 push를 하면 해당 커밋이 깃헙에 잘 올라간다.
그리고 나서 상위 모듈에서 가지고 있는 서브모듈을 보면 가장 최신 커밋 해시 값은 1f93424인데 커밋 해시 값을 8fe4b35를 가르키고 있는 것을 볼 수 있다.
실제로 들어가보면 서브모듈의 최신 커밋을 가르키는게 아니라 예전 커밋을 가르킨다.
이것이 서브모듈 디렉토리를 통째로 특별한 커밋으로 취급한다. 라고 하는 것이다.
다시 로컬로 돌아가서 상위 모듈에서 git status를 보면
test-submodule-repo라고 하는 서브모듈 디렉토리가 새로운 커밋을 했다고 나오는 것을 볼 수 있다.
해당 변경사항을 커밋 후에 푸시를 해주면 서브모듈을 가장 최신버전으로 잘 가르키게 된다.
그러면 프로젝트 민감정보에 대한 설정을 서브모듈에 넣고 빌드 할 때 해당 파일을 resources 디렉토리에 복사해서 사용할 수 있습니다.
build.gradle에서 task를 만들어서 processResources.dependsOn("task")을 통해 작업 종속성을 만들어주면 build시에 from에 있는것을 읽어서 into에 해당하는 경로로 Copy를 해준다.
실제로 빌드했을 때 copyConfigSettings task가 실행되는 것을 볼 수 있고 해당 파일을 지운 상태에서 실행했는데 into에 해당하는 경로에서 복사해서 resources에 가져온 것을 알 수 있다.
그래서 이번 프로젝트 때 github action을 통해서 CI를 구성했는데 CI 서버에서 사용할 수 있는 설정 파일들을 private인 서브모듈에 넣어놓고 build 할 때 해당 경로로 복사해서 사용되게끔 했었다.
이 과정에서도 오류가 있었는데 간단하게 적어보면 github action checkout은 v2.0부터는 하위 모듈에 해당하는 것까지 읽어오는 것이 아니라 체크아웃중인 커밋만 가져오게 된다.
그래서 처음에 github action에서 해당 파일 자체를 가져오지 못했는데 서브모듈 레포지토리에 대한 체크아웃 설정을 추가해주니 바로 사용할 수 있었다.
관련 참고 Issue : https://github.com/actions/checkout/issues/116
참고 : 서브모듈
'GIT & GITHUB' 카테고리의 다른 글
GIT 익숙해지기 - 2.2 (수정하고 저장소에 저장하기) (0) | 2021.07.26 |
---|---|
GIT 익숙해지기 - 2.1 (Git 저장소 만들기) (0) | 2021.07.22 |
GIT 익숙해지기 - 1.2 (Git 기초) (0) | 2021.07.21 |
GIT 익숙해지기 - 1.1 (버전 관리란) (0) | 2021.07.19 |