9. Github Action을 통한 최종 배포 진행
지난번 단계에서 RDS, 엘라스틱빈스톡 환경을 구축했다. 이번에 Github Action을 통한 최종 배포를 진행한다.
Github Action은 테스트, 배포, 필요한 스크립트 실행 등을 진행하여 ci/cd를 자동화 해주는 Github의 서비스이다.
Github Action에게 일을 시키기 위해, Spring 프로젝트에 deploy.yml / 00-makeFiles.config / Procfile 3개의 파일을 적절한 경로에 만들어 주어야 한다.
deploy.yml
.github/workflows/*.yml 파일에 배포에 필요한 액션이 작성되는 스크립트이다.
제공되는 라이브러리 활용이 가능하다.
name: lessonReserve
on:
push:
branches:
- prod
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout # 깃허브의 코드 저장소에 올려둔 코드를 CI 서버로 내려받은 후에 특정 브랜치로 전환하는 행위
uses: actions/checkout@v3 # 라이브러리 사용
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: 17
distribution: zulu
- name: Permission
run: chmod +x ./gradlew
- name: Build with Gradle
run: ./gradlew clean build
- name: Get current time # 한국시간으로 시간 변경
uses: 1466587594/get-current-time@v2
id: current-time # current-time을 아래에서 사용할 수 있도록 id 지정
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
- name: Show Current time
run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}"
- name: Generate deployment package
run: | # | 여러가지 명령어를 적을 수 있음
mkdir 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@v21
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY }} #환경변수
aws_secret_key: ${{ secrets.AWS_SECRET_KEY }} #환경변수
application_name: lessonReserve # 엘리스틱 빈스톡 애플리케이션 이름
environment_name: lessonReserve-env # 엘리스틱 빈스톡 환경 이름
version_label: lessonReserve-${{steps.current-time.outputs.formattedTime}} # 버전 시간
region: ap-northeast-2
deployment_package: deploy/deploy.zip # Generate deployment package에서 압축한 deploy.zip 파일을 배포하겠다.
00-makeFiles.config 및 Procfile의 사용순서 및 용도
<원래 엘라스틱빈스톡에 사용자가 jar 파일 직접 업로드 할 시 절차>
1. lessonReserve-0.0.1-SNAPSHOT.jar 을 업로드
2. 엘라스틱빈스톡에서 위 jar 파일을 var/app/current/applicatione.jar 로 수정해서 업로드
3. procfile 만들어 내서 실행
<Github Action을 통해 엘라스틱빈스톡에 배포하는 절차>
1. 00-makeFiles.config -> /sbin/appstart 라는 파일을 가장 먼저 만들어 냄 / 해당 파일은 jar 파일을 실행하는 스크립트
(참고, 리눅스 bin 폴더, sbin 폴더 내부의 파일은 -> 어느 폴더에서든지 실행할 수 있다.)
2. procfile 파일 실행 (= appstart를 실행시키는 스크립트) (appstart = /var/app/current/application.jar 실행하는 스크립트)
00-makeFiles.config
files:
"/sbin/appstart": 이 파일을 만들어 낸다
mode: "000755" 755권한 (4 2 1)
owner: webapp
group: webapp
content: |
#!/usr/bin/env bash
JAR_PATH=/var/app/current/application.jar // 해당 경로는 엘라스틱빈스톡에 zip 파일을 배포하면 jar 파일이 생성되는 경로
# run app
java -Dspring.profiles.active=prod -Dfile.encoding=UTF-8 -jar $JAR_PATH // nohup을 안쓰는 이유? 도커로 실행되기 때문
Procfile
springapp: appstart // appstart 파일을 실행한다.
IAM 생성
: Github Action이 aws s3에 접근하기 위한 권한
사용자 생성
직접 정책 연결 : AdministratorAccess-AWSElasticBeanstalk 추가
액세스키 생성 (설명 태그 값: metacoding)
AWS_ACCESS_KEY: AKIARD6RABEEJZLK4R6S
AWS_SECRET_KEY: 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
위 코드는 실제로는 노출되면 안된다!
따라서 아래 경로의 깃허브 환경변수에 해당 코드를 설정하고, deploy.yml에 ${{ secrets.AWS_ACCESS_KEY }}와 같이 작성하는 것이다.
깃허브 aws-v5- Settings - Secrets and variables - Actions - New repository secret 에 AWS_ACCESS_KEY, AWS_SECRET_KEY 설정
RDS에 한글로 데이터 저장이 안되는 문제 해결
적용하는 파라미터의 character_set ~~ 모든 항목의 값을 utf8mb4로 지정 필요
그후 RDS 재부팅
/var/app/currrent/procfile 파일 및 /var/log/springapp.stdout.log 파일 확인해 보았으나 특이사항 없다.
진짜 이유는 Book 테이블이 utf8 반영되기 전에 만들어졌다. 테이블은 utf8 설정한 후에 만들어야 함
-> 테이블 삭제 후 다시 만들기 필요
nlb (고정 IP를 할당하기 위해 필요)
로드밸런서 생성 -> Network Load Balancer 생성
ec2가서 탄력적 ip 발급
네트워크 매핑 p-northeast-2a (apne2-az1) , ipv4 주소는 탄력적 ip로 설정
리스너 및 라우팅 -> 대상그룹생성
-> Application Load Balancer 체크
이름 aws-v5-alb
최종 배포 완료.