공부/CI & CD

Jenkins로 CI/CD 구축하기 - (2) Jenkis CI/CD 파이프라인 구축하기 + Credentials 등록

son_i 2024. 8. 9. 20:55
728x90

지난 Jenkins 설치에 이어 파이프라인 구축을 해보려고 한다.

Jenkins로 CI/CD 구축하기 - (1) Jenkis 설치 및 SWAP 메모리 할당 (tistory.com)

 

Jenkins로 CI/CD 구축하기 - (1) Jenkis 설치 및 SWAP 메모리 할당

Dockerfile을 만들었지만 아무 것도 안 써줌 Jenkins에 접속해서 Docker를 누르고 Docker Pull Command를 복사해서 터미널에 입력한다 !https://www.jenkins.io/download/ Download and deployJenkins – an open source automation se

soni-developer.tistory.com

 

파이프라인 작성에 앞서 해야할 일이 Credentials 등록이다.

 

Credentials 등록

1. ec2에 접근할 수 있는 pem 키 등록
나는 팀원이 만들어놓은 aws 계정에 IAM 사용자로 접근하고 있다.
따라서 팀원이 ec2를 생성할 때 만든 키페어를 사용할 수 없다.

키페어 생성

ec2-키페어-키페어생성

키페어를 만들어주고 특정위치에 저장한다. 

PUTTY gen 실행 -> Conversions -> Import Key로 ec2에서 만든 키페어 파일 선택

해당 내용을 복사하고 
ec2 터미널에 접속해서 아래 경로에 키파일을 붙여넣어준다.

$ vi .ssh/authorized_keys


이렇게 하면 내 .pem 키파일로 ec2에 접근할 수 있게된다.

Jenkins Credentials에 등록
Jenkins 관리 - Credentials

Stores scoped to Jenkins 에 System을 클릭

Global credentials 에 화살표를 누르고 Add credentials 클릭


kind : Username with private key 
id : 파이프라인 내에서 사용될 credentials 이름
username : 아무거나 적어도 된다.
key : pem 정보 (윈도우의 경우 키파일 위치로 가서 type {키페어이름}.pem 하면 내용을 볼 수 있다.}
     --BEGIN ~~-- 줄부터 --END ~~-- 줄까지 포함해서 모든 내용 입력

 

 

2. 배포된 코드가 올라갈 Petory 레포지토리에 접근할 수 있는 Personal Access Token 등록

똑같이 credentials를 만들 수 있게 들어가서 이번엔 private key 값에 Personal Access Token을 등록한다.

 

 

3. Private 레포지토리로 만든 서브모듈을 위한 credentials

똑같이 Add credentiasl로 들어가서 이번엔 kind를 Username with Password로 고른다.
username은 아무거나 적어도 되고
password에는 토큰을, ID에는 파이프라인에서 사용될 이름을 적어준다.

CI / CD 파이프라인 구축하기

일단 Jenkins 파이프라인은 이렇다.

