Git 서브모듈로 yml 분리해서 관리하기

waterlyn·2023년 6월 15일
2
post-thumbnail

결론 먼저 보기 🎬

  • github private repo를 서브 모듈로 사용하여 yml 파일 분리!
  • gradle 빌드 시 자동으로 yml 파일을 가져와 사용하도록 구성!

왜 서브 모듈로 yml 파일을 분리하고자 했나요?

데브코스에서 프로젝트를 진행하면서 항상 난감(?)했던 것이 바로 yml 파일이었다. 너무나도 중요한 정보를 가지고 있고, 어플리케이션 실행, 테스트 등 모든 것에 걸쳐있는 이 친구를 어떻게 형상관리를 해야할지 어려웠다.

이 방식을 도입하기 전에는 application.yml 파일을 아예 통째로 secret으로 관리하는 방법으로 github action의 명령어로 파일을 만들어주는 방식으로 사용했는데, 이는 형상관리도 어려울 뿐더러, 어떤 yml 파일이 사용되고 있는지도 파악하기가 어려웠다.

그래서 멘토님들에게 여쭈어 보니 서브모듈을 사용하여 yml 파일을 관리하는 방법을 추천해주셨고, 이전에 사용하던 방식에 비해 어떤 장점이 있는지 살펴보고자 했다.

Git의 서브 모듈을 사용했어요

gradle로도 모듈을 생성해서 사용할 수 있지만, 나는 간단하게 git에서 제공하는 submodule을 사용하기로 했다.

서브모듈이란?

git에서 제공하는 서브모듈은 하나의 레포지토리의 하위에 다른 저장소를 관리하기 위해 사용할 수 있는 도구를 의미한다. 즉, 하나의 레포지토리에서 다른 레포지토리를 포함하여 관리할 수 있게 해주는 것을 의미한다고 볼 수 있다.

git의 서브모듈은 하위 디렉터리 내에서 변경 사항이 발생해도 상위에서 바로 반영되지 않고, 서브 모듈 자체를 하나의 커밋 단위로서 관리한다.

서브 모듈에서 변경되었던 사항들이 추적되지 않고, 커밋 단위로 나타내지며 볼 수 없도록 되어 있다.

practice_yml_importer 라는 디렉토리가 바로 서브 모듈에 해당하는데, diff 명령어로 변경 사항을 추적해보고자 해도 커밋단위만 나타날 뿐 자세한 변경사항은 볼 수가 없다.

원래는 이렇게 변경 사항이 추적된다.

서브모듈 어떻게 사용하나요?

간단한 사용 방법을 알아보고 넘어가자.

우선 yml 파일을 관리하기 위해서라면 서브 모듈에 사용할 레포지토리는 private으로 만들어야 한다. (너무 당연한 소리인가ㅏ…)

참고로, private 레포지토리로 만들면 권한이 없을 경우 해당 레포지토리에 접근이 불가능하고, 레포지토리 클론 시에도 가져올 수 없기 때문에 민감 정보를 담아놓기에 안성맞춤이다.

하위 모듈을 가질 상위 레포지토리 만들기

multi_module_practice 라는 레포지토리를 Public으로 만들어주었고, 내부에는 간단한 spring boot 코드가 들어있다.

그리고 yml 파일을 가질 하위 디렉토리인 practice_yml_impoter라는 private 레포지토리를 만들어주었다. 이 레포지토리에는 yml 파일만 들어있도록 해도 되고, 다른 코드가 들어있어도 상관은 없다.

상위 레포지토리에 서브 모듈 형성하기

git submodule add {추가할 서브모듈에 해당하는 레포지토리 url}

위의 명령어를 상위 레포지토리의 root 에서 입력해주면 서브 모듈 추가는 끝난다. (간단하죠??)

만약 이 과정에서 authentication이 필요한 경우에는 git의 username과 token을 요구하는데, 자신의 username과 발급받은 token 혹은 새롭게 token을 발급받은 후에 입력해주면 된다.

