본문 바로가기
공부/CI & CD

배포 환경과 설정 파일 분리를 위한 작업) Private Repository 만들기 + Submodule 설정

by son_i 2024. 6. 29.
728x90

DB에 접속하려면 DB 연결 정보가 담긴 설정파일이 필요한데 이 설정 파일을 비공개로 만들기 위해

1. 별도의 Private Repository를 두어 설정 파일을 관리한다. 

2. Main Repository에서 Private Repository를 Submodule로 참조한다.

 

-> 즉, 설정 파일을 별도의 Private Repository에 업로드 하되, 프로젝트의 메인 레포지토리와 연동하기 위해 Submodule을 이용한다는 것 !

 

  * Submodule
Git 저장소 안에 다른 Git 저장소를 디렉토리로 분리해 넣는 것을 말한다.
서브 모듈을 이용하면 독립된 Git 저장소를 Clone 하여 다른 Git 저장소 안에 포함할 수 있으며 각 저장소의 커밋은 독립적으로 관리 된다.

 

작업 과정

1. 설정 파일을 관리할 Private Repository 생성

  • 이 때 Repository의 이름은 반드시 config로 생성해야 SpringBoot에서 설정파일임을 인식할 수 있다.
  • Add a README file에 체크하자 (안 해도 됨)
  • Private 체크
  • Private Repository 이름 == 서브 모듈 디렉토리 이름이므로 반드시 레포 이름 config로 생성

 

2. Private Repository의 HTTPS 주소 복사하고 IntelliJ 터미널에 명령어 입력해 Submodule 추가

$ git submodule add {복사한 Private Repository 주소} {Directory}


설정 파일은 원칙적으로 src/main/resources에 위치해야 하기 떄문에 서브 모듈 설정에 HTTPS 주소에
resources 경로를 추가해준다.

$ git submodule add https://github.com/soeun135/config.git src/main/resources/config

 

 

정상적으로 실행 됐다면 아래와 같은 .gitmodules 파일이 생성되고 resources 안에 내가 지정한 config 이름으로 서브 모듈 레포지토리 디렉토리도 생성된다.

 

 

3. 깃허브 레포지토리에서 확인

main 브랜치에 변경 사항을 merge 하면 깃허브 레포지토리에서 .gitmodules로 서브 모듈 레포지토리의 정보를 볼 수 있고

좌측에 main/resources/config로 서브 모듈에 연결된 것을 확인 할 수 있다.

 

 

4. Submodule 디렉토리 하위에 배포 환경에서 사용할 application-prod.yml 설정 파일 작성

4-1. 서브 모듈 디렉토리로 이동

 

4-2. 아래 명령어를 차례로 입력해 DB 접속 정보가 담긴 application-prod.yml 을 Private Repository에 push 한다.

$ git status // 작업 디렉토리(wo //rking directory)와 스테이지 영역(staging area)의 상태 확인
$ git add . // .을 붙이면 현재 디렉토리의 모든 변경 내용을 스테이징 영역으로 넘긴다.
$ git comit -m 'DB 접속정보 담긴 설정파일 업로드' // 커밋 메세지를 작성하여 local repo에 올린다.
$ git push // local repo의 변경사항들을 remote repo에 올린다.

 

  • Changes to be committed : 스테이징 영역에 넘어가 있는 변경 내용
  • Changes not staged for commit : 아직 워킹디렉토리에 있는 변경 내용
  • Untracked files : 아직 워킹디렉토리에 있는 아직 한 번도 GIt 저장소가 관리한 적 없는새로운 파일.

 

서브 모듈인 private repository에 application-prod.yml이 잘 업로드 된 것을 확인했다.

 

5. deploy.sh 에 jar 실행 시 application-prod.yml 참조하도록 수정

스프링부트 프로젝트의 classpath(resource 하위)에 있는 파일 사용할 때
--spring.config.location=classpath:/application-prod.yml

  * classpath 붙으면 jar안에 있는 resources 디렉토리 기준 경로 생성

스프링부트 프로젝트 외 ec2내에 별도로 존재하는 파일 사용할 때
,/home/ec2-user/~~ 파일경로

참조 : https://docs.spring.io/spring-boot/reference/features/external-config.html#features.external-config

 

Externalized Configuration :: Spring Boot

By default, SpringApplication converts any command line option arguments (that is, arguments starting with --, such as --server.port=9000) to a property and adds them to the Spring Environment. As mentioned previously, command line properties always take p

docs.spring.io

 

나는 resources 아래에 있는 application-prod.yml을 사용해줄 것이기 때문에 아래와 같이 수정하였다.

 

6. 메인레포에 서브모듈 변경사항 push 

Main Repo에서 Private Repo의 Comit Hash 값을 참조하는 구조이기 때문에 자동으로 동기화 되지 않는다.

 

4에서 Private Repo가 업데이트 되어 새로운 Commit Hash 값을 가지지만 Main Repo는 여전히 이전 Commit Hash 값을 참조하고 있다. 따라서 동기화해주는 작업이 필요하다.

 

PR을 생성한다. 

 

 

서브모듈 설정 파일과 수정된 deploy.sh 커밋이 담긴PR을 merge한다.

(merge하기 전까진 config파일에 암 ~ 것도없음)

 

 

아래에는 Trouble Shooting을 정리하였습니다.

 

서브 모듈 설정을 배포 서버에서 읽지 못 하는 문제 해결 (tistory.com)

 

서브 모듈 설정을 배포 서버에서 읽지 못 하는 문제 해결

'배포 환경과 설정 파일 분리를 위한 작업) Private Repository 만들기 + Submodule 설정' 수정하기 (tistory.com) Tistory좀 아는 블로거들의 유용한 이야기www.tistory.com ec2에 jar 파일을 배포하였는데 실행이

soni-developer.tistory.com

 

문제 해결을 거쳐 CD_WorkFlow를 수정해주고

build/src/main.resources/config 아래 yml 설정 파일들이 들어온것을 확인했다 !!!!!