정기간행물/daily

개발용 배포용 설정 파일 분리하기

:)jun 2023. 9. 5. 23:33

secret 변수는 -secret.yml 에서 관리하고 나머지는 .yml 에서 프로파일별로 나누어서 작성해주면 된다.

그러면 spring.profiles.active 와 include 차이가 뭘까?

  • active는 활성화할 프로파일을 지정하는 데 사용됨.
  • include는 @Configuration 클래스에서 프로파일을 조건부로 적용하기 위해 사용된다.

include 예제

@Configuration
@Profile("dev")
public class DevConfiguration {
    // Dev 환경에서만 필요한 설정
}

일반적으로는 ‘spring.profiles.active’를 사용하여 프로파일을 지정하고 필요한 설정을 관리하는 것이 일반적이다. ‘include’는 주로 ‘.yml’로 분리된 설정을 관리하고자 할 때 유용하다.

spring:
  profiles:
    active: dev, secret

---
# 개발 환경 설정 파일
spring:
  config:
    activate:
      on-profile: dev

  jpa:
    show_sql: true
    hibernate:
      ddl-auto: create-drop

---
# 배포 환경 설정 파일
spring:
  config:
    activate:
      on-profile: prod

  jpa:
    show_sql: true
    hibernate:
      ddl-auto: update

이런 식으로 나눠서 사용하려는데 문제가 있다. secret도 dev용, prod용으로 나누고 싶은데 어떻게 해야할까?

공식 문서를 확인해보자.

Spring Boot Reference Documentation

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

  • resources
    • application.yml
    • application-dev-secret.yml
    • application-prod-secret.yml

이렇게 나누어서 java jar 실행할 때, -Dspring.profiles.active=prod,prod-secret 붙여서 실행시켜야겠다.

로컬에서 먼저 테스트

java -jar -Dspring.profiles.active=prod,prod-secret build/libs/dadamda-0.0.1-SNAPSHOT.jar

prod, prod-secret 정확히 실행되는 것 확인

scripts/deploy.sh 변경해주기

#!/usr/bin/env bash

REPOSITORY=/home/ubuntu/app

echo "> 현재 구동 중인 애플리케이션 pid 확인"

CURRENT_PID=$(pgrep -fla java | grep dadamda | awk '{print $1}')

echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"

if [ -z "$CURRENT_PID" ]; then
  echo "현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
  echo "> kill -15 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

echo "> 새 애플리케이션 배포"

JAR_NAME=$(ls -tr $REPOSITORY/*SNAPSHOT.jar | tail -n 1)

echo "> JAR NAME: $JAR_NAME"

echo "> $JAR_NAME 에 실행권한 추가"

chmod +x $JAR_NAME

echo "> $JAR_NAME 실행"

nohup java -jar -Dspring.profiles.active=prod,prod-secret -Duser.timezone=Asia/Seoul $JAR_NAME >> $REPOSITORY/nohup.out 2>&1 &

분리한 application-prod-secret.yml 파일을 base64로 인코딩해 github secrets에 넣어주고

github actions .yml파일을 변경

- name: properties 파일 복사
        run: |
          echo "${{ secrets.APPLICATION_PROD_SECRET_YML }}" | base64 --decode > src/main/resources/application-prod-secret.yml

참고 자료

Spring Profile: yml 파일 하나로 프로퍼티 관리하기

 

Spring Profile: yml 파일 하나로 프로퍼티 관리하기

서비스를 개발하다보면 하나의 서버 애플리케이션을 다양한 환경에서 실행할 일이 생깁니다. 그리고 H2 DB를 사용하는 테스트 환경과 MySQL DB…

tecoble.techcourse.co.kr

원하는 yml파일이 정확하게 복사 됐고 prod, prod-secret profile들이 적용된 것을 볼 수 있다.