개요
SpringBoot 프로젝트의 application.yml 파일에는 각종 외부 접속에 필요한 정보(URL, 계정정보 등)가 포함되어 있다.
이를 GitHub에 그대로 업로드한다면 민감한 정보가 노출되어 보안 상 문제가 되므로 아래와 같이 주요 정보들을 환경변수(${} 로 감싸져 있는 부분)로 처리해주었다.
그리고 Jenkins를 통해 해당 프로젝트를 빌드할 때, 환경변수로 처리한 부분들에 대한 정보를 주입할 수 있도록 빌드 환경 설정을 해준다.
application-prod.yml
server:
servlet:
encoding:
force: true
charset: UTF-8
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${RDS_IP}:3306/table?useSSL=false&useUnicode=true&allowPublicKeyRetrieval=true
username: ${RDS_USERNAME}
password: ${RDS_PASSWORD}
jpa:
defer-datasource-initialization: true
show-sql: true
hibernate:
ddl-auto: update
database: mysql
mvc:
pathmatch:
matching-strategy: ant_path_matcher
Jenkins에서의 빌드 설정
1. 먼저 빌드하고자 하는 Item의 Configure 탭으로 진입하여 "This project is parameterized" 항목을 체크한다. 그리고 "String Parameter"를 선택한다.
2. application.yml에 필요한 환경변수를 등록한다.
3. Build Step 탭에서 Execute shell에 환경변수에 실제 값을 주입할 command를 입력한다.
sed 명령어를 통해 application.yml에서 ${}로 감싼 부분을 위에서 설정한 String Parameter 값으로 치환하는 작업이다.
코드
echo ">application-prod.yml 파일 위치로 이동"
cd /var/lib/jenkins/workspace/{프로젝트 이름}/src/main/resources
echo ">application-prod.yml 서버전용yml 변경"
sed -i "s#\${RDS_IP}#$RDS_IP#" application-prod.yml
sed -i "s#\${RDS_USERNAME}#$RDS_USERNAME#" application-prod.yml
sed -i "s#\${RDS_PASSWORD}#$RDS_PASSWORD#" application-prod.yml
echo ">빌드할 위치로 이동"
cd /var/lib/jenkins/workspace/{프로젝트 이름}
echo ">권한 추가 및 클린 빌드"
sudo chmod 777 ./gradlew
sudo ./gradlew clean
sudo ./gradlew build
4. 빌드 실행 후 Console output을 확인해보면 값이 정상적으로 주입된 것을 확인할 수 있다.
겪었던 오류
application-prod.yml 파일에서 RDS 엔드포인트, RDS username, RDS password 에 대한 환경변수 처리를 했는데
Jenkins에서 해당 환경변수에 값을 주입하는 설정을 제대로 하지 못해서 프로젝트와 RDS와의 연결이 실패하는 에러를 겪었다.
RDS 연결에 필요한 값들이 제대로 주입되지 않았으니 당연한 결과였다.
com.mysql.cj.jdbc.exceptions.communicationsexception: communications link failure
the last packet sent successfully to the server was 0 milliseconds ago. the driver has not received any packets from the server.
위 에러 메세지로 구글링을 해보았을 때 RDS와 EC2의 연결 문제를 원인으로 꼽는 내용들이 대부분이었다. 하지만 EC2 터미널에서 해당 RDS로의 접속은 정상적으로 이루어지는 상황이었기 때문에 다른 곳에 문제가 있으리라 짐작했다.
그래서 application-prod.yml 파일에서 환경변수로 처리한 부분을 실제 값으로 모두 바꾸고 다시 시도하니 정상적으로 서버가 시작되었다. 이는 환경변수에 값이 주입되는 과정에 문제가 있다는 방증이었기에 Jenkins에서 빌드 시 Parameter를 설정하는 방법에 대해 알아봄으로써 문제를 해결할 수 있었다.
'Deploy' 카테고리의 다른 글
[Error] Error: connect ECONNREFUSED 127.0.0.1:443 (0) | 2024.02.12 |
---|---|
[Docker] Docker 컨테이너 실행(run) 시 환경변수 (여러개) 주입하기 (1) | 2024.01.31 |