그러면 다음과 같이 상위 디렉토리에 하위 디렉토리가 자동으로 추가된다.

(밑의 yml_importer 폴더는 잘못만든겁니다….. 무시해주세요….)

그리고 이렇게 가져온 변경 사항을 커밋하고 푸쉬하면 밑의 사진처럼 레포지토리가 연결된 것을 확인할 수 있을 것이다.

위의 레포지토리는 권한이 없는 사용자가 접근 시에 404 에러가 나면서 접근이 제어된다.

서브 모듈에 yml 파일 추가하기

이제 자신이 숨기고자 하는 yml 파일을 서브 디렉토리에 넣어주면 된다.

그리고 넣어준 yml 파일에 대한 변경사항을 커밋한다.

서브 모듈의 변경사항을 상위 레포지토리에 가져오기

앞서 서브 모듈을 알아보면서 서브 모듈을 특별한 커밋으로 관리하는데, 상위 프로젝트에 하위 모듈의 변경 사항을 반영해주는 과정이 필요하다.

git submodule update --remote

다음 명령어를 마찬가지로 상위 레포지토리의 root에서 입력하면 하위 모듈의 변경 사항을 가져와서 자동으로 반영해준다.

그러면 여러분의 상위 폴더에 자신이 넣어주었던 yml 파일이 가져와지는 것을 확인할 수 있을 것이다.

빌드 시에 파일 복사해서 가져오기

이제 서브 모듈에 존재하는 yml 파일을 빌드할 때 가져와서 사용하는 것만 하면 분리하는 것이 완료된다!!

빌드 시에 지정하고 싶은 행위는 build.gradle 파일에 작성해주면 된다.

task copyYML(type: Copy){
    copy {
        from './practice_yml_importer/src/main/resources'
        include "*.yml"
        into './common/src/main/resources'
    }
}
  • task : gradle의 작업 단위를 선언하는 부분
  • copy : gradle에서 제공하는 파일 복사 API
    • from : 가져오고 싶은 파일의 위치 작성
    • include : 가져올 파일 지정 (현재는 yml 파일을 모두 가져오도록 지정됨)
    • into : 가져온 파일을 위치시킬 곳 지정

이렇게 작성해주면 빌드 시에 자동으로 yml 파일을 가져올 수 있다.

이때, 주의할 점 !!!!! 🚨

가져온 application.yml 파일이 디렉토리에 위치하게 되기 때문에 생성된 파일이 git에 올라가지 않도록 gitignore에 명시해야 한다 !!!

github action 에서 서브모듈에 있는 yml 파일 사용하기

github action 을 사용해서 CI를 수행하고 있다면 github에 서브모듈을 사용하고 있음을 알려야 한다. 안그러면 빌드 시에 unknown references 오류가 발생한다.

- uses: actions/checkout@v3
  with:
     token: ${{ secrets.TOKEN }}
     submodules: true

서브 모듈에 접근할 수 있는 권한을 가진 사용자의 토큰을 github action secret에 명시해두어야 하며, submodule을 사용한다는 의미로 submodules: true로 설정해주면 알아서 잘 찾아온다.

yml 파일을 사용하는 것은 build.gradle 파일에서 해주었기 때문에 더 해줘야 하는 것은 없다!

참고

[GitHub] submodule 사용해서 yml과 같은 민감한 정보 숨기기
Spring Boot에서 git submodule로 민감 정보(yml) 관리
Github Action 에서 Submodule 설정 방법

profile
Hello there 🖤

3개의 댓글

comment-user-thumbnail
2023년 6월 15일

와 너무 잘봤어요 ~! 저도 나중에 개인프로젝트에 적용해봐야겠네요👍🏻

1개의 답글
comment-user-thumbnail
2023년 8월 6일

저도 비슷한 고민을 하고 있었는데 이런 방법이 있었군요~
잘 보고 갑니다!

답글 달기