DEV 서버와 DB 서버를 연결하고자 한다.
DB서버는 앞서 만들었던 INFRA서버, DEV서버와 다르게 외부에서의 접근이 필요없기에 public ip를 설정하지 않아도 된다.
그러므로 같은 VPC 안에 위치한 DEV서버(또는 PROD서버)만 DB서버로 접근할 수 있다.
MySql 설치하는 방법은 인터넷에 잘 정리되어있으므로 넘어가도록 하겠다! 😋
이제 새로 만든 DB서버를 우리의 Spring application과 연결해야 한다.
이때 DB 관련 정보(url, password등)는 보안상 중요하기 중요하기 때문에 함부로 다른 코드들과 함께 깃에 업로드해서는 안된다!
그러므로 DB정보를 어떻게 전달할 수 있을지 생각해보자 🤔
우리팀이 생각한 방법은 크게 3가지이다.
nohup java -jar -DDEPLOY_ACTIVE=dev -DDB_URL=jdbc:mysql://190.190.190.190:3306/funeat?serverTimezone=UTC ...
펀잇은 이 중에서 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|{AFTER}| sample.txt" 가능, sed "s@{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 서버를 재시작하면 끝!!