이번 프로젝트를 진행하면서 깃허브에 올리지 못하는 중요 정보를 담은 파일을 관리하는 방법으로 Git Submodule을 적용해본 과정을 설명하려고 한다.
프로젝트를 진행하며 application.yml 같은 설정 파일에는 데이터베이스 접속 정보, 비밀 키 등의 민감한 정보를 저장하게 된다. 이러한 정보는 보안상의 이유로 공개 리포지토리에 직접적으로 포함시키지 않는 것이 일반적이다. 대신, .gitignore 파일을 활용하여 이러한 민감한 정보를 포함한 파일들이 Git 리포지토리에 포함되지 않도록 설정한다.
그럼에도 불구하고, 이러한 접근 방식은 배포 과정에서 설정 파일들을 추가로 다루어야 하는 번거로움을 야기한다. 예를 들어, 다음과 같은 방법들을 고려해볼 수 있다.
이러한 이유로 많은 프로젝트에서는 Git Submodule을 선택하여 중요 정보를 안전하게 관리하고 있다.
Git Submodule은 프로젝트의 특정 부분을 별도의 Git 리포지토리로 분리하여 관리할 수 있게 해주는 기능이다. 이는 외부에 노출되어서는 안 되는 정보를 관리하거나, 여러 프로젝트 간에 공통으로 사용되는 라이브러리와 같은 자원을 효율적으로 관리할 때 유용하다.
Git Submodule을 사용하면 메인 프로젝트(부모 리포지토리) 하위에 다른 Git 리포지토리(자식 리포지토리)를 디렉토리 형태로 포함시킬 수 있다. 이렇게 하면 메인 프로젝트의 일부로서, 동시에 독립적인 버전 관리가 가능한 자식 프로젝트를 유지할 수 있다. 결과적으로, 중요한 정보가 담긴 설정 파일이나 공통 라이브러리를 보다 안전하고 효율적으로 관리할 수 있게 된다.
Git Submodule을 활용함으로써, 개발자는 프로젝트의 구조를 더욱 명확하게 관리할 수 있으며, 민감한 정보의 보안 유지 및 여러 프로젝트 간의 의존성 관리에 있어서 높은 유연성과 효율성을 얻을 수 있다.
중요 정보를 저장할 Private Repository를 생성한다.
생성한 Private Repository에 파일들을 저장한다.
git submodule add -b main ${서브모듈 repo URL} ${디렉토리}
메인 모듈에 서브 모듈을 추가해주는 명령어이다.
해당 명령어를 수행시 자신이 지정한 디렉토리에 서브모듈 파일들이 생성되고 해당 정보들은 .gitmodules 파일에서 관리 된다.
생겨난 파일들은 경로를 이용하여 application.yml 파일에서 사용하도록 하면 된다.
서브모듈 설정 과정을 처음 수행하는 것이 아니라, 서브모듈이 설정되어 있는 프로젝트를 클론하는 경우, 서브모듈을 담고 있는 프로젝트는 비어 있다. 그래서 아래 명령어로 서브모듈을 불러오면 된다.
git submodule init
해당 명령어로 서브모듈 정보를 기반으로 로컬 환경설정 파일 준비한다.
git submodule update
해당 명령어로 메인 레포지토리가 기억하는 submodule의 특정 커밋 시점으로 업데이트한다.
또는
git clone --recurse-submodules ${메인모듈 repo URL}
명령어로 메인모듈을 클론할 때 서브모듈까지 한 번에 클론할 수 있다.
메인 리포지토리의 각 브랜치들은 서브모듈의 커밋 로그를 “체크포인팅”하여 해당 정보를 통해 서브 모듈의 데이터를 가져와 사용한다. 이 때문에 서브모듈의 변경이 있어도 메인 리포지토리에서 변경 내용이 적용되지 않는다. 그래서 서브 모듈의 변경이 있을 경우, 메인 모듈에서 서브 모듈을 업데이트해주어야 한다.
git submodule update --remote --merge
git push
이 명령어를 이용해 메인 모듈에서 서브 모듈을 업데이트해주고, 변경 사항을 원격 저장소에 반영해야 한다.
Github Action에서 사용하기 위해서는 Github Action이 private 저장소에 접근할 수 있도록 token 설정이 필요하다. token 설정 방법은 다른 게시글에서 자세히 다루고 있다. 여기서는 간단히 해당 게시글을 추천한다.
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
token: ${{ secrets.ACTION_TOKEN }}
workflow을 수정하여 Github Action에 적용할 수 있다. checkout 기능을 이용해서 submodules을 recursive하게 불러올 수 있다.
Jenkins에서도 private 저장소에 접근하기 위해서 token 설정이 필요하다.
해당 사진과 같이, Credentials에 추가하여 준다. 해당 과정은 아래 블로그를 참고하는 것이 좋다.
[DevOps] Jenkins를 통한 CI/CD 구축기 4편 (Backend DB 구축)
stage('Git Clone') {
steps {
git branch: BRANCH, url: 'https://github.com/joon6093/O2O_Automatic_Store_System_Demo.git'
withCredentials([GitUsernamePassword(credentialsId: 'submodule_security_token', gitToolName: 'Default')]) {
sh 'git submodule update --init --recursive'
}
}
}
해당 코드를 이용해서 서브모듈의 파일을 함께 클론할 수 있다.
Git Submodule을 활용함으로써, 중요 정보를 안전하게 보호하고 프로젝트를 보다 효율적으로 진행할 수 있는 방법을 소개했다. 이 방법을 통해 설정 파일과 같은 민감한 정보를 관리하는 동시에, 프로젝트의 유지 관리에 있어 필요한 유연성과 효율성을 제공할 수 있기 때문에 앞으로도 프로젝트를 진행할 때 해당 방법을 사용할 계획이다.