민감한 정보들을 private하게 관리하는 방법 중 .bash_profile을 설정을 통해 시스템 환경 변수를 사용하는 방법이 있습니다. 이 방법은 각각의 팀원 마다 운영체제 환경이 다를 수 있고, 또 시스템의 전체 환경변수를 건들이는 것으로 다른 프로젝트, 다른 프로그램에 영향을 끼칠 수 있습니다.
이번에는 색다른 방법으로 GitHub Submodule로 private하게 민감한 정보들을 관리하는 방법을 알아보겠습니다.
프로젝트를 진행하다보면 다른 프로젝트를 함께 사용해야하는 경우가 종종있습니다. 외부에서 개발한 라이브러리나 여러 프로젝트에서 공통으로 사용할 라이브러리일 수도 있습니다. 이러한 경우에 각각의 프로젝트를 별개로 다루면서도 하나를 다른 하나 안에서 사용할 수 있어야합니다.
외부 라이브러리를 사용한다고 했을 때, 라이브러리를 사용하려면 라이브러리 관리 도구를 사용하여 Shared 라이브러리 형태로 쓰거나, 직접 라이브러리의 소스코드를 복사해서 쓰거나해야합니다.
Shared 라이브러리는 모든 환경에 라이브러리가 설치되어있어야하고, 프로젝트에 맞게 수정하고 배포하기가 어렵습니다.
라이브러리 코드를 프로젝트에 직접 포함시키는 경우에는 라이브러리가 업데이트 됐을 때 Merge하기가 어렵습니다.
Git submodule은 이러한 문제를 다루는 도구입니다. 다른 독립된 Git 저장소를 하나의 저장소에 포함시킬 수 있으며 각 저장소의 커밋은 독립적으로 관리하게 해줍니다.
Git submodule을 활용하면 private한 Git hub 저장소에 민감한 정보들을 넣어두고, submoudle의 repository에 접근할 수 있는 권한이 있는 사람만 민감 정보들을 가져올 수 있도록 할 수 있습니다.
이제 Submodule을 어떻게 등록하고 사용하는지 알아보겠습니다.
먼저 private한 git repository를 만듭니다.
저는 하나의 organization을 만들었고 그 곳에 private한 repository를 만들었습니다. 그리고 아래와 같이 먼저 따로 관리할 민감 정보들을 넣어놨습니다.
이제 본 프로젝트(메인 모듈)로 돌아가 방금 생성한 private repository를 submodule로 등록하면 됩니다.
터미널을 실행하고 아래 명령어를 입력해줍니다.
git submodule add [https://github.com/instakyuram/instakyuram-config.git](https://github.com/instakyuram/instakyuram-config.git)
그럼 아래와 같이 .gitmodule 파일 생성과 함께 submodule이 등록되며 클론이 됩니다.
⚠️ .gitignore을 수정해줘야합니다..gitignore에 불러온 파일들을 등록해 더 이상 메인 프로젝트의 원격 저장소에 민감정보들이 올라가지 않도록 해야합니다.
application-real.yml
application-real.yaml
Submodule에 대한 변경사항이 있다면 서브모듈의 저장소에 먼저 커밋하고 푸쉬해야합니다. 그 후 메인 프로젝트에 커밋/푸쉬를 해야합니다.
메인 모듈을 먼저 커밋한다면 서브모듈의 변경사항을 추적하지 못하게 되어 문제가 발생할 수 있습니다.
기껏 서브 모듈 커밋을 먼저 했더라도 메인 모듈 push를 먼저한다면 문제가 발생합니다.
다음과 같은 명령어로 서브모듈을 먼저 push하고 메인 모듈을 push할 수 있도록 합니다.
#submodule이 모두 push된 상태인지 확인하고, 확인이 되면 main project를 push
git push --recurse-submodules=check
# submodule을 모두 push하고, 성공하면 main project를 push
git push --recurse-submodules=on-demand
또한 디폴트 push명령어에 옵션을 주어 별도의 명령어를 추가하지 않아도 check하거나 순서를 제어할 수 있습니다.
# push시에 항상 check
git config push.recurseSubmodules check
# push 시에 항상 서브 모듈을 push
git config push.recurseSubmodules on-demand
서브모듈이 포함된 메인 모듈을 클론받았을 때 처음 initializing 작업을 해주어야 합니다.
# 서브모듈 이니셜라이징
git submodule init
# 서브 모듈 업데이트
git submodule update
# 모든 서브모듈에서 main으로 checkout 합니다.
git submodule foreach git checkout main
처음 한번만 위의 작업을 해주고 다음 변경 사항을 불러오려면 다음 명령어를 사용합니다.
# 메인프로젝트 루트에서
git submodule update --remote --merge
마지막으로 환경 변수 설정을 해줍니다
환경 변수 파일 설정 를 참고하세요