미니프로젝트 마지막날.
3일 내내 CI/CD와 싸웠다. 이틀은 S3에 codeploy로 하려다가 실패했고 마지막날은 Elastic Beanstalk로 하려다가 긴 실패끝에 겨우 성공했다.
사실 코드 자체는 어렵지 않았다. 하지만 Github에 public으로 자료를 올리는 과정에서 Application.properties에 있는 DB 자료를 숨기려다 보니까 Github Secrets에 등록해서 쓴 주소가 제대로 작동하지 않는 에러때문에 계속 실패를 했다.
일단은 github에 그대로 노출되게 push를 해서 구현에 성공을 하긴 했다.
main.yml 코드
name: Spring Boot & Gradle CI/CD
on:
push:
branches: [ "master" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
# properties를 통째로 secret에 등록해서 사용하려다가 실패. 제대로 인식 못함
# - name: Set up environment variables
# env:
# APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES }}
# run: echo "${APPLICATION_PROPERTIES}" > ./src/main/resources/application.properties
# - name: Verify the contents of the application.properties file
# run: cat ./src/main/resources/application.properties
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew clean build
shell: bash
- name: Get current time
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
# 전송할 파일을 담을 디렉토리 생성 및 압축파일 형태로 전달
- name: Generate deployment package
run: |
mkdir -p deploy
cp build/libs/*.jar deploy/application.jar
cp Procfile deploy/Procfile
cp -r .ebextensions deploy/.ebextensions
cd deploy && zip -r deploy.zip .
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v20
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: mini
environment_name: Mini-env
version_label: github-action-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: deploy/deploy.zip
web: appstart
files:
"/sbin/appstart" :
mode: "000755"
owner: webapp
group: webapp
content: |
#!/usr/bin/env bash
JAR_PATH=/var/app/current/application.jar
# run app
killall java
java -Dfile.encoding=UTF-8 -jar $JAR_PATH
이렇게 구성해서 배포가 되는 것 까진 확인했다.
하지만 Elastic Beanstalk에서 자꾸 환경이 '심각'으로 뜨는 점과 db정보를 결국 못숨겼다는 점에서 아쉬움이 따른다. 다음번 프로젝트때는 좀 더 깔끔하게 구현하도록 해봐야겠다.
EB에서 환경변수를 설정해 RDS 정보를 넣는 방법도 있다.
참고 사이트
health에 문제가 생길경우 처리하는 방법도 위의 사이트에 있다.
다음번엔 위의 방식으로 시도해보면 좋을 것 같다.