본문 바로가기
Develop/etc

[Git] 서브 모듈로 중요한 설정 정보 숨기기

by 연로그 2022. 7. 21.
반응형

❗ 서론

 

 예전에 OS 환경 변수를 이용해 중요한 설정 정보를 숨기는 방법에 대해 포스팅했었다. (바로가기 링크 👉 https://yeonyeon.tistory.com/234) 이 방법은 값이 변경될 때마다 직접 배포 서버에 들어가 OS 환경 변수 수정이 필요하다는 점이 너무너무 귀찮다. 이를 개선하기 위해 깃의 서브 모듈이라는 개념을 이용해보았다.

 

 

OS 환경 변수로 중요한 설정 정보 숨기기

🤗 서론  중요한 설정 정보들이 담긴 파일은 공개되면 안된다. 이를 숨김 처리 하는 방법은 여러가지가 있다. Vault, AWS에서 지원해주는 Systems Manager Parameter Store 등 여러 서비스를 활용할 수 있

yeonyeon.tistory.com

 

 


❓ 서브 모듈이란?

: 레포지토리 안에 또다른 레포지토리를 디렉토리로 분리해 넣은 것

 

🤔 언제 쓸 수 있을까?

  • 라이브러리의 소스 코드를 직접 프로젝트에 포함시켜야 하는 경우
  • 프로젝트 하나에 하위 프로젝트를 여러개 가져야하는 경우

 

 


😃 서브 모듈로 중요한 설정 정보 숨기기

 

1. 중요한 설정 정보를 가진 레포지토리 생성

  • 외부에 공개되면 안되는 정보이니 private repository로 생성
  • 팀 단위로 작업하는 프로젝트의 경우 organizations를 생성하면 팀 단위 private repository 생성 가능

 

🔻 organizations를 생성하는 방법

더보기
  • github profile image 클릭 - Your organizations - New organization

 

  • 생성한 organization 접속 - People - Invite member - 팀원들 초대

 

 

private repository 생성 화면
private repository에 설정 파일 생성

 

 

2. 프로젝트에 서브 모듈 추가

  • 서브 모듈을 추가하고 싶은 위치로 이동

  • 서브 모듈 추가
$ git submodule add <서브모듈로 추가할 git repository 주소> <폴더명>

 

  • 생성된 .gitmodules와 폴더명 파일 commit & push

 

 

3. 서브 모듈에 있는 파일 사용

  • application.yml의 정보를 서브 모듈에 있는 yml 파일을 이용하도록 수정
  • ex: 서브 모듈을 통해 생성한 security 폴더 내의 application.yml 파일 사용
spring:
  config:
    import:
      - classpath:/security/application.yml

 

생성된 서브 모듈
👈 접근 권한 없는 사람이 접근하는 경우 / 👉 접근 권한 있는 사람이 접근하는 경우

 

 


😜 주의사항

 

  • Jenkins 같은 CI/CD 툴을 이용할 때 서브 모듈에 있는 파일이 필요할 수도 있다. 이 경우 서브 모듈에 접근할 수 있는 권한을 줘야한다. (ex: Jenkins의 경우 credentials를 추가해주면 간단하게 해결된다.)

  • 서브모듈에 변경 사항이 생기면 메인 프로젝트보다 먼저 push / pull하는 것이 좋다. 메인 프로젝트는 서브 모듈에 존재하는 파일을 하나하나 갖는 것이 아닌 path, url, commit 정보 등만 가지고 있다. (.gitmodules 파일 참고)
# 서브 모듈 변경 사항 가져오기
$ git submodule foreach git pull

# 메인 프로젝트 변경 사항 가져오기
$ git pull

 

🔻 스크립트 설명

더보기

$ git submodule foreach git pull

  • git submodule foreach git pull <remote> <branch> 를 통해 특정 브랜치만 가져올 수 있음
  • 메인 프로젝트에 변경 사항이 생길 수 있으며 이 경우 메인 프로젝트에서도 새로 커밋해야 함

 

  • 서브모듈을 가진 프로젝트를 최초로 가져오는 경우, 서브 모듈 폴더는 존재하는데 안에 파일들은 갖고 있지 않다. 아래와 같은 과정을 따라야 한다.
$ git submodule init
$ git submodule update
$ git submodule foreach git checkout main

 

🔻 각 스크립트 설명

더보기

$ git submodule init

  • .gitmodules 파일의 정보를 로컬에 등록
  • 메인 프로젝트의 현재 커밋 당시 스냅샷을 가져옴

 

$ git submodule update

  • 서브모듈 저장소에서 데이터 가져오기
  • 서브모듈을 포함한 프로젝트의 현재 스냅샷에서 checkout 해야할 커밋 정보 가져오기

 

$ git submodule foreach git checkout main

  • main 브랜치로 sub project를 checkout
  • 이 명령어를 실행하지 않으면 detached head 상태에 있음
    (= 어떤 브랜치에도 속하지 않은 상태)

 


참고

반응형