
이번 GDG 사이드 프로젝트에서는 기존에 사용하던 방식이 아닌, 새로운 방식을 통해 CI/CD를 적용해보았다.
특히, docker와 쿠버네티스를 적극적으로 활용하여 기술적 발전을 이룩하고자 하였다.
해당 포스트에는 위 과정에서 기존 방식과 달라 발생한 문제를 해결하는 과정을 담았다.
application-dev.properties를 gitignore 등록
해당 파일에 민감정보를 두고 git에 민감정보가 올라가는 것 방지,
개개인 로컬 개발시에는 직접 application-dev.properties 파일을 만들어 사용
기존 방식은 vm서버 내부에 직접 스프링 어플리케이션 레포를 두고, 서버 내부에서 직접 gradle 실행을 했음
→ gitignore된 파일이라도 직접 서버에서 파일을 수정하면 문제없이 적용 가능했음
현재는 깃액션에서 docker 이미지를 빌드하고, 도커 허브에 올림
이후 vm내부에 설치된 쿠버네티스는 스프링 어플리케이션 레포를 실행하는것이 아닌, 도커 허브에 올라간 최신 도커 이미지만을 실행
→ gitignore된 파일을 서버 내에서 조작하는것이 불가능
따로 application-dev.properties를 두지 않고, application.properties를 다음과 같이 작성
spring.application.name=algo-hive
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://${DB_HOST}:${DB_PORT}/algo_hive?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.h2.console.enabled=false
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.jpa.properties.hibernate.format_sql=true
→ 민감 정보인 db_host, db_password 등을 환경변수화
쿠버네티스 deployment파일을 아래와 같이 수정
apiVersion: apps/v1
kind: Deployment
metadata:
name: knutoyproject
labels:
app: knutoyproject
spec:
replicas: 3
selector:
matchLabels:
app: knutoyproject
template:
metadata:
labels:
app: knutoyproject
spec:
containers:
- name: knutoyproject
image: ${DOCKER_USERNAME}/knutoyproject:latest
imagePullPolicy: Always
ports:
- containerPort: 8080
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1"
env:
- name: DB_HOST
valueFrom:
secretKeyRef:
name: db-secret
key: db_host
- name: DB_PORT
valueFrom:
secretKeyRef:
name: db-secret
key: db_port
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: db_username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: db_password
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 3
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
failureThreshold: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
→ “env:” 에서 환경변수를 받아올 준비를 함
서버 내부에서 db-secret.yaml을 작성후 실행
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
db_host: MzQuMTM2LjEzLjkx # base64로 인코딩한 DB_HOST
db_port: MzMwNg== # base64로 인코딩한 DB_PORT
db_username: cm9vdA== # base64로 인코딩한 DB_USERNAME
db_password: MTIzNDU2 # base64로 인코딩한 DB_PASSWORD

→ 정상적으로 실행중
이후, 서버내에서 도커 이미지를 받아와 스프링 어플리케이션을 실행하면 환경변수를 정상적으로 받아올 수 있음
개개인의 개발 환경에서는 gitignore파일을 추가하지 않았기 때문에 환경변수를 설정해줘야 정상 실행 가능
방법1. 터미널에서 환경변수를 추가 → 터미널 재접속시 계속 설정해야하기 때문에 번거로움
방법2. (추천) 인텔리제이 자체적으로 환경변수를 추가





깃허브에서 서브모듈이라는 기술도 사용해볼 수 있겠네요!