이노베이션 캠프 W7

KIM YOUJEONG·2022년 8월 30일
0

이노베이션 캠프

목록 보기
6/6

Heroku 와 GitHub Action을 이용한 Spring 자동배포 설정 (+AWS RDS)


👀 설정 과정

  • build.gradle 설정
  • application-prod.yml 설정
  • Procfile 설정
  • Github, Heroku 환경변수 설정
  • workflow 설정

1. build.gradle 설정

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')


2. application-prod.yml 설정

기존 로컬에서 돌리던 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를 환경에 맞추어 쓴다


3. Procfile 설정

확장자 없이 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을 빌드했을 때 나오는 이름을 넣어주면 끝
    ex) -jar build/libs/Demo-0.0.1-SNAPSHOT.jar

4. GitHub, Heroku 환경변수 설정

1. application 파일에 넣었던 변수 설정

내가 ${ }에 넣었던 변수들(APPLICATION_DB_URL)은 Heroku에서 설정해주면 된다.

application-prod.yml에 넣어주었던 변수들을 빠짐없이 Config Vars에서 설정해주면 된다.

2. workflow 에 넣어줄 변수 설정

workflow 파일을 작성할 때 넣어줄 변수를 미리 세팅을 해주겠다.

Heroku Account settings에서 API Key를 복사한다.

GitHub 레포 Settings 탭에서 repository secret을 설정해준다.

HEROKU_API_KEY : 헤로쿠에서 복사한 API Key
HEROKU_APP_NAME : 배포할 헤로쿠 app 이름
HEROKU_EMAIL : 헤로쿠 이메일


💡 workflow 세팅하기 전에! 지금까지 세팅한 설정들은 깃허브에 push !


5. workflow 설정

이제 깃허브에서 자동으로 헤로쿠에 배포하도록 설정해주겠다.

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 부분 삭제
깃액션 실행될 당시에는 아마 그 디렉토리가 없어서 생기는 문제 같았다..?
근본적인 해결책이 아닌 뭐피하기느낌의 해결이지만... 한시가 급했기 때문에 넘어갔다.


AWS RDS 연결 도중 생긴 문제


🚫 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 넣어봤던거 삭제

profile
공부합니다📚

0개의 댓글