이전 글에서 GitHub Actions를 활용한 CI를 다룬 데 이어, 이번에는 Elastic Beanstalk에 배포하는 방법과 내가 겪은 트러블슈팅을 공유하고자 한다.
작고 간단한 트러블슈팅은 이 포스트에 포함할 예정이며, 내용이 많고 복잡한 트러블슈팅은 별도의 포스트로 작성할 계획이다.
(참고) 이전 글 : [GitHub Actions][Spring Boot] CI 시도하기 + build 실패 트러블슈팅
[GitHub Actions][Spring Boot] CI 시도하기 + build 실패 트러블슈팅
👀 GitHub Actions를 이용한 CI + 문제 상황프로젝트의 루트에 .github 폴더를 만들고, 그 안에 workflows 폴더를 만든다.하위에 ci를 담당하는 ci.yml 파일을 만든다.그리고 ci.yml의 내용을 작성한다.# 워크
cr0c0.tistory.com
📜 전체 Workflow 코드
cicd.yml
# 워크플로 이름
name : CI/CD
# 워크플로 시작 조건 - main 브랜치에 푸시할 때
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest # 실행 환경
#실행 스텝
steps:
- uses: actions/checkout@v3 # 체크아웃
- uses: actions/setup-java@v3 # java의 환경 설정 - Amazon Corretto OpenJDK 17버전
with:
distribution: 'corretto'
java-version: '17'
- name: Grant execute permission for gradlew # gradlew 파일에 실행 권한 부여. Gradle Wrapper로 빌드를 수행하기 위함
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew clean build -Djasypt.encryptor.password=${{secrets.JASYPT_ENCRYPTOR_PASSWORD}}
# 현재 시간 가져오기
- name: Get current time
uses: josStorer/get-current-time@v2.0.2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
# 배포용 패키지 경로 저장
- name: Set artifact
run: echo "artifact=$(ls ./build/libs)" >> $GITHUB_ENV
# 빈스토크 배포
- name: Beanstalk Deploy
uses: einaregilsson/beanstalk-deploy@v20
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: [EB 애플리케이션 이름]
environment_name: [EB 환경 이름]
version_label: github-action-${{ steps.current-time.outputs.formattedTime }}
region: ap-northeast-2
deployment_package: ./build/libs/${{env.artifact}}
이전 CI 내용에 덧붙여서, EB에 배포하는 코드를 추가했다.
워크플로 내용에는 문제가 없으나, 급하게 하느라 발생한 실수가 몇 가지 있었다.
💥 트러블슈팅 1. Actions Secrets를 조회할 수 없는 문제
이전 글에서 언급한 것처럼, 애플리케이션 테스트 및 빌드에 필요한 환경 변수가 있다면 이를 GitHub Repository에 직접 설정해주어야 한다.
그런데 분명히 저장해주었는데도 Secrets를 불러오지 못해 테스트 과정에서 계속 에러가 발생하는 것이다.
✅ 원인 : Environments Secrets가 아니라 Repository Secrets에 설정했어야 했다!
GitHub Repository - Setting - Secrets and variables - Actions에서 Repository Secrets에 설정했어야 했는데, Environment Secrets에 설정해두고 워크플로에 Environment명은 지정하지 않아서 생긴 문제였다.
Environment Secrets는 지우고 Repository Secrets에 다시 설정하니 값을 잘 불러올 수 있었다.
(참고 1) Repository Secrets와 Environment Secrets의 차이
1. Repository Secrets
- Repository의 모든 워크플로우와 액션에서 사용 가능
- 해당 Repository의 모든 사용자 접근 가능
2. Environment Secrets
- 특정 환경(예: 개발, 스테이징, 프로덕션 등)에 대해 설정
- 환경에 따라 다른 비밀 정보를 설정할 수 있어, 보다 세분화된 관리 가능
- 특정 환경에서만 사용 가능하며, 환경에 접근할 수 있는 사용자만 접근 가능
(참고 2) Environment Secrets를 사용하려면?
jobs:
build:
runs-on: ubuntu-latest # 실행 환경
environment: my_environment # 생성한 환경 이름
steps:
...
워크플로에 위와 같이 환경 이름을 명시해주면 된다.
💥 트러블슈팅 2. 빌드 후 생성된 파일명을 찾을 수 없는 문제
Error: Unable to process file command 'env' successfully.
Error: Invalid format [파일명]
파일명이 문제인가 싶어 이렇게 저렇게 바꿔보기도 하고 명령어도 수정해보고 여러 노력을 해봤는데..
✅ 원인 : 빌드 후 ~plain.jar 파일이 같이 생성되었기 때문이다!
plain.jar 파일은 Java 애플리케이션의 코드와 리소스는 포함하지만 의존성은 포함되지 않은 jar 파일이다. 나는 프로젝트 생성 후 plain 파일이 생성되지 않도록 설정해놓는데, 이번 프로젝트에서는 깜빡 잊고 설정해두지 않았던 것이다.
빌드 결과 파일이 하나가 아니기 때문에 ls ./build/libs 명령에서 여러 개의 파일명이 반환되고, GITHUB_ENV에 여러 값을 한 줄로 설정하려는 과정에서 에러가 발생하는 것이다.
빌드시 plain.jar 파일을 생성하지 않도록 하기 위해 build.gradle에 다음 부분을 추가했다.
build.gradle
jar {
enabled = false;
}
'Java > Spring Framework' 카테고리의 다른 글
[Spring Boot] HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) (0) | 2024.08.20 |
---|---|
[Spring Boot] Jasypt로 yml 암호화하기 (0) | 2024.05.03 |
[Spring Boot] IntelliJ에서 스프링 부트 프로젝트 시작하기 (0) | 2024.05.03 |
[Spring] 테스트 환경에서 별도의 데이터베이스 연결하기 (0) | 2024.04.21 |
[Spring Boot] 테스트 코드 작성하기 (JUnit, AssertJ, Mockito) (0) | 2024.04.19 |