지난 Jenkins 설치에 이어 파이프라인 구축을 해보려고 한다.
Jenkins로 CI/CD 구축하기 - (1) Jenkis 설치 및 SWAP 메모리 할당 (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 관리 - CredentialsStores 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)
다만 여기서 배포 환경에서 절대로 진짜 서브모듈의 설정 파일을 참조하지 못하는 문제가 발생했는데
이전에도 같은 문제가 발생해서 저 포스팅에 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
서브모듈
서브모듈 Credentials 적용
커맨드라인 옵션, JVM vm 옵션 설정 참고
https://lordofkangs.tistory.com/320
profile 관련 정보 참고
이 블로그 참조해서 서브 모듈 설정파일 적용을 성공했습니다 ㅜㅜㅜ 감사합니다
'공부 > CI & CD' 카테고리의 다른 글
Jenkins로 CI/CD 구축하기 - (3) Jenkis Webhook 등록으로 Repo에 Push 하면 자동빌드 하기 (4) | 2024.08.09 |
---|---|
Jenkins로 CI/CD 구축하기 - (1) EC2 docker에 Jenkis 설치 및 SWAP 메모리 할당 (0) | 2024.08.07 |
GiftFunding) GitHub Actions CI/CD 적용하기[2] - CD 적용(2) (0) | 2024.06.29 |
GiftFunding) GitHub Actions CI/CD 적용하기[2] - CD 적용(1) (0) | 2024.06.29 |
배포 환경과 설정 파일 분리를 위한 작업) Private Repository 만들기 + Submodule 설정 (0) | 2024.06.29 |