pipeline {
    agent any
    stages {
        stage('Git Clone') {
            steps {
                git branch: 'feature/signup', credentialsId: 'Petory', url: 'https://github.com/SJ-Petory/Petory-BackEnd.git'
                withCredentials([GitUsernamePassword(credentialsId: 'submodules-token')]) {
                    sh 'git submodule update --init --recursive'
                }
            }
        }
        stage('Permission With Gradle') {
            steps {
                sh 'chmod +x gradlew'
            }
        }
        stage('BE-Build') {
            steps {
            
                    sh "./gradlew clean build"
            
            }
        }
        stage('Deploy') {
            steps {
                sshagent(credentials: ['aws_key']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no ec2-user@{탄력IP주소} uptime
                        scp /var/jenkins_home/workspace/Petory/build/libs/Petory-0.0.1-SNAPSHOT.jar ec2-user@{탄력IP주소}:/home/ec2-user/petory
                        scp src/main/resources/config/application-prod.yml ec2-user@{탄력IP주소}:/home/ec2-user/petory
                        ssh -o StrictHostKeyChecking=no ec2-user@{탄력IP주소} "nohup bash /home/ec2-user/deploy.sh &"
                    '''
                }
            }
        }
    }
}

 

CI 구축하기

첫번 째 stage인 Git Clone 부분

stage('Git Clone') {
            steps {
                git branch: 'feature/signup', credentialsId: 'Petory', url: 'https://github.com/SJ-Petory/Petory-BackEnd.git'
                withCredentials([GitUsernamePassword(credentialsId: 'submodules-token')]) {
                    sh 'git submodule update --init --recursive'
                }
            }
        }

배포환경에서 나는 서브모듈을 사용하고 있기 때문에 이에 해당하는 submodules-token이 하나 더 들어갔다.

흠 나는 어차피 PesonalAccessToken은 동일하니까 'Petory'로 넣어줘도 될 것 같은데 뭔지 모르게 오류가 나서 submodules-token을 사용한다. 

 

sh 'git submodule update --init --recursive' : 서브모둘을 최신 상태로 업데이트

   --recursive 옵션 : 서브모듈안에 포함된 서브모듈까지 업데이트

 

이 부분을 통해서 url에 있는 레포지토리에 branch로 지정해놓은 코드가 clone 된다.

그 과정에 서브모듈의 레포지토리를 접근하는 withCredentials 정보가 들어간다.

 

두 번째, 세 번째 stage 

stage('Permission With Gradle') {
            steps {
                sh 'chmod +x gradlew'
            }
        }
        stage('BE-Build') {
            steps {
            
                    sh "./gradlew clean build"
            
            }
        }

 

gradlew에 실행 권한을 추가해주고 빌드를 하는 부분이다.

 

여기까지가 CI 과정이며 해당 부분이 끝나면 Jenkins에 빌드파일이 복사 된다.

 

Jenkins에 빌드 파일 복사됐는지 확인

여기서도 엄청 해맸었는데 Jenkins에서 CI를 진행하므로

Jenkins 관리 - System에서 확인할 수 있는 홈 디렉터리에 빌드 파일이 생성된다.

 

//ec2 서버에서 아래 명령어로 jenkins 컨테이너 접속
$ docker exec -it jenkins /bin/bash

//Jenkins 컨테이너에 아래 경로에서 빌드파일 확인
# cd /var/jenkins_home/workspace
Petory가 잘 복사되어 왔다.

 

CD 구축하기

이 코드를 실행하려면 먼저 sshagent 플러그인을 설치해야 한다.

 

Jenkins 관리 - Plugins - Available plugins에서 ssh Agent 검색 후 설치

(나는 이미 설치가 완료돼서 Installed plugins에 있다.)

stage('Deploy') {
            steps {
                sshagent(credentials: ['aws_key']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no ec2-user@{탄력IP주소} uptime
                        scp /var/jenkins_home/workspace/Petory/build/libs/Petory-0.0.1-SNAPSHOT.jar ec2-user@{탄력IP주소}:/home/ec2-user/petory
                        scp src/main/resources/config/application-prod.yml ec2-user@{탄력IP주소}:/home/ec2-user/petory
                        ssh -o StrictHostKeyChecking=no ec2-user@{탄력IP주소} "nohup bash /home/ec2-user/deploy.sh &"
                    '''
                }
            }
        }

 

ssh -o StrictHostKeyChecking=no ec2-user@{탄력IP주소} uptime

 

젠킨스 서버에서 운영 서버에 접근할 수 있도록 StrictHostKeyChecking를 비활성화 시켜준다.

 

 scp /var/jenkins_home/workspace/Petory/build/libs/Petory-0.0.1-SNAPSHOT.jar ec2-user@{탄력IP주소}:/home/ec2-user/petory

 

scp는 파일 전송 프로토콜이다.

scp {송신경로} {수신경로} 형태로 작성해주면 되는데 여기서 송신경로가(build파일위치) Jenkins에 저장되는지를 모르고 정말 한참을 해맸다.

 

/var/jenkins_home/workspace/Petory/build/libs/Petory-0.0.1-SNAPSHOT.jar 

는 송신경로로 jenkins내에 저장된 jar 파일의 위치이다.

 

ec2-user@{탄력IP주소}:/home/ec2-user/petory

는 수신경로로 해당 jar 파일을 ec2 서버의 원하는 디렉토리로 옮기기 위한 경로이다.

 

 

ssh -o StrictHostKeyChecking=no ec2-user@{탄력IP주소} "nohup bash /home/ec2-user/deploy.sh &"

운영 서버에 미리 작성한 deploy.sh 파일을 실행하는 명령어이다.

 

 

CD 마지막라인에서 실행시켜주는  <deploy.sh>

#!/usr/bin/env bash
pid=$(pgrep -f Petory)
if [ -n "${pid}" ]
then
        sudo kill -9 ${pid}
        echo kill process ${pid}
else
        echo no process
fi

JAR_FILE=/home/ec2-user/petory/Petory-0.0.1-SNAPSHOT.jar
CONFIG_FILE=/home/ec2-user/petory/application-prod.yml

cp /jenkins/workspace/Petory/src/main/resources/application-prod.yml ${CONFIG_FILE}

chmod +x ${JAR_FILE}

java -jar \
    -Dspring.profiles.active=prod \
    -Dspring.config.location=file:${CONFIG_FILE} \
    ${JAR_FILE} >> application.log 2>> error.log &

exit 0

exit 0은 아래에서 자꾸 Wrapper ~~ 오류가 나서 스크립트가 정상 종료 되지 않아서 그런 것일까봐 추가해줬는데 없어도 정상 동작한다 ! 지워줌  

 

 

deploy.sh 파일을 그냥 ec2 콘솔에서 실행시키면 프로세스가 잘 돌아가는데 젠킨스에서 빌드로 하면 아래의 오류와 같이 계속 빌드가 실패했다. 

 

 

나는 Kill process때문에 문제라고 생각했는데 이 부분은 내가 deploy.sh에 작성해둔 이미 실행되고 있던 프로세스를 종료한 것이었다 ! Kill Process는 문제가 없었던 것

 

또 다른 문제 해결을 위해

deploy.sh 스크립트 마지막에 스크립트가 항상 성공적으로 종료되도록 exit 0을 추가했다. -> 이 문제 아니라 삭제

 

그래도 여전히 실패 그리고 시간도 엄청나게 오래걸렸다. kill process 이후로 빌드가 계속 진행되면서 11분 가량 걸렸다 !

 

➡️오류

wrapper script does not seem to be touching the log file in /var/jenkins_home/workspace/Petory@tmp/durable-99f5c0cf (JENKINS-48300: if on an extremely laggy filesystem, consider -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.HEARTBEAT_CHECK_INTERVAL=86400)

 

➡️원인

파이프라인의 제일 마지막 줄인

ssh -o StrictHostKeyChecking=no ec2-user@{탄력ip주소} 'BUILD_ID=dontKillMe nohup bash /home/ec2-user/deploy.sh &'

이 부분은 Jenkins가 원격 서버에서 스크립트를 실행하고, SSH 연결을 종료하게 만든다.

이 방식은 Jenkins가 실행 중인 스크립트의 상태를 지속적으로 모니터링 하거나, 실행 중인 스크립트의 출력을 로그 파일로 캡쳐하는데 문제가 있을 수 있다.

 

-> 이 경우, Jenkins는 "Wrapper script does not seem to be touching the log file" 오류를 발생시킨다.

이는 Jenkins가 스크립트의 상태를 확인하려고 하지만, 그 스크립트가 이미 백그라운드에서 실행 중이므로 상태를 추적하지 못 해 발생하는 오류이다.  

 

➡️해결

이 부분을 아래와 같이 바꿔 주었다.

ssh -o StrictHostKeyChecking=no ec2-user@{탄력 ip주소} BUILD_ID=dontKillMe nohup bash /home/ec2-user/deploy.sh > /home/ec2-user/deploy.log 2>&1 &

 

오류 안 나고 말끔하게 성공 !

 

 

➡️오류

> Task :test PetoryApplicationTests > contextLoads() FAILED java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:180 Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException at ConstructorResolver.java:795 Caused by: org.springframework.beans.factory.BeanCreationException at AbstractAutowireCapableBeanFactory.java:535 Caused by: java.lang.IllegalArgumentException at PropertyPlaceholderHelper.java:180 11 tests completed, 1 failed > Task :test FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > There were failing tests. See the report at: file:///var/jenkins_home/workspace/Petory/build/reports/tests/test/index.html

위의 오류를 해결하니까 파이프라인 콘솔에서 이번엔 테스트가 실패했다고 하면서 빌드가 실패했다.

로컬에서 작성해놓은 테스트 코드는 10개 밖에 없고 다 문제없이 성공했었다.

 

➡️원인

main에는 application.yml 파일이 존재하지만 test에는 application.yml 파일이 없어서 발생하는 문제라고 한다.

 

➡️해결

Application 테스트의 @SpringBootTest를 주석처리해서 해결하였다.

 

서브모듈 설정

서브모듈 설정은 내가 저번에 작성한 아래의 포스팅을 참조하였다.

배포 환경과 설정 파일 분리를 위한 작업) Private Repository 만들기 + Submodule 설정 (tistory.com)

 

배포 환경과 설정 파일 분리를 위한 작업) Private Repository 만들기 + Submodule 설정

