🚧 문제 상황
여느 때와 같이 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 테스트 시 에러 발생하지 않음!
굿
'Git' 카테고리의 다른 글
[🐙 Git & Github] 깃 명령어 사용해서 특정 브랜치로 이동하기 (2) | 2024.10.07 |
---|---|
[💡 트러블 슈팅] Github에서 머지 충돌 일어났을 때 해결하기 Can't automatically merge (0) | 2024.10.02 |
[🐙 Git & Github] 깃헙 이슈 이해하기 + Issue & PR Template 만들기 (1) | 2024.09.26 |
[🐙 Git & Github] 깃 컨벤션으로 커밋 메세지 형식 통일하기 (0) | 2024.09.26 |
[🐙 Git & Github ] Github Actions 을 활용한 CI/CD 파이프라인 구성하기 (0) | 2024.08.17 |