이 글은 알파코에서 진행되는 [신한투자증권] 프로디지털아카데미 과정 중, 김송아 강사님과 함께하는 '파이널 프로젝트'를 기반으로 작성되었습니다
이번 프로젝트에서 어쩌다보니 인프라 파트를 담당하게 돼서 msa 구조 설계 그리고 CI/CD까지 하게 되었다
이 과정에서 Jenkins로 깃허브에서 push가 되면 자동으로 배포가 되도록 설계 하였는데 이 부분에서 애를 먹었던 부분들이 많아서 내용을 정리해서 공유하고자 한다

일단 우리의 아키텍처 구조는 이 그림과 같다
여기서 처음에 실수한 부분이 게이트웨이 포트번호를 8087로 줬는데 이 부분은 80번으로 줘야 나중에 url 입력할때 포트번호 추가 안해줘 도 된다. (80이 기본포트이기 때문에)
일단 jenkins 를 퍼블릭 서브넷에 있는 ec2에 두고 쓸 예정이기 때문에 이 ec2에서 설치를 해줘야한다.
https://curiousjinan.tistory.com/entry/aws-ec2-docker-jenkins-setup
AWS EC2에서 Docker와 Jenkins로 CI/CD 환경 구축하기
이번에는 EC2에서 Docker를 띄운 후 Jenkins를 구축해 보자 1. EC2 인스턴스에 SSH 접속 AWS 콘솔에서 EC2 인스턴스의 IP 주소를 확인한 후, 터미널을 열고 SSH로 접속한다. 아래의 방법을 통해 Termius로 접속
curiousjinan.tistory.com
도커 컨테이너를 띄우고 이 안에 jekins 를 설치하는 방식은 이 글을 참고하였다.
그리고 설정 부분

여기서 새로운 Item 을 눌러서 하나의 job 을 만들어주면 된다.
그리고 아래 블로그 내용과 같이 job 기본설정들을 해주고 깃허브 토큰, webhook 등의 설정을 해주면 된다
https://velog.io/@rungoat/CICD-Jenkins%EC%99%80-GitHub-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0
[CI/CD] Jenkins와 GitHub 연동하기
Jenkins와 GitHub 연동하기
velog.io
내가 설명하고자 하는 부분은 바로 Spring project를 github 에서 가져오다 보면 gitignore된 파일들은 당연히 가져오지 않게 되는데
그 중 application.yml 파일이 필요하지만 민감한 정보들이 있어서 곤란했던 문제 상황을 해결하는 방법이다.
일단 RDS_URL, DB_PASSWORD 와 같이 민감한 정보들은 미리 jenkins의 credential로 추가해줘야한다.

jekins 설정 부분에서 credential 를 클릭하고

System을 클릭해준다
System 안에서 credential를 추가해줘야 job에서 불러올 수 있다.


Global credentials 누른 후 add credentials 클릭해서 추가해주면 된다.
이때

kind는 secret text로 해줬다.

secret 부분에 변수 값을 넣고 ID에는 변수 이름을 넣어주면된다.
이런식으로 DB_PASSWORD, REDIS_HOST, JWT_TOKEN 과 같이 민감한 정보들은 미리 저장해두면 된다.
그리고 다시 jenkins 메인 화면에서 새로운 item 누르고 job을 만들면 되는데

깃허브 설정이나 이런 부분들은 위에 올린 블로그 내용대로 하면 되고 빌드 환경에 아까 설정해둔 credential 중 필요한 값들을 전부 추가해준다.
그 후 빌드 스크립트에서 빌드 할 때 applicaiton.yml을 만들어서 넣는 방식으로 구현하였다.
########################################################
## 🔧 Jenkins Credentials → 환경변수 확인
########################################################
: "${RDS_URL:?❌ Missing RDS_URL}"
: "${DB_PASSWORD:?❌ Missing DB_PASSWORD}"
: "${RABBITMQ_HOST:?❌ Missing RABBITMQ_HOST}"
: "${RABBITMQ_PASSWORD:?❌ Missing RABBITMQ_PASSWORD}"
: "${JWT_SECRET:?❌ Missing JWT_SECRET}"
: "${REDIS_HOST:?❌ Missing REDIS_HOST}"
mkdir -p ./data-process-module/src/main/resources
cat > ./data-process-module/src/main/resources/application.yml <<EOF
server:
port: 8082
spring:
application:
name: data-process-module
datasource:
url: ${RDS_URL}
username: admin
password: ${DB_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 5 # ✅ 동시에 유지할 최대 커넥션 수
minimum-idle: 2 # ✅ 유지할 최소 idle 커넥션 수
idle-timeout: 30000 # ✅ idle 상태로 유지되는 시간 (ms)
max-lifetime: 600000 # ✅ 커넥션 재생성 주기 (ms)
connection-timeout: 30000 # ✅ 커넥션 풀에서 가져올 때 대기 최대 시간 (ms)
jpa:
hibernate:
ddl-auto: none
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
show-sql: true
properties:
hibernate:
format_sql: true
EOF
echo "✅ application.yml 생성 완료"
대충 이런 느낌으로 빌드 할때 실행되는 스크립트 내용에서 credential 변수들을 받아서 application.yml 을 작성해주면 된다.
application.yml 을 gitignore 에서 풀고 .env 에 값을 두고 그 값만 받아와도 되지만
이미 git ignore로 두고 프로젝트를 하던 상태에서 이렇게 했다가 RDSurl, password 같이 민감한 정보가 혹시나 올라갈까봐 이런 문제를 원천 차단하기 위해서 jenkins에서 아예 새로 쓰는 방식으로 해줬다. 장점도 있지만 단점도 있는 방법인 것 같다.