👀 설정 과정
jar {
enabled = false
manifest {
attributes('Main-Class': '패키지.메인클래스')
}
}
build.gradle에 코드 추가하기 (manifest는 없어도 작동한다)
패키지
는 src/main/java 아래있는 패키지이름(com.example.demo)
메인클래스
는 우리가 실행시키는 클래스이름(DemoApplication)
ex) attributes('Main-Class': 'com.example.demo.DemoApplication')
기존 로컬에서 돌리던 application.yml 또는 properties 파일에는 민감한 정보들이 많이 있다! 그래서 우리가 git hub에 올릴 yml/properties 파일을 따로 만들어준다. 그것이 이제 application-{ }.yml
accessKey같이 민감한 부분들을 변수로 설정해주면 된다.
server:
port: ${port:8080}
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${APPLICATION_DB_URL}
username: ${APPLICATION_DB_USERNAME}
password: ${APPLICATION_DB_PASSWORD}
.
.
.
cloud:
aws:
credentials:
accessKey: ${APPLICATION_ACCESSKEY}
secretKey: ${APPLICATION_SECRETKEY}
s3:
bucket: ${APPLICATION_BUCKET}
region:
static: ap-northeast-2
jwt:
secret: ${APPLICATION_JWT}
보기 편하라고 ${변수}를 ${ 변수 }로 넣었다간 에러가 난다.
일단 나는 그랬음... 조심!!
application-prod에서의 prod는 정해진 부분이 아니다!
관용적으로 local, dev, prod를 환경에 맞추어 쓴다
확장자 없이 Procfile 파일을 하나 만들어준다.
( procfile이 아닌 Procfile이다! 대문자 주의 )
web: java $JAVA_OPTS -Dserver.port=$PORT -Dspring.profiles.active=prod -Duwser.timezone=Asia/Seoul -jar build/libs/*.jar
-Dspring.profiles.active=prod
에서의 prod는 위에서 말했다시피 정해진 부분이 아니다! application-{ }.yml 에서의 { }부분을 적어주면 된다.-jar build/libs/*.jar
에서의 * 은 직접 넣어주면 된다.-jar build/libs/Demo-0.0.1-SNAPSHOT.jar
내가 ${ }에 넣었던 변수들(APPLICATION_DB_URL)은 Heroku에서 설정해주면 된다.
application-prod.yml
에 넣어주었던 변수들을 빠짐없이 Config Vars에서 설정해주면 된다.
workflow 파일을 작성할 때 넣어줄 변수를 미리 세팅을 해주겠다.
Heroku Account settings에서 API Key를 복사한다.
GitHub 레포 Settings 탭에서 repository secret을 설정해준다.
HEROKU_API_KEY
: 헤로쿠에서 복사한 API Key
HEROKU_APP_NAME
: 배포할 헤로쿠 app 이름
HEROKU_EMAIL
: 헤로쿠 이메일
💡 workflow 세팅하기 전에! 지금까지 세팅한 설정들은 깃허브에 push !
이제 깃허브에서 자동으로 헤로쿠에 배포하도록 설정해주겠다.
GitHub 레포 Actions 탭에서 set up a work flow yourself
를 눌러준다.
자동으로 쓰여진 애들 싹다 지우고 집어넣는다.
name: Deploy to Heroku
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Generate system.properties
run:
echo "java.runtime.version=11" >> system.properties
- uses: akhileshns/heroku-deploy@v3.12.12
with:
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
heroku_app_name: ${{secrets.HEROKU_APP_NAME}}
heroku_email: ${{secrets.HEROKU_EMAIL}}
name
,- name
: 맘대로 쓰시길...on.push.branches
,on.pull_request.branches
: branch에 push/pull_request가 진행될 때마다 실행되거라~run echo "어쩌고" >> system.properties
: 실행될 때마다 system.properties를 만들어서 "어쩌고"를 넣어줘 ( 버전맞게알아서ㄱ )
- 아예 system.properties를 만들어서 깃헙에 올리고 생략해도 됨
알아서 뺄건 빼고 추가할건 추가하고 Start commit 누르면
.
.
.
짜잔~~ 자동배포 완성!
헤로쿠 로그는 CLI 통해서 보면 된다.
딴 방법 있으면 알아서ㄱ
main에 바로 올라가지는게 싫다면 로컬에서 만들고 깃헙에 올리면 된다.
작동이 잘 안 될 때는 헤로쿠 log를 잘 살펴봐야한다.
위에서부터 차근차근 INFO가 아닌 부분(WARN, ERROR)을 꼼꼼히 찾아봐야한다.
왜냐하면 맨 아래있는 ERROR 부분만 보면서 찾아봤는데 알고보니 문제 포인트는 위쪽 WARN에 있다거나 하는 오류가 굉장히 많았어서...
🚫 ERROR
코드를 입력하세요
🔥 SOLVE
🚫 ERROR
cd: too many arguments
깃액션 코드중에 cd "${{ secrets.~ }}"로 디렉토리 이동하는 부분이 있었는데
그 경로를 찾아가는데 있어 에러 발생
env.properties 또는 application.yml 파일을 이 과정에서 만들어주기 위해 넣었던 코드였으나...
나중에 가서야 헤로쿠에서 환경변수를 설정할 수 있다는 사실을 알았다.
🔥 SOLVE
경로 이동하는 cd 부분 삭제
깃액션 실행될 당시에는 아마 그 디렉토리가 없어서 생기는 문제 같았다..?
근본적인 해결책이 아닌 뭐피하기느낌의 해결이지만... 한시가 급했기 때문에 넘어갔다.
🚫 ERROR
No active profile set, falling back to 1 default profile: "default"
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
🔥 SOLVE
procfile -> Procfile
heroku procfile 문제 - 인프런
🚫 ERROR
org.springframework.boot.SpringApplication - Application run failed
org.yaml.snakeyaml.scanner.ScannerException: mapping values are not allowed here
in 'reader', line 19, column 19:
open-in-view: false
^
🔥 SOLVE
yaml, yml 파일 내에서 들여쓰기 문제
🚫 ERROR
org.springframework.boot.SpringApplication - Application run failed
org.springframework.boot.context.config.InvalidConfigDataPropertyException:
Property 'spring.profiles.active' imported from location
'class path resource [application-prod.yaml]' is invalid in a profile
specific resource [origin: class path resource [application-prod.yaml]
from 이름-0.0.1-SNAPSHOT.jar - 6:13]
🔥 SOLVE
에러 슈팅중 application-prod에 spring.profile.active=prod 넣어봤던거 삭제