Git Submodule로 프로젝트 민감정보 관리

Woody의 기록·2023년 8월 19일
1

이전까지는 프로젝트의 민감정보를 gitignore 처리를 해서 아예 올리지 않고, 직접 파일을 로컬에 보관하는 식으로 관리했다. 그런데 최근데 github actions로 배포를 자동화하려고 하다보니, 레포지토리에 민감정보를 올리지않으면 빌드할 수 없다는 것을 깨닫게 되었다. 그래서 public 레포지토리에 민감정보를 올리지 않으면서도 CI/CD를 할 수 있도록 하려고 알아보던 중 git submodule이라는 것을 찾게되었다.

submodule가 민감정보를 관리하는 방식은 간단하다. 그냥 민감정보를 담은 설정파일 등을 별도로 관리하는 방식이다. Github Actions와의 연동도 쉽기 때문에 사용해보기로 하였다.

private repo를 서브 모듈로 등록하여 사용하면, 해당 서브 모듈 repo에 권한이 없는 사람은 부모 프로젝트를 클론해도 민감 정보를 조회할 수 없다.

서브 모듈은 결국 독립적은 깃 레포이기 때문에 직접 pull 해주어야 한다.

즉 부모 모듈에서 pull을 해도 서브 모듈의 최신 커밋을 받아오지 않는다. 부모 모듈은 본인의 프로젝트 최신커밋만 리모트에서 받아올 뿐이다.

서브모듈들은 각자의 독립적인 리모트가 존재하므로 서브 모듈의 최신화를 하기 위해서는 서브 모듈의 .git이 존재하는 위치로 이동해서 pull 해주어야 한다.

민감정보를 저장하는데 사용할 프로젝트 생성

우선 민감정보를 관리할 서브 모듈 Team7-Backend-Private 레포지토리를 만들어주었다.

Team7-Backend 프로젝트에서 서브모듈로 지정하여 사용할 것이다.

부모 프로젝트에 서브모듈 등록

아래 명령어로 부모 프로젝트 내에서 서브 모듈을 등록해준다.
<repository> 부분에 서브 모듈의 repo url을 넣으면 되고, <path> 부분에 서브모듈에 사용할 디렉터리 경로를 넣어주면 된다.

$ git submodule [--quiet] add [<options>] [--] <repository> [<path>]

서브 모듈 생성후 서브 모듈 리모트로 부터 pull 받아 최신 상태로 유지해준다.

 $ git pull origin main
From https://github.com/MusicVillains/Team7-Backend-Private
 * branch            main       -> FETCH_HEAD

$ ls  
README.md

생성된 서브모듈 디렉터리에 민감한 정보(application.yml)을 담아준 후 서브모듈 리모트에 push 해주었다.

부모 모듈에서도 서브 모듈을 추가했다는 변경사항을 커밋하고 리모트에 푸쉬해준다.

서브 모듈 레포지토리에 들어가보면 정상적으로 반영된 것을 볼 수 있다.

부모모듈의 디렉터리를 찾아가보면 서브모듈이 위치한 Private 디렉터리는 특별한 일반 디렉터리와 다르게 아이콘으로 표시되는 것을 볼 수 있다

이제 빌드시 해당 파일을 스프링이 인식할 수 있는 위치로 옮긴 후에 빌드하도록 해줘야 한다. 현재는 Gradle을 사용하고 있기 때문에 build.gradle에 applicaiton.yml 파일을src/main/resources 아래로 복사하는 테스크를 추가해 주었다.

# build.gradle

task copyApplicationYml(type: Copy) {
	from './src/main/java/com/teamseven/MusicVillain/Private'
	include '*.yml'
	into './src/main/resources'
}

Reload All Gradle Project를 눌러준 후 인텔리제이에서도 확인해보면

직접 추가해준 task가 other 밑에 추가된 것을 볼 수 있다.

서브 모듈의 최신 커밋을 반영하기 위해 아래 명령어를 사용한다.

git submodule update --remote

위 명령어를 실행한다고 부모 모듈 바로 적용되는 것이 아니다.

받아온 최신 커밋을 기준으로 적용한 후 부모 모듈에 푸쉬해주려면 다음 과정을 수행해주면 된다.

git submodule foreach git pull 

git add. 
git commit
git push

서브모듈의 최신 커밋을 받아오고 변경사항까지 저장소에 반영하고 싶다면 아래 명령어로 한번에 해줄 수도 있다.

git submodule update --init --recursive

git submodule update --remote {리모트 레포지토리 이름} --merge을 하면 특정 서브 모듈만 update 한다

git submodule update --init은 현재 부모 모듈에에 서브 모듈로 link 되어 있는 레포의 정보를 가져와 update 한다

Troubles


서브 모듈을 등록했지만 프로젝트 루트 경로에 .gitmodules 가 생성되지 않아 인식하지 못하는 문제.

$ git submodule update --init                                                                  127 err | 18:47:06 
fatal: No url found for submodule path 'src/main/java/com/teamseven/MusicVillain/Private' in .gitmodules

서브모듈의 내용을 가져오기 위해 git submodule update --init 명령어를 실행하였다.

gitmodules 를 find로 찾아보니 아예 생성되지를 않았다.

find .gitmodules
find: .gitmodules: No such file or directory.

프로젝트 루트 디렉토리 밑에 .gitmodules를 아래와 같이 작성하여 직접 생성해주었다.

[submodule "Private"]
    path = src/main/java/com/teamseven/MusicVillain/Private
    url = https://github.com/MusicVillains/Team7-Backend-Private

다시 시도해보니 이제 정상적으로 서브모듈이 프로젝트에 연결되었다.

$ git submodule update --init
Submodule 'Private' (https://github.com/MusicVillains/Team7-Backend-Private) registered for path 'src/main/java/com/teamseven/MusicVillain/Private'

프로젝트 레포에서도 직접 확인해보니 서브 모듈을 잘 인식하고 있음을 볼 수 있다.

아까는 해당 서브모듈에 권한이 있음에도 눌러도 이동되지 않았고 서브모듈의 커밋 해시도 보이지 않았는데, 이제는 잘 이동된다.

profile
Github - https://www.github.com/woody35545

1개의 댓글

comment-user-thumbnail
2023년 8월 23일

신기하네요 !! :0
Submodule의 코드만 이전 버전으로 복구할 수 있나요?

답글 달기