Git

Github Actions의 환경 변수 참조 에러 Github Secrets 사용으로 해결하기

waVwe 2024. 10. 18. 16:40
728x90
반응형

 

🚧 문제 상황

 

 

여느 때와 같이 pull request를 올리는데 github actions의 CI 테스트를 통과하지 못 함.

 

 

Details를 눌러 문제 상황을 살펴보니 두 가지 예외가 발생했다고 한다.

 

 

  • BeanCreationException: Spring 컨텍스트에서 빈을 생성할 때 문제 발생. 보통 의존성 주입 과정에서 문제가 생겼음을 의미.
  • IllegalArgumentException: PropertyPlaceholderHelper에서 발생했는데, 주로 application.properties 또는 application.yml 파일에 정의된 속성이 잘못되었거나 누락되었음을 나타냄.

 

 


 

 

⛓️‍💥 원인 파악

 

 

문제가 발생한 notification-service에서 application.yml과 함께 문제가 생길 부분은 이 부분 밖에 없었다.

 

# NotificationController

@Value("${slack.workspaceUrl}")
private String slackWorkspaceUrl;


# application-dev.yml

slack:
  workspaceUrl: ${SLACK_WORKSPACE_URL}

 

 

application.yml을 dev와 prod 버전으로 각각 나눠서 만들어두었는데 그 중 application-dev.yml 파일에 적힌 slack.workspaceUrl을 컨트롤러에서 @Value로 참조 할 때 안에 값이 없어서 참조 에러 발생 + dev 파일 안에서도 환경 변수로 넘어온 값이 없어서 에러 발생.

 

현재 프로젝트에서는 포트 번호 및 DB 아이디/비번 또는 슬랙 웹훅 Url과 같이 보안상 민감한 정보들을 .env 파일에 적어 docker에 환경변수로 값을 넘겨주고 있다.

 

 

# docker-compose.service.yml

services:
  notification-service:
    build:
      context: ../notification-service
      dockerfile: Dockerfile
    container_name: notification-service
    ports:
      - "${NOTIFICATION_SERVER_PORT}:${NOTIFICATION_SERVER_PORT}"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - NOTIFICATION_SERVER_PORT=${NOTIFICATION_SERVER_PORT}

# ... 생략 ...

      - KAFKA_BOOTSTRAP_SERVERS=${KAFKA_BOOTSTRAP_SERVERS}
      - SLACK_WORKSPACE_URL=${SLACK_WORKSPACE_URL}
    depends_on:
      - eureka-server
# application-prod.yml

spring:
  application:
    name: notification-service
  datasource:
    url: ${NOTIFICATION_DB_URL}
    username: ${NOTIFICATION_DB_USERNAME}
    password: ${NOTIFICATION_DB_PASSWORD}
    driver-class-name: org.postgresql.Driver

 

 

그 값들은 docker 내에서 환경 변수로 사용되거나 application-prod.yml에서 위와 같이 민감한 정보들을 가리는 용도로 사용하고 있는데 .env 파일을 깃헙에 푸시할 때는 .gitignore로 올리지 않으니까 참조 문제가 생긴 것 같다.

 

 

name: Integrated Docker Services Test

# ... 생략 ...
      
      - name: Build Gradle Project
        run: ./gradlew build -Dspring.profiles.active=dev
        
        
name: Integrated Services Test

# ... 생략 ...

      - name: Build Gradle Project
        run: ./gradlew build -Dspring.profiles.active=dev

 

 

또한 workflow 파일을 뜯어보면 에러가 발생한 두 workflow 파일 모두 빌드 설정을 dev를 기준으로 하기 때문에 환경 변수가 잔뜩 쓰인 application-prod.yml이 아닌 applicaiton-dev.yml가 실행되는걸 알 수 있는데

 

 

# application-dev.yml

slack:
  workspaceUrl: ${SLACK_WORKSPACE_URL}

 

유일하게 notification-service의 application-dev.yml에 환경 변수가 쓰인 것이다...

 

 

 


 

 

⛓️ 해결 과정

 

💡 Github Secrets 사용으로 해결

 

 

Github Secrets

 

secrets는 깃헙에서 제공하는 기능으로 민감한 정보를 안전하게 저장하고 관리할 수 있게 해주며 깃헙의 workflow 내에서 환경 변수로 사용 할 수 있게 해준다.

 

Settings > Secrets and variables > Actions 에서 .env 파일에서와 똑같이 환경 변수를 작성해주면 workflow 파일 안에서 secrets. 로 불러와 사용 할 수 있다.

 

name: Integrated Services Test

on:
  push:
    branches: [ "develop" ]
  pull_request:
    branches: [ "develop" ]

jobs:
  build:

    runs-on: ubuntu-latest
    env:
      SLACK_WORKSPACE_URL: ${{ secrets.SLACK_WORKSPACE_URL }}

 

 

위와 같이 추가해주면 깃헙 액션으로 CI 테스트 시 에러 발생하지 않음!

 

 

 

 

굿

 

728x90
반응형