본문 바로가기
👾 Server/🏭 배포

Git Submodules를 활용한 secret, config 파일 관리, 배포 (feat. SpringBoot, GitHub Actions)

by kukim 2022. 7. 2.

잘못된 내용이나 다른 의견 있다면 편하게 말씀해주세요 🙏🏻

 

이전 글 secret, config 파일 관리 방법 소개(feat. SpringBoot의 application.*) 에서 소개한 방법 3 : Git Submodules를 활용한 방법 예제를 소개한다.

 

Git Submodules

Git Submodules란 저장소 안에 다른 저장소를 원하는 디렉토리를 복제하는 기능이다. 예를 들어 A,B 프로젝트에서 공통되게 사용하는 모듈(라이브러리, 설정 값 등) C가 있다고 하자. A,B,C 모두 저장소이다. 이때 A, B 저장소에 C 소스 코드가 중복될 수 있다. 이를 A,B 저장소에 C를 서브 모듈로 두어 공통되게 사용할 수 있다. C가 수정되면 A,B 모두 수정된 코드를 사용할 수 있다. (생활 코딩 : 저장소안에 저장소 - git submodules youtube)


Git Submodules를 활용한 배포 방법

1. GitHub private repo를 만들고 repo에 application.* 파일들을 넣는다. (private repo 권한이 있는 사람만 확인할 수 있다)

2. spring 프로젝트가 담겨있는 public repo에 설정 파일이 들어있는 private repo를 submoudles화 한다.

3. 프로젝트 빌드/배포할 때 submodules의 설정 파일들을 /src/main/resources으로 복사하여 사용한다.

4. 복사된 설정파일들은 .gitignore 파일로 push하지 않는다.

5. CI에서 사용한다면, private repo를 clone 할 수 있는 Github Key를 추가해준다.

 

장점

- 설정 파일을 별도의 저장소에서 관리할 수 있다.

- 로컬 개발할 때 별도의 환경변수 지정 없이 설정 파일을 그대로 사용할 수 있다.

- GitHub Actions와 연동이 쉽다.

 

단점

- private repo라고 해도 설정 값들이 암호화되어있는 것이 아니기에 private repo 노출 시 취약할 수 있다.


1. GitHub private repo를 만들고 사용할 설정 파일(application.* )을 넣는다. 

 

예제를 위해 해당 저장소는 public repo로 지정하였다. 스프링 프로젝트 설정 파일 repo link

실제 작업은 private repo로 설정한다. private repo 이기에 권한이 없는 사용자는 접근할 수 없다.

spring 설정 파일들


2. spring 프로젝트가 담겨있는 public repo에 설정 파일이 들어있는 private repo를 submoudles화 한다.

스프링 프로젝트 repo link

 

스프링 프로젝트

spring 프로젝트가 담겨있는 public repo에 Git Submodules 명령어를 사용하여 서브모듈을 추가한다.

// 서브 모듈 추가
git submodule add [git repo link] [dir 이름]
git submodule add git@github.com:ku-kim/springboot-config-files-in-gitsubmodules.git config

git submodule add 한 결과

git submodule add 명령을 사용하면 스프링 프로젝트에 설정 파일이 담겨있는 private repo의 저장소가 지정한 dir 이름으로 서브모듈과 .gitmodules 파일이 생성된다. 

자동 생성된 .gitmodules

.gitmodules 파일은 서브 모듈 정보를 나타낸다. path는 서브 모듈의 위치, 폴더 명을 나타내며 url은 서브모듈의 저장소 위치를 나타낸다.

branch 명령을 지정하여 서브 모듈의 특정 브랜치를 사용할 수 있다.

특정 브랜치를 서브 모듈화

이제 스프링 프로젝트를 GitHub에 push 하면 아래와 같이 서브 모듈 디렉토리가 연결된 형태를 볼 수 있다.

-> 로 표시된 서브모듈 디렉토리

+a) 서브모듈 명령어

# 참고 : https://pinedance.github.io/blog/2019/05/28/Git-Submodule
# 서브 모듈이 포함된 프로젝트를 clone 받아올 때 권한이 있다면, main repo를 클론하고 그 다음 sub repo를 클론한다.
git clone <repo>

# 이미 clone 받은 프로젝트 update (pull)
git pull # 메인 repo pull
git submodule update --remote --merge # 서브 모듈만 업데이트하여 머지하기

# 서브모듈 최신 상태 확인
git submodule status

 


3. 프로젝트 빌드/배포할 때 submodules의 설정 파일들을 /src/main/resources으로 복사하여 사용한다.

현재 설정 파일은 프로젝트 최상단 ./config 에 들어있다. springboot의 경우 /src/main/resources로 이동해야 한다.

gradle의 경우 build.gradle에 task를 추가하여 build, deploy 할 때 파일 명령을 추가해주면 된다. build.gradle 소스코드

# build.gradle 

# 중략

task copyGitSubmodule(type: Copy) {
	from './config'
	include '*.yml'
	into './src/main/resources'
}

4. 복사된 설정 파일을 .gitignore 파일로 push하지 않는다.

빌드할 때 설정 파일이 /src/main/resources로 이동된다. 이때 해당 설정 파일들을 .gitignore 설정하여 push 되지 않도록 지정한다.

# .gitignore

# 중략

### Git Submodule
src/main/resources/application-prod.yml
src/main/resources/application-test.yml

 


5. CI에서 사용한다면, private repo를 clone 할 수 있는 GitHub Key를 추가해준다.

서브 모듈이 private repo라면 접근 권한이 없는 사람은 해당 서브 모듈을 clone 할 수 없다.

GitHub Actions CI에서 배포 하려면 서브모듈을 받아야 한다. CI에서 서브모듈 접근권한을 위해 Github Actions 스크립트에서 clone 받을 수 있도록 GiHub Key를 추가한다.  (actions/checkout@v3)

# .github/workflows/*.yml

- name: Checkout repo
  uses: actions/checkout@v3
    with:
      token: ${{ secrets.GITHUB_TOKEN }}
      submodules: true

{{secrets.GITHUB_TOKEN}} 은 private repo의 접근할 수 있는 토큰을 넣어준다.


Reference

2022.07.01 - [👾 Server] - secret, config 파일 관리 방법 소개(feat. SpringBoot의 application.*)

스프링 프로젝트 설정 파일 repo link

스프링 프로젝트 repo link

Git Submodules docs

생활 코딩 : 저장소안에 저장소 - git submodules youtube

actions/checkout@v3 repo

Git submodules 사용하기

댓글