일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- DP
- softeer
- dockercompose
- 완전탐색
- java
- On-Premise
- sonarqube
- 백엔드 개발
- CODETREE
- es_java_home
- 인가인증
- 알고리즘
- BFS
- 정렬
- jsonwebtoken
- s3
- 동전 퍼즐
- objectstorage
- 카카오엔터프라이즈
- DFS
- 자바
- 구름
- 카카오클라우드
- 코드트리
- bfs
- MESSAGEBROKER
- db
- 소프티어
- 함수 종속성
- bitmask
- Today
- Total
wooing
서브모듈로 민감정보 관리하기 본문
프로젝트에 사용되는 비밀번호, 키 값, IP등 여러 민감정보는 public으로 노출되어서는 안된다. 민감정보들을 노출하지 않는 방법으로 Github Secret, 환경변수 등록, Submodule등 여러 방법이 있다. 우리는 Submodule을 통해 민감정보를 한 레포지토리에서 관리하고자 한다.
서브모듈이란
1. 서브모듈 프로젝트 생성 및 파일 추가
서브모듈 레포지토리는 민감정보를 그대로 저장하기 때문에 private으로 생성한다. 서브모듈은 프로젝트에 연결할때 레포지토리의 모든 파일이 저장되기 때문에 최상위 경로에 그대로 저장했다간 구분하기가 어렵다. (일반적으로는 우리처럼 프로젝트마다 파일이 다른 경우엔 서브모듈을 분리해서 생성한다고 한다.) 디렉토리를 생성해서 서브모듈의 파일을 읽어올때 디렉토리 경로로 구분할 수 있도록 했다.
파일을 추가하려면 일반적으로 레포지토리에 커밋하듯이 클론하고 커밋하면 된다.

2. 메인 프로젝트에 서브모듈 추가
서브모듈을 추가할 프로젝트에 아래의 명령어로 추가해준다.
git submodule add <repository_URL> config
git add .
git commit -m "Add config submodule for shared database configurations"
위의 명령어를 수행하면 .gitmodules파일이 생긴다. 여기에 서브모듈에 관한 정보가 담기고 github에 들어가면 아래의 사진처럼 서브모듈 디렉토리가 생긴다.

서브모듈에 변경사항이 생기면 아래의 명령어로 메인 프로젝트에서 서브모듈을 업데이트할 수 있다.(중요)
git submodule update --remote
또는
git submodule -q foreach git pull -q origin main
3. Build task 추가
서브모듈은 최상위 디렉토리(config)에 저장된다. 프로젝트 실행에 사용하기 위해서는 spring boot의 경우 resource폴더에 있어야 사용이 가능하기 때문에 빌드 과정에서 이 파일을 복사해와야 한다.
Spring boot는 build.gradle로 빌드할때 복사해오는 task를 추가할 수 있다.
processResources.dependsOn('copyGitSubmodule')
task copyGitSubmodule(type: Copy) {
from '복사할 디렉토리 경로'
include '*.yml'
into 'src/main/resources'
}
4. Jenkinsfile 수정
이전에 작성한 Jenkinsfile은 로컬의 Dockerfile을 사용하도록 되어있다. 서브모듈을 사용하게되면 프로젝트를 clone했을때 서브모듈은 clone되지 않기 때문에 빌드할때 오류가 발생한다. 이를 해결하기 위해 Jenkins credential에 민감정보(파일)을 젠킨스 서버에 등록하고, Jenkinsfile을 수정하여 복사해오는 방법으로 해결했다.
Jenkins pipeline에서 checkout을 통해 git 레포지토리에 ssh로 접근해서 submodule을 clone해올 수 있다. 그러나 시도해보았지만 실패하여 대안책으로 현재의 방법을 선택했다.
이 방법을 사용하게 되면 서브모듈은 사실상 개발단계에서 민감정보를 한 곳에 모아 관리하기 편하게 하기 위함이고, 실제 빌드를 위해서는 직접 Jenkins에 credential로 등록해야한다. 즉, 민감정보가 수정되면 서브모듈과 Jenkins에 두번 업로드 해야 한다.
- Credential에 yml파일 업로드
Jenkins 관리 → Credentails → Global → Add Credentials
Kind : Secret file
File : 업로드할 yml파일을 로컬(서브모듈)에서 선택
ID : Credential을 호출할 때 사용할 ID (아무거나 가능)
Description : 설명 (Optional)

- Jenkinsfile에 Credential 파일 copy stage 추가
이전에 Build.gradle로 yml파일을 자동으로 submodule 디렉토리에서 복사해오도록 구성했기 때문에 submodule경로에 맞게 복사해주면 된다.
stage('Copy YAML File') {
steps {
script{
if (env.ARTICLE_SERVICE_CHANGED == 'true') {
// YAML 파일을 credential로부터 읽어와서 특정 위치에 복사
withCredentials([file(credentialsId: 'article-application', variable: 'ARTICLE_YML_FILE')]) {
// 파일 복사 명령 실행
sh('mkdir -p ' + WORKSPACE + '/config/article-service-module/')
sh('cp ' + ARTICLE_YML_FILE + ' ' + WORKSPACE + '/config/article-service-module/application.yml')
}
}
if (env.USER_SERVICE_CHANGED == 'true') {
// YAML 파일을 credential로부터 읽어와서 특정 위치에 복사
withCredentials([file(credentialsId: 'user-application', variable: 'USER_YML_FILE')]) {
// 파일을 빌드 디렉토리 내 특정 위치로 복사
// 파일 복사 명령 실행
sh('mkdir -p ' + WORKSPACE + '/config/user-service-module/')
sh('cp ' + USER_YML_FILE + ' ' + WORKSPACE + '/config/user-service-module/application.yml')
}
}
}
}
}
요약
- key값이나 비밀번호와 같은 민감정보들이 노출되지 않도록 private repository를 만들어 서브모듈로 관리한다.
- 서브모듈을 사용하기 위해서는 레포지토리를 클론받을때 Submodule까지 같이 clone받도록 해야한다.
- git submodule update --remote
- 민감정보가 추가되는 경우엔 Submodule repository에 커밋해야하고, Jenkins credential에 업로드를 해야한다.
- 만약 파일이 새로 추가된 경우엔 Jenkinsfile 스크립트도 수정해야한다.
'프로젝트 > 가천대학교 카카오엔터프라이즈 SW아카데미' 카테고리의 다른 글
카카오클라우드 튜토리얼 수정 기여 회고 (0) | 2024.06.09 |
---|---|
On-premise환경에서 Jenkins CI/CD 세팅하기 (0) | 2024.05.20 |