거누의 개발노트
Spring Boot - Github Action, S3, EC2, CodeDeploy 연동 본문
반응형
Github Action을 이용해서 Spring Boot(Gradle) 웹 어플리케이션을 자동으로 빌드해주는 과적을 작성하려고 한다.
매번 build를 하고, 빌드된 jar파일을 EC2 서버에 접근해서 올리는 번거로운 작업이 사라지게 되어서 개발에만 집중할 수 있게 된다.
[S3 버킷 만들기]
이름만 정하고 나머지는 기본 설정값으로 만들기
[AWS IAM 사용자 만들기] - 권한추가하기
AmazonS3FullAccess
AWSCodeDeployFullAccess
AWSCodeDeployRole
권한 위에 3개 추가
키 잘 저장해 놓기
[AWS IAM 역할 만들기]
1. CodeDeploy 용 역할
AWSCodeDeployRole
2. EC2 용 역할
AmazonS3FullAccess
AWSCodeDeployFullAccess
2개 만들기 완료!
[ EC2 생성 / 설정]
우분투 서버 생성
보안 규칙 변경
IAM 역할 수정
위에서 만들었던 EC2용 역할 추가
EC2 인스턴스 식별을 위한 태그 추가
[AWS codeDeploy 만들기]
만든 애플리케이션의 배포 그룹 생성
IAM에서 codeDeploy용으로 만든 역할을 선택할 수 있다.
EC2, 인스턴스에서 만든 태그를 선택한다.
[내 EC2 접근 / 환경 설정]
Ubuntu Server용 CodeDeploy 에이전트 설치
sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status
설치 완료
My Repository Settings -> Secrets -> Actions
저장해둔 AWS IAM 사용자 키 설정
Github Action 파일 생성
# This is a basic workflow to help you get started with Actions
name: Build and Deploy Spring Boot to AWS EC2
# main 브랜치에 푸쉬 했을때
on:
push:
branches: [ main ]
# 해당 코드에서 사용될 변수 설정
env:
PROJECT_NAME: magazine
BUCKET_NAME: geonoo-test
CODE_DEPLOY_APP_NAME: codeDeploy-test
DEPLOYMENT_GROUP_NAME: codeDeploy-test
jobs:
build:
runs-on: ubuntu-20.04
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Java JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
## gitignore한 파일 생성해주기
## create application.properties
- name: make application-aws.properties
if: true # branch가 develop일 때
run: |
# spring의 resources 경로로 이동
cd ./src/main/resources
touch ./application-aws.properties
# GitHub-Actions에서 설정한 값을 application-dev.properties 파일에 쓰기
echo "${{ secrets.PROPERTIES }}" > ./application-aws.properties
shell: bash
#gradlew 파일 실행권한 설정
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
#빌드 시작
- name: Build with Gradle
run: ./gradlew build
shell: bash
#프로젝트 zip파일로 압축
- name: Make Zip File
run: zip -qq -r ./$GITHUB_SHA.zip .
shell: bash
#aws 접근 id, key
- name: Configure AWS credentials
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: ap-northeast-2
# s3에 압축한 zip파일 업로드
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
# s3에 업로드한 파일 code Deploy에서 배포 요청
- name: Code Deploy
run: aws deploy create-deployment --application-name $CODE_DEPLOY_APP_NAME --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name $DEPLOYMENT_GROUP_NAME --s3-location bucket=$BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip
appspec.yml
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/magazine
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: /scripts/deploy.sh
timeout: 60
runas: ubuntu
scripts라는 폴더 만들고 그안에 deploy.sh 파일 생성, 아래는 파일내용
#!/usr/bin/env bash
REPOSITORY=/home/ubuntu/magazine
cd $REPOSITORY
APP_NAME=cicd-test
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep 'SNAPSHOT.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME
CURRENT_PID=$(pgrep -f $APP_NAME)
if [ -z $CURRENT_PID ]
then
echo "> 종료할것 없음."
else
echo "> kill -9 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
echo "> $JAR_PATH 배포"
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &
위 처럼 만들어 놓는다.
반응형
'Spring' 카테고리의 다른 글
[Spring] 게시물 검색/조회 리펙토링 하기 - Querydsl, MySQL Full Text Search (0) | 2022.07.20 |
---|---|
Spring Boot OAuth2.0 적용기 (0) | 2022.07.04 |
[Spring] 스프링 컨테이너와 빈 (0) | 2022.06.09 |
[Spring] DI(Dependency Injection)를 사용하는 이유 (1) | 2022.06.07 |
Controller, Service, Repository (0) | 2022.06.07 |
Comments