Skip to content
Open
Show file tree
Hide file tree
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
98 changes: 98 additions & 0 deletions blog/.github/workflows/cicd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
name: CI/CD Pipeline

on:
push:
branches:
- "김민지/main"
- "김민지/8주차"
pull_request:
branches: [ "김민지/main" ]
workflow_dispatch:

jobs:
# 1. 테스트 및 빌드 작업
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

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

# Secret에 넣어둔 application.yml을 생성하는 단계
- name: Restore application.yml
run: |
mkdir -p ./blog/src/main/resources
echo "${{ secrets.APPLICATION_YML }}" | base64 --decode > ./blog/src/main/resources/application.yml

- name: Grant execute permission for gradlew
run: chmod +x ./gradlew

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

- name: Upload Build Artifact
uses: actions/upload-artifact@v4
with:
name: build-artifact
path: blog/build/libs/*.jar

# 2. 도커 이미지 빌드 및 Push 작업
docker-push:
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4

# application.yml이 이미지 빌드에 필요하므로 다시 생성
- name: Restore application.yml
run: |
mkdir -p ./blog/src/main/resources
echo "${{ secrets.APPLICATION_YML }}" | base64 --decode > ./blog/src/main/resources/application.yml

- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Build and Push Docker Image
uses: docker/build-push-action@v5
with:
context: ./blog
file: ./blog/Dockerfile
push: true
tags: sxvxnxwt/leets-blog:latest

# 3. EC2 배포 작업
deploy:
runs-on: ubuntu-latest
needs: docker-push
steps:
- uses: actions/checkout@v4

# docker-compose.yml 파일을 EC2로 복사
- name: Copy docker-compose.yml to EC2
uses: appleboy/scp-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
source: "blog/docker-compose.yml"
target: "/home/ubuntu/"

# SSH로 접속하여 배포 명령 실행
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
cd /home/ubuntu
sudo docker-compose down || true
sudo docker-compose pull
sudo docker-compose up -d
11 changes: 11 additions & 0 deletions blog/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
FROM eclipse-temurin:17-jre-alpine

WORKDIR /app

ENV SERVER_PORT=8080

COPY blog/build/libs/blog-0.0.1-SNAPSHOT.jar app.jar

EXPOSE ${SERVER_PORT}

ENTRYPOINT ["java", "-jar", "app.jar"]
52 changes: 52 additions & 0 deletions blog/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
version: "3.9"

services:
db:
image: mysql:8
container_name: mydb
restart: always
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: leets_blog # application.yml의 DB명과 일치
TZ: Asia/Seoul
command: [
"--performance-schema=off",
"--innodb-buffer-pool-size=64M"
]
ports:
- "3306:3306"
volumes:
- db-data:/var/lib/mysql
networks:
- mynetwork
healthcheck:
test: [ "CMD", "mysqladmin", "ping", "-h", "localhost" ]
timeout: 10s
retries: 10
interval: 3s
start_period: 25s

springapp:
image: sxvxnxwt/leets-blog:latest # Docker Hub에 올라갈 이미지 이름
container_name: springapp
restart: always
ports:
- "8080:8080"
depends_on:
db:
condition: service_healthy
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/leets_blog?serverTimezone=Asia/Seoul
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: 1234
SPRING_JPA_HIBERNATE_DDL_AUTO: update
TZ: Asia/Seoul
networks:
- mynetwork

volumes:
db-data:

networks:
mynetwork:
driver: bridge
2 changes: 1 addition & 1 deletion blog/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ spring:
application:
name: blog
datasource:
url: jdbc:mysql://localhost:3306/leets_blog?serverTimezone=Asia/Seoul
url: jdbc:mysql://db:3306/leets_blog?serverTimezone=Asia/Seoul
username: root
password: 1234
jpa:
Expand Down