DB에 접속하려면 DB 연결 정보가 담긴 설정파일이 필요한데 이 설정 파일을 비공개로 만들기 위해1. 별도의 Private Repository를 두어 설정 파일을 관리한다. 2. Main Repository에서 Private Repository를 Submodu

soni-developer.tistory.com

 

다만 여기서 배포 환경에서 절대로 진짜 서브모듈의 설정 파일을 참조하지 못하는 문제가 발생했는데

이전에도 같은 문제가 발생해서 저 포스팅에 Trouble shooting으로 정리를 해놓았지만 그때는 GitHubActions workflow ymml파일에 서브모듈 접근 토큰 값을 넣어줌으로써 해결했다.

 

하지만 지금은 Jenkins를 쓰고 있고 마찬가지로 파이프라인에 서브모듈 접근 Credentials 값을 넣어줬음에도 배포 환경에서 프로젝트 실행 시 로컬 application.yml 에 설정해둔 값인 h2 DB를 로드 시키는 것을 확인했다 ㅡㅡ

 

 

deploy.sh에 jar파일 실행 시 application-prod.yml을 사용하도록 설정

JAR_FILE=/home/ec2-user/petory/Petory-0.0.1-SNAPSHOT.jar
CONFIG_FILE=/home/ec2-user/petory/application-prod.yml

