Skip to content
Merged
Changes from all 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
99 changes: 99 additions & 0 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
name: CI/CD

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]

jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read

steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'

- name: Change wrapper permissions
run: chmod +x ./gradlew

- name: Build with Gradle Clean
run: ./gradlew clean

- name: Build with Gradle Build
run: ./gradlew build -x test

- name: 1. DockerHub Login
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}

- name: 2. Docker Image Build
run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }} .

- name: 3. DockerHub Push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}

# deploy 라는 이름의 작업 정의
deploy:
# main branch 에 push 가 발생할 때만 실행되도록 함
if: github.ref == 'refs/heads/main'
# build 단계 완료 후에만 실행 가능 - build 가 성적적으로 완료된 후 EC2 배포 진행
needs: build
runs-on: ubuntu-latest
steps:
# EC2 : 기존 이미지 삭제, 이미지 업데이트
- name: Application setting
uses: appleboy/ssh-action@v0.1.8
# EC2 instance 에 SSH 연결 설정
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}

# SSH 로 EC2 접속 후 실행할 명령어
# 도커 컨테이너 중지 및 강제 삭제
# 이때 컨테이너가 존재하지 않거나, 중지되지 않아도 스크립트 진행
# server 에 저장된 이전 Docker image 삭제
# image 존재하지 않아도 스크립트 진행
# Docker Hub 에서 새로운 image 가져옴
script: |
echo "Stopping and removing existing container..."
sudo docker kill ${{ secrets.PROJECT_NAME }} || true
sudo docker rm -f ${{ secrets.PROJECT_NAME }} || true
echo "Removing old image..."
sudo docker rmi ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }} || true
echo "Pulling new image..."
sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}

# EC2 : 도커 이미지 실행
- name: Application Run
uses: appleboy/ssh-action@v0.1.8
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_KEY }}

# 새로운 Docker Container 백그라운드에서 실행
# -p 8080:${{ secrets.PORT }}: EC2 서버의 8080 포트를 컨테이너의 포트와 매핑
# --name : 생성할 container 의 이름
# -e : 환경 변수를 container에 전달
# -d : Docker Hub 에서 가져온 이미지를 백그라운드에서 실행
script: |
echo "Running new container..."
sudo docker run -p 8080:${{ secrets.PORT }} \
--name ${{ secrets.PROJECT_NAME }} \
-e DOCKERHUB_USERNAME="${{ secrets.DOCKERHUB_USERNAME }}" \
-e PROJECT_NAME="${{ secrets.PROJECT_NAME }}" \
-e DB_URL="${{ secrets.DB_URL }}" \
-e DB_USERNAME="${{ secrets.DB_USERNAME }}" \
-e DB_PASSWORD="${{ secrets.DB_PASSWORD }}" \
-d ${{ secrets.DOCKERHUB_USERNAME }}/${{ secrets.PROJECT_NAME }}