IT/github

[ github ] submodule이란?

토희 2023. 9. 1. 13:07
728x90

GitHub Submodule은 Git 프로젝트에서 다른 Git 프로젝트를 하위 디렉토리에 포함시키는 방법이다

Submodule을 사용하면 하나의 Git 저장소에서 여러 개의 프로젝트를 관리할 수 있으며, 각 프로젝트는 별도의 저장소로 유진된다

이를 통해 복잡한 프로젝트를 여러 저장소로 분할하여 개발, 관리, 배포를 용이하게 할 수 있다

 

 

이번에 개인 프로젝트를 진행하면, 포트폴리오를 위한 프로젝트니까 프로젝트를 Public으로 공개하기로 했다

그러면 노출되면 안되는 정보가 있는 application 파일은 어떻게 관리할까 고민하던 중에 submodule를 사용하기로 했다

 

 

보안상 노출이 안되는 키값이 있는 application.yml 파일을 관리하기에는 아래 3가지 방법이 있는것 같다

  1. Jasypt를 사용하여 설정파일 암호화 → 라이브러리 설치해야해서 번거로움
  2. Github Secret 사용 → application.yml 파일이 수정될 때마다 secret에 들어와서 Base64로 인코딩 된 application.yml 파일을 붙여 넣은 뒤 Github Actions를 실행해서 빌드해야 함. 번거로움
  3. Github Submodule 사용 → 선택

 

 

1. 서브모듈 레파지토리 생성

Private 레포지토리 생성 후 application.yml을 넣는다

/src/main/resources 와 /src/test/resources 로 들어갈 설정 파일 2개를 이름을 다르게 지정하여 넣어줌

 

 

2. 메인 리포지토리에 서브모듈 추가

메인 리포지토리를 로컬로 clone 받고 서브모듈을 추가한다

git clone [메인 리포지토리 url]
git submodule add [서브모듈 리포지토리 url]

그러면 clone 받은 메인 리포지토리에 .gitmodules 파일이 생성된다

만약 메인 리포지토리의 default 브랜치명이 master가 아닐 시, .gitmodules 파일에 명시해줘야 한다

 

아래는 브랜치명이 main일 경우

[submodule "submodule-config"]
	path = submodule-config
	url = https://github.com/XXXXXX/submodule-config.git
	branch = main

 

 

3. application.yml이 수정되었을 경우

메인 레파지토리 경로에서 아래 명령어로 최신 서브모듈로 업데이트

// 프로젝트와 서브모듈 같이 clone 받는 명령어
git clone --recurse-submodules [프로젝트URL]
// 서브모듈만 clone 받는 명령어
git submodule update --init --recursive
// 서브모듈 최신상태 확인
git submodule status
// Submodule을 포함시키고자 하는 Git 저장소에 Submodule을 추가
git submodule add [repository-url] [path]
// 서브모듈 초기화
git submodule init
// 서브모듈 업데이트
git submodule update

 

4. build.gradle 추가

빌드 시 서브모듈의 파일을 복사해서 resources 경로에 넣으려면 build.gradle 아래와 같이 추가해준다

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

위와 같이 하는것이 일반적이나,
main과 test 두개의 파일을 copy하면서 이름을 application.yml로 변경해주고 싶으므로 아래와 같이 설정해준다

task copyMainResources(type: Copy) {
	copy {
		from './submodule-config'
		include "application-main.yml"
		into './src/main/resources'
		rename { String fileName ->
			fileName.replace("application-main.yml", "application.yml")
		}
	}
}

task copyTestResources(type: Copy) {
	copy {
		from './submodule-config'
		include "application-test.yml"
		into './src/test/resources'
		rename { String fileName ->
			fileName.replace("application-test.yml", "application.yml")
		}
	}
}

 

 

5. .gitignore 파일에 application.yml 추가

src/main/resources/application.yml
src/test/resources/application.yml

 

 

6.PAT (GitHub Personal Access Token) 토큰 발급

서브모듈이 private이면 접근권한이 없을 때 clone받을 수 없다

Github에서 PAT (Personal Access Token) 발급 후 메인 리포지토리 토큰으로 설정해줘야 한다

 

Github 사용자 아이콘 클릭 → Settings → 왼쪽 아래 Developer settings → Personal access tokens → Tokens (classic) → Generate new token → (classic) 선택 → Expiration 30 days, repo만 체크하여 Generate token → 복사하기

 

 

 

7. 메인 리포지토리에 토큰 적용

메인 리포지토리 Settings → Secrets and variables → Actions → New repository secret → Name을 SUBMODULE_TOKEN 으로 설정 후 토큰 붙여넣기 → 생성

 

 

 

 

 

728x90

'IT > github' 카테고리의 다른 글

Github 이슈 라벨(issue labels)  (1) 2023.12.21
[ github ] 원격 저장소 연결 및 끊기 (git remote)  (0) 2023.08.29