-
Notifications
You must be signed in to change notification settings - Fork 2
Heroku를 이용한 CI CD 시 발생한 문제
./gradlew build
명령 입력 시 ClassNotFound 문제가 발생하고 java 환경변수를 읽지 못하는 것으로 생각되는 문제 발생함
git action을 추가하고 heroku와 git action에서 모두 빌드를 성공했지만, 실행되지 않는 문제 발생.
heroku logs --tail --app bokzip2
하여 heroku log를 살펴보니 다음과 같이 no main manifest attribute in 에러
가 발생함을 볼 수 있음
heroku는 Procfile에 있는 jar 파일을 찾아 실행시켜주는 방식이라고 한다 ..... 근데 저번엔 procfile을 만들지 않은 채 두시간을 삽질 했기에 아무리 땅을 파도 해결이 안되었던 것임.........!!!!!!!!!!!!!!!!!!!
intellj를 키고 오른쪽 gradle 탭을 연 다음 task -> bootjar를 더블 클릭하여 jar 파일 생성했다.
no main manifest attribute in 에러는 spring 애플리케이션을 빌드한 결과물로 나온 jar파일에서 처음 호출할 Main 메소드를 찾지 못했다는 에러
java -jar
를 사용해서 jar파일을 실행시키면 JVM이 jar파일의 Main메소드를 찾아서 호출한다.
이때, Main메소드의 위치는 MANIFEST.MF
라는 파일에 명시가 되어있는데 이 파일에서 Main메소드의 위치를 찾지 못한다는 에러이다.
이를 해결하기 위해 다음 코드를 build.gradle
에 추가해서 메인클래스 이름을 명시해주었다.
//bootJar를 활성화 시키기 위해 jar는 enabled를 false로 줌
tasks.jar {
enabled = false
}
tasks.bootJar {
enabled = true
archiveClassifier.set("boot")
mainClassName = "bokzip.back.BackApplication"
}
번외로 jar 파일이란?
jar
Java Archieve
을 줄여서 jar라고 한다.Java 어플리케이션을 배포하고 동작할 수 있는 형태로 패키징(압축)한 파일 형태다.
Java 클래스 파일, EJB, 리소스, 설정, 의존 파일 등을 포함한다.
path 등의 경로를 유지하기 때문에, JVM 위에서 단독으로 실행 가능하다.
spring boot 2.5.0버전 이상부터는 gradle로 빌드를 할때 jar파일이 2개 생성된다.
(1) 앱이름.jar -> bootJar Task로 생성된것
(2) 앱이름-plain.jar -> build Task로 생성된것
(1)의 .jar는 해당 프로젝트에 필요한 모든 의존성이 같이 추가된것으로 MANIFEST.MF까지 모두 정상적인 형태로 나오지만, (2)의 plain.jar는 의존성을 제외하고 딱 프로젝트에 있는 자원들만 jar로 만든것으로 spring 관련 의존성이 빠져 MANIFEST.MF에 Main메소드의 위치가 나오지 않는다.
결론! bootJar task로 jar파일 생성한 걸 target 폴더에 넣어두어야 heroku에서 배포된다! -> 결론! bootJar task로 jar파일 생성되도록 변경한다 target폴더에 안넣어놔도 됨!! (21.12.07)
먼저, 지난번 신나게 삽질한 것은 .gitignore에 build/ 폴더가 포함되어 있어 lib 파일은 안올라가므로 우리는 이제껏 빌드는 성공시켰지만, jar 파일을 실행시키지 못했던 문제였음!
.gitignore는 그대로 냅두고, target 폴더를 만들어 jar파일을 넣어두어 heroku가 실행시킬 수 있도록 했다!
port 정보는 application.properties 에 적어주었기 때문에 port 정보 설정은 생략하고,
먼저 src 디렉토리가 있는 위치에 target 디렉토리를 생성했다.
그 다음 bootJar로 생성한 build/libs/ 안에 있는 jar 파일을 복사해서 target/에 넣어둔 다음 heroku에서 deploy 해보니 성공~ ...
heroku restart
heroku open #서버 실행 확인
heroku logs --tail #서버 실행시 로그보기
heroku ps:stop web.1 #서버 실행 종료
heroku apps #헤로쿠 서버 실행
heroku ps:scale web=1 #서버 scale up
heroku ps:scale web=0 #서버 scale down
heroku ps #상태확인