발생
학습 커뮤니티 프로젝트 진행 도중 CI/CD 구축 후 jar 파일 실행 시 해당 오류가 발생하였다. jar를 실행하자마자 ps -ef 를 통해 jar 파일 확인을 하였으니..잘 되는 줄 알았지만 아니었다.
에러 로그
Caused by: org.springframework.util.PlaceholderResolutionException: Could not resolve placeholder 'jwt.expiration' in value "${jwt.expiration}"
application.yml에 선언된 환경 변수를 읽지 못하여 발생하는 오류이다.
하지만 EC2 인스턴스 내에 application.yml 파일이 정상적으로 존재하였고, .bashrc 내부에 환경 변수를 설정해주었지만 동일한 오류가 지속적으로 발생하였다. 구글링 결과 CodeDeploy를 통해 배포를 진행하면 .bashrc를 읽지 못한다는 여러 글들을 발견하였다.(원인은 모름)
해결
1) AWS Parameter Store 사용
자세한 내용은 여기에 게시하였습니다.
2) GitHub Secrets에 application.yml 파일 생성
GitHub Secrets에 application.yml 파일을 생성해 주었다.
# script/deploy.sh
- name: Make application.yml
run: |
mkdir -p src/main/resources
echo "${{ secrets.APPLICATION_DEV_WITH_AWS }}" > src/main/resources/application.yml
find src
또한 배포 시 해당 파일을 생성하도록 deploy.sh을 수정하였다.
이후 배포를 진행하였지만 이번에는 빌드 조차 되지 않았다. 해결법을 찾던 중 Secrets에 application.yml 파일 내용 작성 시 Base64로 인코딩하여 등록해야 한다는 글을 발견하여 진행해보았다.
3) application.yml 파일 Base64로 인코딩
기존에 GitHup Secrets에 생성한 APPLICATION_DEV_WITH_AWS를 인코딩 한 값으로 수정하였다.
# scripts/deploy.sh
- name: Make application.yml
run: |
mkdir -p src/main/resources
echo "${{ secrets.APPLICATION_DEV_WITH_AWS }}" | base64 --decode > src/main/resources/application.yml
find src
또한 deploy.sh에서 인코딩하는 부분을 추가해 주었다. 이후 정상 빌드 및 배포 되었으며 jar 파일도 정상적으로 실행되었다! 전부 게시는 못하였지만 해결하는데 3일이나 걸렸다.