-
Notifications
You must be signed in to change notification settings - Fork 0
[INFRA] 3. Backend와 DB 연결
이제 DEV 서버와 DB 서버를 연결하도록 하자.
펀잇팀은 DB로 MySql을 사용하기로 했다.
DB서버는 앞서 만들었던 INFRA서버, DEV서버와 다르게 외부에서의 접근이 필요없기에 public ip를 설정하지 않아도 된다.
그러므로 같은 VPC 안에 위치한 DEV서버(또는 PROD서버)만 DB서버로 접근할 수 있다.
MySql 설치하는 방법은 인터넷에 잘 정리되어있으므로 넘어가도록 하겠다! 😋
이제 새로 만든 DB서버를 우리의 Spring application과 연결해야 한다.
이때 DB 관련 정보(url, password등)는 보안상 중요하기 중요하기 때문에 함부로 다른 코드들과 함께 깃에 업로드해서는 안된다!
그러므로 DB정보를 어떻게 전달할 수 있을지 생각해보자 🤔
우리팀이 생각한 방법은 크게 3가지이다.
- DEV서버에 환경변수로 설정해두고 jar파일 실행할 때 넣어주기
nohup java -jar -DDEPLOY_ACTIVE=dev -DDB_URL=jdbc:mysql://190.190.190.190:3306/funeat?serverTimezone=UTC ...
- INFRA서버에서 빌드 전에 관련 값들을 세팅해주기
- 방법1) jenkins 환경변수를 설정해두고 빌드 직전에 값 바꿔치기
- 방법2) INFRA서버에 application.yml을 두고 빌드 직전에 파일 바꿔치기
- git submodule 부모 레포지토리 하위에 자식 레포지토리(서브모듈)를 둬서 관리
펀잇은 이 중에서 2-1방법을 사용했다!
그러므로 이 글에서는 보안 정보를 jenkins에 환경변수로 두고, 빌드 직전에 값 바꿔치기
하는 법으로 알아보겠다.
☁️ Jenkins 관리 > System
System 페이지에서 밑으로 내리다보면 Global properties
란이 있다.
이런식으로 필요한 환경변수들을 하나씩 추가하면 된다!
일단 환경변수 세팅 적용 후 전체 스크립트는 아래와 같다.
pipeline {
agent any
tools {
gradle 'gradle'
}
stages {
stage('Git Clone') {
steps {
git branch: 'develop', url: {git url}
}
}
stage('DB Setting') {
steps {
script {
sh '''
sed -i "s|{ DEV_DB_URL }|${DEV_DB_URL}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
sed -i "s|{ DEV_DB_USERNAME }|${DEV_DB_USERNAME}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
sed -i "s|{ DEV_DB_PASSWORD }|${DEV_DB_PASSWORD}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
sed -i "s|{ DEV_IMAGE_PATH }|${DEV_IMAGE_PATH}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
sed -i "s|{ DEPLOY_ACTIVE:dev }|${DEPLOY_ACTIVE}|" "${WORKSPACE}/src/main/resources/application.yml"
sed -i "s|{ REST_API_KEY }|${REST_API_KEY}|" "${WORKSPACE}/src/main/resources/application.yml"
sed -i "s|{ REDIRECT_URI }|${REDIRECT_URI}|" "${WORKSPACE}/src/main/resources/application.yml"
'''
}
}
}
stage('Build') {
steps {
dir("./backend") {
sh "./gradlew clean build"
}
}
}
stage('Deploy') {
steps {
sshagent(credentials: ['aws-key']) {
sh '''
ls
pwd
ssh -o StrictHostKeyChecking=no ubuntu@{개발서버ip} uptime
scp /var/jenkins_home/workspace/{item이름}/backend/build/libs/funeat-0.0.1-SNAPSHOT.jar ubuntu@{개발서버ip}:/home/ubuntu/funeat
ssh -t ubuntu@{개발서버ip} ./deploy.sh
'''
}
}
}
}
}
기존 Git Clone
스테이지와 Build
스테이지 사이에 DB Setting
스테이지가 추가되었다.
DB Setting
스테이지를 자세히 살펴보자.
stage('DB Setting') {
steps {
script {
sh '''
sed -i "s|{ DEV_DB_URL }|${DEV_DB_URL}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
sed -i "s|{ DEV_DB_USERNAME }|${DEV_DB_USERNAME}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
sed -i "s|{ DEV_DB_PASSWORD }|${DEV_DB_PASSWORD}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
sed -i "s|{ DEV_IMAGE_PATH }|${DEV_IMAGE_PATH}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
sed -i "s|{ DEPLOY_ACTIVE:dev }|${DEPLOY_ACTIVE}|" "${WORKSPACE}/src/main/resources/application.yml"
sed -i "s|{ REST_API_KEY }|${REST_API_KEY}|" "${WORKSPACE}/src/main/resources/application.yml"
sed -i "s|{ REDIRECT_URI }|${REDIRECT_URI}|" "${WORKSPACE}/src/main/resources/application.yml"
'''
}
}
}
펀잇은 sed
명령어를 사용해서 환경변수를 yml파일에 세팅했다.
sed 명령어는 vi 편집기처럼 편집에 특화된 명령어이다. 수정, 치환, 삭제, 글쓰기 등 웬만한 편집기능이 다 가능하다.
sed
명령어를 통해 기존 yml파일 속 변수들을 앞서 설정해둔 jenkins 속 환경변수로 치환할 수 있다.
sed "s|원본문자열|바꿀문자열|' 파일명
이런 식으로 사용할 수 있다.
⚠️ 단, 이렇게 쓰면 원본파일은 바꾸지 않고 표준출력을 한다. (원본파일을 바꾸고 싶으면-i
옵션을 붙여야 한다.)
⚠️ 참고로 모든 기호가 구분자가 될 수 있다. (sed "s|${BEFORE}|${AFTER}| sample.txt" 가능, sed "s@${BEFORE}@${AFTER}@ sample.txt" 가능)
즉, 위의 DB Setting
스테이지에서
sed -i "s|{ DEV_DB_URL }|${DEV_DB_URL}|" "${WORKSPACE}/src/main/resources/application-dev.yml"
이 명령어의 의미는
${WORKSPACE}/src/main/resources/application-dev.yml
파일안에 있는 { DEV_DB_URL }
(실제 문자열)을 ${DEV_DB_URL}
(jenkins의 환경변수)로 치환하라
는 뜻이다.
이런식으로 펀잇은 sed 명령어를 사용해서 DB 관련 정보나 소셜로그인 관련 정보를 치환했다!
이제 jenkins에서 DB정보가 이미 세팅된 채로 빌드가 가능하다! (git clone -> db setting -> build -> deploy)
참고로 ${WORKSPACE}는 jenkins내의 파일 위치이다.
보통 /var/jenkins_home/workspace/{jenkins item명}이다.
펀잇은 /var/jenkins_home/workspace/funeat-dev/backend이다! (git에서 backend폴더 내에 소스코드가 위치)
외부서버(DEV서버)에서 DB서버로 접속해야하기 때문에
DB서버에서 외부 서버로부터의 접속을 허용하는 설정을 해줘야 한다!
cd /etc/mysql/mysql.conf.d
vi mysqld.cnf
해당 파일에서 bind-address 값을 0.0.0.0 으로 수정한 후 wq!
로 저장한다.
service mysql restart
mysql 서버를 재시작하면 끝!!
이 글은 펀잇팀 오잉이 작성하였습니다.
- 📚 프론트엔드 개발 문서
- 🌏 브라우저 지원 범위
- 🧪 프론트엔드 테스트 전략
- [웹 접근성] a tag와 button의 차이는 무엇일까?
- multipart
- SvgSprite 컴포넌트 사용하기
- [INFRA] 프론트엔드 CI/CD 구축
- [기술 검토] 리액트 쿼리 도입 이유
- [기술] 로그인 기능 도입기
- 🐛 S3 배포 캐싱 오류
- 이미지를 위한 S3와 Cloudfront 설정하기
- 📓 성능리포트 ‐ 펀잇 서비스 최적화하기
- 펀잇 SEO 개선하기
- 📚 백엔드 개발 문서
- intellij에서 private DB 연결하기
- [INFRA 0] 전체 infra 구조 - ver1
- [INFRA 1] infra 서버 세팅
- [INFRA 2] 백엔드 CI/CD 구축
- [INFRA 3] 백엔드 DB 연결
- [INFRA 4] 깃허브 PR 라벨을 기준으로 젠킨스 빌드하기
- [LOG] 로그 세팅
- [Trouble Shooting] 일관된 테스트 격리 적용하기
- [Trouble Shooting] 프록시로 동작하는 @Transactional, 전파 옵션 관리