8월달에 배포를 해봤는데.. 뒤늦게 정리를 해본다.
서비스를 배포하고 운영하던 중에 코드를 변경할 일이 생기면 코드를 수정하고, 로컬 환경에서 테스트를 진행, 빌드 후 jar 파일을 생성 AWS에 jar 파일 업로드하여 배포 버전을 실행해야 한다.
전에 다니던 회사가 딱 저런 상황이여서 저 반복되는 작업이 얼마나 불편한지 잘 알고 있다...
빌드부터 배포까지의 과정을 자동화할 수 있고, 배포가 잘 되는지 모니터링을 할 수 있는 방법이 CI/CD 이다.
개발자를 위해 빌드와 테스트를 자동화하는 과정
CI는 변경 사항을 자동으로 테스트해 애플리케이션에 문제가 없다는 것을 보장
수정된 코드가 저장소에 업로드되면 CI를 시작, 실패하면 코드의 오류를 쉽게 파악할 수 있다.
깃허브에서 제공하는 서비스
저장소에 특정 이벤트(코드 업데이트)가 발생하면 코드를 빌드, 테스트한 이후 배포까지 작업을 반복할 수 있다.
EC2, Code Deploy를 통해 배포환경을 구성하고, 로드밸런서 연결, 오토스케일링 그룹을 생성 연결하는 모든 행위가 이 Beanstalk에서는 자동으로 이루어진다.
개발자는 코드를 업로드하기만 하면 Elastic Beanstalk가 프로비저닝, 로드 밸런싱, Auto Scaling, 애플리케이션 상태 모니터링, 배포를 자동으로 처리
// 1 워크플로의 이름 지정
name: Deploy Device API Server
// 2 워크플로가 시작될 조건 지정
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest // 3.실행 환경 지정
// 4. 실행스텝지정
steps:
- name: Checkout source code
uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'corretto'
java-version: '17'
cache: 'gradle'
- name: Add permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew clean build -x=jar
shell: bash
// 5. 현재 시간 가져오기
- name: time for Versioning
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
// 6. 배포용 패키지 경로 저장
- name: Set artifact
run: echo "artifact=$(ls ./build/libs)" >> $GITHUB_ENV
// 7. 빈스토크 배포
- name: 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: awskk
environment_name: awskk-env
version_label: main-${{ steps.current-time.outputs.formattedTime }}
region: ap-northeast-2
deployment_package: ./build/libs/${{env.artifact}}
wait_for_environment_recovery: 30
실행 스텝 그룹화 정리
name : 스텝의 이름을 지정
uses : uses 키워드는 지정한 리포지토리를 확인하고 코드에 대한 작업을 실행
action/check-out : checkout이라는 작업의 v2 버전을 실행
run : run 키워드는 실행할 명령어를 입력합니다. ./gradlew clean build에는 그레들을 사용해 프로젝트를 빌드 이전 상태로 돌리고 다시 빌드하는 명령어를 실행합니다.
Momentjs는 javaScript 날짜 라이브러리
secrets.AWS_ACCESS_KEY_ID와 secrets.AWS_SECRET_ACCESS_KEY는 깃허브 액션에서 가져오는 비밀값
이 값은 AWS에서 만든 뒤 깃허브에서 설정해야 한다.
애플리케이션 이름(application_name)과 환경 이름(environment_name)은 일래스틱 빈스토크에서 확인할 수 있다.