cp /jenkins/workspace/Petory/src/main/resources/application-prod.yml ${CONFIG_FILE}

chmod +x ${JAR_FILE}

nohup java -jar \
     -Dspring.profiles.active=prod \
     -Dspring.config.location=file:${CONFIG_FILE} \
     ${JAR_FILE} >> application.log 2>> error.log &

1. JAR_FILE 경로를 jenkins에서 빌드된 파일이 우리 ec2 서버로 전송되온 경로를 변수로 설정하였다. 

2. CONFIG_FILE : application-prod 파일이 있는 경로를 변수로 지정하였다.

3. jenkins 환경에서 빌드된 application-prod.yml 을 내가 설정해둔 경로로 복사하였다.

4. jar파일에 실행 권한을 부여하였다.

5. jar 파일을 실행하는데 옵션을 주었다.

 

환경에 따라 올바른 설정파일을 읽도록 유도하는 것을 'Profile'이라 부른다.

Spring은 Profile 사용을 위한 약속을 갖고 있다.


1) spring.profiles.active 속성에 값을 부여 

커맨드라인옵션 : --spring.profiles.active=dev
JVM vm옵션 :  -Dspring.profiles.active=dev

2. 파일 이름
application-{사용할 환경}.yml

 

 

-Dspring.profiles.active=prod

이 설정을 적용하려면 해당 yml 파일에 spring:config:activate:on-profile:prod 설정이 선행되어야 한다 !

로컬 or 배포환경 모두 이렇게만 해주면 mariaDB로 잘 저장이 된다 !

 

배포환경에서 로그를 확인해보니까 아래와 같이

h2-console(application.yml에 설정)과 mariaDB(application-prod.yml에 설정)가 함께 실행되었다.

