Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MATE-95 : [FEAT] Docker 기반 배포 환경 구축 #90

Merged
merged 4 commits into from
Dec 5, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 46 additions & 62 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -1,77 +1,61 @@
# GitHub Actions 워크플로우 이름 정의
name: Deploy To EC2

# 워크플로우 트리거 설정
# develop 브랜치에 push가 발생할 때만 실행
on:
push:
branches:
- develop
push

jobs:
# 배포 작업 정의
deploy:
runs-on: ubuntu-latest # 실행 환경 지정

# GitHub Actions에서 사용할 환경 변수 설정
# GitHub Secrets에서 값을 가져옴
runs-on: ubuntu-latest
env:
NAVER_CLIENT_ID: ${{ secrets.NAVER_CLIENT_ID }}
NAVER_REDIRECT_URI: ${{ secrets.NAVER_REDIRECT_URI }}
NAVER_CLIENT_SECRET: ${{ secrets.NAVER_CLIENT_SECRET }}
JWT_SECRET_KEY: ${{ secrets.JWT_SECRET_KEY }}
OPENWEATHER_API_KEY: ${{ secrets.OPENWEATHER_API_KEY }}

steps:
# 레포지토리 코드를 체크아웃
- uses: actions/checkout@v3

# JDK 17 설정
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'

# gradlew 파일에 실행 권한 부여
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Github Repository 파일 불러오기
uses: actions/checkout@v4

# Gradle을 사용하여 프로젝트 빌드
- name: Build with Gradle
run: ./gradlew clean build

# 빌드된 JAR 파일을 EC2 서버로 전송
- name: Copy jar file to EC2
uses: appleboy/scp-action@master
- name: JDK 17버전 설치
uses: actions/setup-java@v4
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
source: "build/libs/*SNAPSHOT.jar" # 전송할 JAR 파일 경로
target: "/home/ubuntu/WEB1_2_PitchingMate_BE" # EC2의 대상 경로
strip_components: 2 # source 경로에서 상위 2개 디렉토리 제거

# EC2 서버에 SSH로 접속하여 배포 스크립트 실행
- name: SSH로 EC2에 접속하기
uses: appleboy/[email protected]
env:
APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES }}
distribution: temurin
java-version: 17

- name: application-dev.yml 파일 만들기
run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application-dev.yml

- name: 테스트 및 빌드하기
run: |
chmod +x gradlew
./gradlew clean build
- name: AWS Resource에 접근할 수 있게 AWS credentials 설정
uses: aws-actions/configure-aws-credentials@v4
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_PRIVATE_KEY }}
envs: APPLICATION_PROPERTIES # EC2에 전달할 환경 변수
script_stop: true # 스크립트 실행 중 오류 발생시 중단
script: | # EC2에서 실행할 명령어들
cd /home/ubuntu/WEB1_2_PitchingMate_BE # 프로젝트 디렉토리로 이동
git pull origin develop # 최신 코드 가져오기
echo "$APPLICATION_PROPERTIES" > src/main/resources/application-dev.yml # 설정 파일 생성
sudo fuser -k -n tcp 8080 || true # 8080 포트 사용중인 프로세스 종료
sleep 5 # 프로세스가 완전히 종료되기를 기다림
cd /home/ubuntu/WEB1_2_PitchingMate_BE # 프로젝트 루트 디렉토리로 다시 이동
./gradlew bootJar # 새로 빌드
cd build/libs # 빌드된 jar 파일이 있는 디렉토리로 이동
nohup java -jar mate-0.0.1-SNAPSHOT.jar > ./output.log 2>&1 & # 새로 빌드된 jar 실행
sleep 10 # 애플리케이션이 시작될 때까지 기다림
ps aux | grep java # 프로세스가 실행 중인지 확인
aws-region: ap-northeast-2
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: ECR에 로그인하기
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2

- name: Docker 이미지 생성
run: docker build -t catchmi-server .

- name: Docker 이미지에 Tag 붙이기
run: docker tag catchmi-server ${{ steps.login-ecr.outputs.registry }}/catchmi-server:latest

- name: ECR에 Docker 이미지 Push하기
run: docker push ${{ steps.login-ecr.outputs.registry }}/catchmi-server:latest

- name: 압축하기
run: tar -czvf $GITHUB_SHA.tar.gz appspec.yml scripts

- name: S3에 프로젝트 폴더 업로드하기
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.tar.gz s3://catchmi-bucket/$GITHUB_SHA.tar.gz

- name: Code Deploy를 활용해 EC2에 프로젝트 코드 배포
run: aws deploy create-deployment \
--application-name catchmi-server \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name Develop \
--s3-location bucket=catchmi-bucket,bundleType=tgz,key=$GITHUB_SHA.tar.gz
3 changes: 3 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
FROM eclipse-temurin:17-jdk-alpine
COPY ./build/libs/*SNAPSHOT.jar project.jar
ENTRYPOINT ["java", "-jar", "project.jar"]
20 changes: 20 additions & 0 deletions appspec.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
version: 0.0
os: linux

files:
# S3에 저장한 파일들 중 destination(AWS EC2)으로 이동시킬 대상을 지정한다.
# / 이라고 지정하면 S3에 저장한 전체 파일을 뜻한다.
- source: /
# EC2의 어떤 경로에 저장할 지 지정한다.
destination: /home/ubuntu/WEB1_2_PitchingMate_BE

permissions:
- object: /
owner: ubuntu
group: ubuntu

hooks:
ApplicationStart:
- location: scripts/start-server.sh
timeout: 60
runas: ubuntu
8 changes: 8 additions & 0 deletions scripts/start-server.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#!/bin/bash

echo "--------------- 서버 배포 시작 -----------------"
docker stop catchmi-server || true
docker rm catchmi-server || true
docker pull 533267244952.dkr.ecr.ap-northeast-2.amazonaws.com/catchmi-server/catchmi-server:latest
docker run -d --name catchmi-server -p 8080:8080 533267244952.dkr.ecr.ap-northeast-2.amazonaws.com/catchmi-server/catchmi-server:latest
echo "--------------- 서버 배포 끝 -----------------"
Loading