Github action 환경변수 설정

이정연·2023년 4월 17일
3

project034

목록 보기
2/10

인텔리제이를 이용하여 환경변수를 설정할때는 보통
application.yml 이나 application.properies 에 선언하고 이용하게된다.

환경변수에는 rds에 대한 암호도 들어가있기때문에 github같이 공용 repository에는 올리지 않는게 좋다.

환경변수를 따로 관리하는 방법에는 내가 아는 것은 크게 2가지가있다.
1. aws의 parameter store이용
2. github secret key 이용

환경변수는 application.yml에 다음과 같이 저장하고 진행했다.

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: ${rds.host}
    username: ${rds.username}
    password: ${rds.password}

  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    hibernate:
      ddl-auto: update  # (1) 스키마 자동 생성
    show-sql: true      # (2) SQL 쿼리 출력
    properties:
      hibernate:
        format_sql: true  # (3) SQL pretty print
server:
  servlet:
    encoding:
      force-response: true

logging:
  level:
    org:
      springframework:
      orm:
        jpa: DEBUG
jwt:
  key: ${jwt.key}
  access-token-expiration-minutes: 30 #30.
  refresh-token-expiration-minutes: 420 # 420분

mail:
  address:
    admin: admin@gmail.com

naver:
  map:
    client:
      id: ${NAVER_CLIENT_ID}
      secret: ${NAVER_CLIENT_SECRET}

문제

  • 처음엔 parameter store로 진행했었는데, github-action이 성공적으로 잘 되어도 ec2에서 확인해봤을때 계속해서 환경변수를 받아오지 못하여 애플리케이션 실행과정에서 database와의 연결 오류때문에 실행이 안되는 문제가 생겼다.

  • appspec.yml 에서 스크립트를 실행명령을 내리는데, 스크립트에 다음과같이 정의 해줬기 때문에 실행오류에대한 로그는 모두 trip.log에 저장되어 cat명령어로 확인 할 수 있었다.


#!/usr/bin/env bash

PROJECT_ROOT="/home/ubuntu/action"
JAR_FILE="$PROJECT_ROOT/spring-webapp.jar"

APP_LOG="$PROJECT_ROOT/trip.log"
ERROR_LOG="$PROJECT_ROOT/deploy_err.log"
DEPLOY_LOG="$PROJECT_ROOT/deploy.log"

TIME_NOW=$(date +%c)

# build 파일 복사
echo "$TIME_NOW > $JAR_FILE 파일 복사" >> $DEPLOY_LOG
cp $PROJECT_ROOT/Server/tripAdvisor/tripAdvisor/build/libs/*.jar $JAR_FILE

# jar 파일 실행
echo "$TIME_NOW > $JAR_FILE 파일 실행" >> $DEPLOY_LOG
nohup java -jar $JAR_FILE > $APP_LOG 2> $ERROR_LOG &

CURRENT_PID=$(pgrep -f $JAR_FILE)
echo "$TIME_NOW > 실행된 프로세스 아이디 $CURRENT_PID 입니다." >> $DEPLOY_LOG

github action에서는 빌드 후에 zip 파일로 전달하도록 되어있다. 따라서 빌드과정에서 환경변수를 전달해야 될 것 같다고 생각했다. EC2로 전달되는 파일은 jar파일이 때문에 EC2내부에서 수동으로 빌드를 진행하지 않기 때문이다.

해결

  • 그래서 결국 github secret key를 이용하기로 했고, 그러기 위해서는 git에 저장된 secret key를 불러와야 하기때문에 경로지정을 꼭 해줘야 했다.

  • git에서 다음과 같이 Settings-Secrets and variables-Actions 에들어가서 secret key를 새로 만들어준다.

  • 내가 만든 키는 JWT_KEY / NAVER_CLIENT_ID / NAVER_CLIENT_SECRET / RDS_HOST / RDS_PASSWORD / RDS_USERNAME 이다

그런 다음 gradle.yml에서 해당 키들이 어디에 사용될 지 경로지정을 해주고 불러오기만하면된다. 코드는 아래와 같다.

env:
  S3_BUCKET_NAME: jungyeon222
  RESOURCE_PATH: ./Server/tripAdvisor/tripAdvisor/src/main/resources/application.yml

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
        
    - name: Set yml file 
      uses: microsoft/variable-substitution@v1
      with:
        files: ${{ env.RESOURCE_PATH }} 
      env:
        spring.datasource.url: ${{ secrets.RDS_HOST }} 
        spring.datasource.username: ${{ secrets.RDS_USERNAME }} 
        spring.datasource.password: ${{ secrets.RDS_PASSWORD }} 
        jwt.key: ${{ secrets.JWT_KEY }}
        naver.map.client.id: ${{ secrets.NAVER_CLIENT_ID }}
        naver.map.client.secret: ${{ secrets.NAVER_CLIENT_SECRET }}
        
    - name: Add permission
      run: chmod +x gradlew
      working-directory: ./Server/tripAdvisor/tripAdvisor
    - name: Build with Gradle
#       uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
#       with:
#         arguments: build
      run : ./gradlew clean build --exclude-task test
      working-directory: ./Server/tripAdvisor/tripAdvisor
    
    # build한 후 프로젝트를 압축합니다.
    - name: Make zip file
      run: zip -r ./tripAdvisor.zip .
      shell: bash
  • 맨위 env 하위에 RESOURCE_PATH를 지정해주고 그쪽으로 불러온다고 지정해준다.
  • 그다음 job-build 하위의 env에서 application.yml에서 환경변수로 지정하고자 했던 값들을 불러오면 된다.
  • 나의 경우 rds의 url, username, password, JWT key, naver 위치정보를 이용하기위한 ID 와 secret key를 등록하여 이용했다.
  • 이렇게하면 빌드 될때 저 값들을 자동으로 불러와서 채운 다음 빌드된다.

  • 깃헙 액션 후 EC2 에서 확인했을 때 잘 실행 되는것을 볼 수 있다.
profile
반갑습니다.

2개의 댓글

comment-user-thumbnail
2023년 6월 7일

감사합니다... 덕분에 해결했습니다.

답글 달기
comment-user-thumbnail
2023년 8월 22일

RESOURCE_PATH로 사용하신 경로는 ec2상의 application.yml의 경로인가요? 아니면 github 레포지토리에 업로드된 application.yml의 경로인가요?

답글 달기