배포를 할 때 build를 한 뒤에 File Zilla를 사용하여 일일히 EC2 서버에 접속한 뒤 jar파일을 옮기는 방식으로 배포를 했습니다.
이 방식은 일단 깃허브와 연동도 되지 않아 불편할 뿐만 아니라, 소위 노가다 방식으로 매번 빌드를 하고 파일을 옮겨야 하기 때문에 굉장히 귀찮았습니다.
불편함을 해소 하고자 빌드&배포 자동화 방식들을 구글링 했고, 여러 방식들을 찾게 되었습니다. 그 중 Github Action 방식을 사용하기로 했습니다.
Github Action은 워크플로우를 통해 자동화가 가능합니다. 워크플로우는 레포지터리 내에서 .github/workflows 폴더 아래에 위치한 gradle.yaml 파일로 설정을 합니다.
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle
# (하고 싶은 이름 아무거나 하면 됩니다.)
name: ConcertCalendar(SpringBoot & Gradle) CI/CD
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
permissions:
contents: read
env:
S3_BUCKET_NAME: 내 S3 버켓 이름
PROJECT_NAME: 내 프로젝트 이름
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
# 사용하는 자바 버전 17
java-version: '17'
distribution: 'temurin'
- run: touch ./src/main/resources/application-secret.properties
- run: echo "${{ secrets.APPLICATION_SECRET }}" > ./src/main/resources/application-secret.properties
- run: cat ./src/main/resources/application-secret.properties
# gradlew에 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# gradlew 빌드
- name: Build with Gradle
run: ./gradlew clean build --exclude-task test
# 압축파일 형태로 전달
- name: Make zip file
run: zip -r ./만들고 싶은 파일 이름.zip .
shell: bash
# S3 Bucket으로 Copy
- name: Deliver to AWS S3
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./만들고 싶은 파일 이름.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/만들고 싶은 파일 이름.zip
# Deploy
# applicatio-name => aws code deploy application 이름
- name: Deploy
run: |
aws deploy create-deployment \
--application-name 어플리케이션 이름 \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name Code Deploy 그룹 이름 \
--file-exists-behavior OVERWRITE \
--s3-location bucket=S3 버켓 이름,bundleType=zip,key=concert-calendar/ConcertCalendar.zip \
--region ap-northeast-2 \
on 속성으로 해당 워크플로우가 언제 실행되는지 정의합니다.
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
master 브랜치로 push가 되거나 pull request가 들어올 경우 워크플로우가 실행되도록 설정해줍니다.
env로 S3_BUCKET_NAME과 PROJECT_NAME을 환경변수로 설정해줍니다.
env:
S3_BUCKET_NAME: 내 S3 버켓 이름
PROJECT_NAME: 내 프로젝트 이름
Jobs는 독립된 가상머신에서 돌아가는 하나의 처리 단위입니다.
step 안에 작업 단위들을 단계별로 입력할 수 있습니다.
먼저 자바 버전을 세팅해줍니다.
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
# 사용하는 자바 버전 17
java-version: '17'
distribution: 'temurin'
그리고 프로젝트의 보안을 위해 암호만 모아놓은 application-secret.properties를 Github 내 SECRET과 touch, echo 명령어를 통해 새로 만들어주는 작업을 진행해줍니다.
(보안이 필요한 yml, properties 파일이 없는 경우 없어도 됩니다)
- run: touch ./src/main/resources/application-secret.properties
- run: echo "${{ secrets.APPLICATION_SECRET }}" > ./src/main/resources/application-secret.properties
- run: cat ./src/main/resources/application-secret.properties
gradlew에 권한을 부여하고 gradlew로 빌드를 해주니다.
# gradlew에 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# gradlew 빌드
- name: Build with Gradle
run: ./gradlew clean build --exclude-task test
빌드한 프로젝트를 압축파일 형태로 만듭니다.
# 압축파일 형태로 전달
- name: Make zip file
run: zip -r ./만들고 싶은 파일 이름.zip .
shell: bash
기존에 만들었던 S3 버켓으로 압축했던 파일을 Copy 해줍니다.
aws-access-key-id, aws-secret-access-key, aws-region은 Github내 Secret을 사용해서 보안을 유지해줍니다.
# S3 Bucket으로 Copy
- name: Deliver to AWS S3
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./만들고 싶은 파일 이름.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/만들고 싶은 파일 이름.zip
Code Deploy를 사용하여 서버를 실행할 EC2에 배포를 해줍니다.
# Deploy
# applicatio-name => aws code deploy application 이름
- name: Deploy
run: |
aws deploy create-deployment \
--application-name 어플리케이션 이름 \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name Code Deploy 그룹 이름 \
--file-exists-behavior OVERWRITE \
--s3-location bucket=S3 버켓 이름,bundleType=zip,key=concert-calendar/만들고 싶은 파일 이름.zip \
이렇게 Github Action을 사용하여 빌드와 배포의 자동화가 가능합니다. Github Action의 가장 큰 장점은 레포지터리에 push만 되면 자동으로 실행이 되며 레포지터리 안에서 workflows 내에 yml 파일로 설정이 가능하다는 점입니다.
저도 Github Action으로 자동화 해보려고 알아보고 있었는데, 세팅값을 잘 정리해놓으셔서 참고하기 좋네요.