2024-08-21T01:26:22.134+09:00  INFO 676092 --- [Petory] [           main] com.sj.Petory.PetoryApplication          : Starting PetoryApplication v0.0.1-SNAPSHOT using Java 17.0.12 with PID 676092 (/home/ec2-user/petory/Petory-0.0.1-SNAPSHOT.jar started by ec2-user in /home/ec2-user)
2024-08-21T01:26:22.140+09:00  INFO 676092 --- [Petory] [           main] com.sj.Petory.PetoryApplication          : The following 1 profile is active: "prod"
2024-08-21T01:26:24.855+09:00  INFO 676092 --- [Petory] [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2024-08-21T01:26:25.315+09:00  INFO 676092 --- [Petory] [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 441 ms. Found 3 JPA repository interfaces.
2024-08-21T01:26:27.273+09:00  INFO 676092 --- [Petory] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-08-21T01:26:27.312+09:00  INFO 676092 --- [Petory] [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-08-21T01:26:27.313+09:00  INFO 676092 --- [Petory] [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.26]
2024-08-21T01:26:27.663+09:00  INFO 676092 --- [Petory] [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-08-21T01:26:27.668+09:00  INFO 676092 --- [Petory] [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5373 ms
2024-08-21T01:26:27.797+09:00  INFO 676092 --- [Petory] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2024-08-21T01:26:28.067+09:00  INFO 676092 --- [Petory] [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection org.mariadb.jdbc.Connection@27bcb4ad
2024-08-21T01:26:28.071+09:00  INFO 676092 --- [Petory] [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2024-08-21T01:26:28.107+09:00  INFO 676092 --- [Petory] [           main] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at '/h2-console'. Database available at 'jdbc:mariadb://{rds엔드포인트}/petory?user=petory&password=***'
2024-08-21T01:26:28.541+09:00  INFO 676092 --- [Petory] [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2024-08-21T01:26:28.695+09:00  INFO 676092 --- [Petory] [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.5.2.Final
2024-08-21T01:26:28.785+09:00  INFO 676092 --- [Petory] [           main] o.h.c.internal.RegionFactoryInitiator    : HHH000026: Second-level cache disabled
2024-08-21T01:26:29.726+09:00  INFO 676092 --- [Petory] [           main] o.s.o.j.p.SpringPersistenceUnitInfo      : No LoadTimeWeaver setup: ignoring JPA class transformer
2024-08-21T01:26:33.052+09:00  INFO 676092 --- [Petory] [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2024-08-21T01:26:33.352+09:00  INFO 676092 --- [Petory] [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2024-08-21T01:26:34.891+09:00  WARN 676092 --- [Petory] [           main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2024-08-21T01:26:34.943+09:00  INFO 676092 --- [Petory] [           main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name userDetailsServiceImpl
2024-08-21T01:26:36.627+09:00  INFO 676092 --- [Petory] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2024-08-21T01:26:36.673+09:00  INFO 676092 --- [Petory] [           main] com.sj.Petory.PetoryApplication          : Started PetoryApplication in 16.035 seconds (process running for 17.635)
2024-08-21T01:27:37.791+09:00  INFO 676092 --- [Petory] [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-08-21T01:27:37.792+09:00  INFO 676092 --- [Petory] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-08-21T01:27:37.794+09:00  INFO 676092 --- [Petory] [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

이대로 사용해도 application-prod.yml에 설정해둔 mariaDB를 문제없이 사용할 수 있지만

 

-Dspring.config.location=file:${CONFIG_FILE}

config 파일 위치를 직접 설정해주는 이 옵션을 이용하면 아래와 같이 mariaDB만 연결됐다고 뜬다 !

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.3.2)

2024-08-21T01:38:51.344+09:00  INFO 676529 --- [           main] com.sj.Petory.PetoryApplication          : Starting PetoryApplication v0.0.1-SNAPSHOT using Java 17.0.12 with PID 676529 (/home/ec2-user/petory/Petory-0.0.1-SNAPSHOT.jar started by ec2-user in /home/ec2-user)
2024-08-21T01:38:51.352+09:00  INFO 676529 --- [           main] com.sj.Petory.PetoryApplication          : The following 1 profile is active: "prod"
2024-08-21T01:38:54.187+09:00  INFO 676529 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2024-08-21T01:38:54.679+09:00  INFO 676529 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 482 ms. Found 3 JPA repository interfaces.
2024-08-21T01:38:56.663+09:00  INFO 676529 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2024-08-21T01:38:56.705+09:00  INFO 676529 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-08-21T01:38:56.705+09:00  INFO 676529 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.26]
2024-08-21T01:38:57.027+09:00  INFO 676529 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-08-21T01:38:57.029+09:00  INFO 676529 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5532 ms
2024-08-21T01:38:57.475+09:00  INFO 676529 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2024-08-21T01:38:57.645+09:00  INFO 676529 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.5.2.Final
2024-08-21T01:38:57.756+09:00  INFO 676529 --- [           main] o.h.c.internal.RegionFactoryInitiator    : HHH000026: Second-level cache disabled
2024-08-21T01:38:58.645+09:00  INFO 676529 --- [           main] o.s.o.j.p.SpringPersistenceUnitInfo      : No LoadTimeWeaver setup: ignoring JPA class transformer
2024-08-21T01:38:58.722+09:00  INFO 676529 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2024-08-21T01:38:58.987+09:00  INFO 676529 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection org.mariadb.jdbc.Connection@7c682e26
2024-08-21T01:38:58.989+09:00  INFO 676529 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2024-08-21T01:39:02.371+09:00  INFO 676529 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
2024-08-21T01:39:02.665+09:00  INFO 676529 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2024-08-21T01:39:04.211+09:00  WARN 676529 --- [           main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
2024-08-21T01:39:04.264+09:00  INFO 676529 --- [           main] r$InitializeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name userDetailsServiceImpl
2024-08-21T01:39:05.901+09:00  INFO 676529 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2024-08-21T01:39:05.946+09:00  INFO 676529 --- [           main] com.sj.Petory.PetoryApplication          : Started PetoryApplication in 16.106 seconds (process running for 17.644)

 

엄청... 해결하면서는 어려웠는데 내가 application 실행 로그를 제대로 안 보고 위의 설정을 해줬음에도 자꾸  h2-console만 실행되었다고 봐서 적용이 안 됐다고 느낀 것 같다.... 

 

+ 정리

application-prod.yml에 

spring:

  config:

   activate:

       on-profile: prod

를 꼭해줘야 -Dspring.profiles.active=prod  JVM VM 옵션을 적용할 수 있다 !!!

 

+

-Dspring.config.location=classpath:/config/application-prod.yml 해주어도 위의 file:${CONFIG_FILE}해준 것과 동일한 동작을 시킬 수 있다.

 

classpath는 resources 위치를 의미하기 때문에 그 뒤의 경로만 적어주어도 된다. 처음엔 그렇게 했는데 위에서의 이유로 ,,, h2만 계속 동작한다고 생각하여서 별 짓 다해보다가 file위치를 절대경로로 다 적어준 방식으로 변경했었따.


참고

젠킨스 빌드 파일 위치룰 알려주신 정말 고마운 분...,,,,,,

https://onethejay.tistory.com/149

 

[Jenkins] 빌드부터 배포까지 2 - 작업 프로젝트 생성

젠킨스에서는 Maven, Gradle 모두 지원한다. 샘플 프로젝트는 gradle로 작업하여 gradle로 세팅하였음. 젠킨스 Gradle 세팅 젠킨스에서 Gradle을 사용하려면 젠킨스 환경에서 설정을 먼저 해주어야 한다. Je

onethejay.tistory.com

 

서브모듈

 

서브모듈 Credentials 적용

https://2022-momo.github.io/Frontend/20220815-submodule%EB%A1%9C-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0/#%EC%B2%98%EC%9D%8C%EC%97%90-%EC%8B%9C%EB%8F%84%ED%96%88%EB%8D%98-%EB%B0%A9%EB%B2%95

 

submodule로 환경 변수 관리하기

해당 포스트는 모모팀 크루 유세지가 작성했습니다. 이번 프로젝트의 릴리즈에서, 환경 변수의 관리 방법을 기존의 로컬 파일에 의존하던 방식에서 github의 submodule를 적용하여 관리하는 방법으

2022-momo.github.io

 

커맨드라인 옵션, JVM vm 옵션 설정 참고

https://lordofkangs.tistory.com/320

 

[SpringBoot] Profile 사용하기

app.jar가 있다. 개발환경에서는 app.jar는 dev 설정파일이 필요하다. 운영환경에서는 app.jar는 prd 설정파일이 필요하다. 환경에 따라 올바른 설정파일을 읽도록 유도하는 것을 'Profile'이라 부른다. Spr

lordofkangs.tistory.com

 

profile 관련 정보 참고

https://velog.io/@choidongkuen/spring-Spring-%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EB%82%98%EB%88%84%EA%B8%B0

 

[Spring] Spring System Properties 그리고 Spring Profiles에 대해

업로드중..

velog.io

 

이 블로그 참조해서 서브 모듈 설정파일 적용을 성공했습니다 ㅜㅜㅜ 감사합니다

https://velog.io/@kevstevie/%EC%84%A4%EC%A0%95-%ED%8C%8C%EC%9D%BC-%EB%B6%84%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-Submodule

 

설정 파일 분리를 위한 Submodule

민감한 정보를 가진 설정파일을 분리하기 위해 여러가지 방법이 있습니다.그 중 submodule을 사용하였고 적용 방법을 공유하고자 합니다.모듈안에 하위 모듈을 만들어 관리하는 방법입니다.이번

velog.io

 

728x90