Skip to content

Commit 4c07077

Browse files
authored
Merge pull request #2 from plango2025/develop
CI/CD 연결
2 parents ed44ab6 + 39244b8 commit 4c07077

File tree

65 files changed

+2400
-7
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+2400
-7
lines changed

.dockerignore

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Gradle cache
2+
.gradle/
3+
build/
4+
5+
# IDE settings
6+
*.iml
7+
.idea/
8+
*.class
9+
10+
# Logs and temp files
11+
*.log
12+
*.tmp
13+
14+
# Application Properties
15+
application.properties
16+
application-*.properties
17+
application.yml
18+
application-*.yml
19+
20+
# Environment
21+
.env
22+
.env.*

.github/workflows/deploy.yml

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
name: Deploy to EC2
2+
3+
on:
4+
push:
5+
branches:
6+
- main # 메인 브랜치 푸시 시 실행
7+
8+
jobs:
9+
build-and-deploy:
10+
runs-on: ubuntu-latest
11+
12+
services:
13+
mysql:
14+
image: mysql:8.0
15+
ports:
16+
- 3306:3306
17+
env:
18+
MYSQL_ROOT_PASSWORD: root
19+
MYSQL_DATABASE: test_database
20+
MYSQL_USER: test_user
21+
MYSQL_PASSWORD: test_password
22+
23+
steps:
24+
# 1. 소스코드 체크아웃
25+
- name: Checkout code
26+
uses: actions/checkout@v2
27+
28+
# 2. JDK 설정 (Java 17 설치)
29+
- name: Set up JDK 17
30+
uses: actions/setup-java@v3
31+
with:
32+
java-version: '17'
33+
distribution: 'temurin'
34+
35+
# 3. Gradle 빌드
36+
- name: Build application
37+
env:
38+
APPLICATION_PROPERTIES: ${{ secrets.APPLICATION_PROPERTIES }}
39+
TEST_APPLICATION_PROPERTIES: ${{ secrets.TEST_APPLICATION_PROPERTIES }}
40+
run: |
41+
# src/main/resources 및 src/test/resources 디렉토리 생성
42+
mkdir -p src/main/resources src/test/resources
43+
44+
# application.properties 파일 생성
45+
echo "$APPLICATION_PROPERTIES" > src/main/resources/application.properties
46+
echo "$TEST_APPLICATION_PROPERTIES" > src/test/resources/application.properties
47+
48+
# 권한 설정
49+
chmod 600 src/main/resources/application.properties
50+
chmod 600 src/test/resources/application.properties
51+
52+
# gradlew 실행 권한 부여
53+
chmod +x ./gradlew
54+
55+
# Gradle 빌드 실행
56+
./gradlew clean build
57+
58+
# JAR 파일 위치 확인
59+
echo "JAR file generated in:"
60+
ls build/libs/
61+
62+
# 빌드 성공 후 application.properties 삭제
63+
rm -f src/main/resources/application.properties
64+
rm -f src/test/resources/application.properties
65+
66+
# 빌드된 JAR 파일을 Docker 빌드 컨텍스트로 복사
67+
cp build/libs/*SNAPSHOT.jar .
68+
69+
# 4. Docker 이미지 빌드 및 푸시
70+
- name: Build and Push Docker Image
71+
env:
72+
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
73+
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
74+
run: |
75+
echo "Building Docker Image..."
76+
77+
# Docker 이미지 빌드
78+
docker build -t teniuscom/plango-backend:latest .
79+
80+
# Docker 이미지 확인 (빌드된 이미지 확인)
81+
docker images
82+
83+
# Docker Hub 로그인
84+
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
85+
86+
# 태그 확인 및 푸시
87+
docker push teniuscom/plango-backend:latest
88+
89+
# 5. docker-compose.yml 및 환경 파일 EC2로 전송
90+
- name: Upload Docker Compose to EC2
91+
env:
92+
EC2_PRIVATE_KEY: ${{ secrets.EC2_PRIVATE_KEY }}
93+
EC2_USER: ${{ secrets.EC2_USER }}
94+
EC2_HOST: ${{ secrets.EC2_HOST }}
95+
MYSQL_ROOT_PASSWORD: ${{ secrets.MYSQL_ROOT_PASSWORD }}
96+
MYSQL_USER: ${{ secrets.MYSQL_USER }}
97+
MYSQL_PASSWORD: ${{ secrets.MYSQL_PASSWORD }}
98+
run: |
99+
echo "${{ secrets.EC2_PRIVATE_KEY }}" > private_key.pem
100+
chmod 600 private_key.pem
101+
102+
# 환경 변수 파일 생성
103+
echo "MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}" > .env
104+
echo "MYSQL_USER=${MYSQL_USER}" >> .env
105+
echo "MYSQL_PASSWORD=${MYSQL_PASSWORD}" >> .env
106+
107+
# Docker Compose 및 .env 파일 전송
108+
scp -i private_key.pem -o StrictHostKeyChecking=no docker-compose.yml $EC2_USER@$EC2_HOST:/home/ubuntu/plango
109+
scp -i private_key.pem -o StrictHostKeyChecking=no .env $EC2_USER@$EC2_HOST:/home/ubuntu/plango
110+
111+
# 6. EC2에서 Docker Compose 실행
112+
- name: Deploy on EC2
113+
env:
114+
EC2_PRIVATE_KEY: ${{ secrets.EC2_PRIVATE_KEY }}
115+
EC2_USER: ${{ secrets.EC2_USER }}
116+
EC2_HOST: ${{ secrets.EC2_HOST }}
117+
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
118+
DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
119+
run: |
120+
# EC2 key pair 준비
121+
echo "${{ secrets.EC2_PRIVATE_KEY }}" > private_key.pem
122+
chmod 600 private_key.pem
123+
124+
# SSH로 EC2 접속 및 Docker Compose 실행
125+
ssh -i private_key.pem -o StrictHostKeyChecking=no $EC2_USER@$EC2_HOST << EOF
126+
cd /home/ubuntu/plango
127+
128+
# Docker 서비스 상태 확인 및 실행
129+
if ! systemctl is-active --quiet docker; then
130+
echo "Docker service is not running. Starting Docker..."
131+
sudo systemctl start docker
132+
else
133+
echo "Docker service is already running."
134+
fi
135+
136+
# Docker Hub 로그인
137+
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
138+
139+
# Docker 이미지 Pull
140+
docker-compose pull
141+
142+
# 기존 컨테이너 중지 및 삭제
143+
docker-compose down || true
144+
145+
# 새 컨테이너 실행
146+
docker-compose up -d
147+
148+
echo "Application deployed successfully!"
149+
EOF

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,9 @@ out/
3535

3636
### VS Code ###
3737
.vscode/
38+
39+
### Application Properties ###
40+
src/main/resources/application.properties
41+
42+
### Key ###
43+
*.pem

Dockerfile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# 1. OpenJDK 런타임 이미지를 기반으로 컨테이너 생성
2+
FROM openjdk:17-jdk-slim
3+
4+
# 2. 컨테이너 내부에서 작업 디렉토리를 설정
5+
WORKDIR /app
6+
7+
# 3. Gradle 또는 Maven으로 빌드된 JAR 파일을 컨테이너로 복사
8+
COPY *SNAPSHOT.jar app.jar
9+
10+
# 4. Spring Boot 애플리케이션에서 사용하는 포트 개방
11+
EXPOSE 8080
12+
13+
# 5. JAR 파일 실행 명령어 설정
14+
ENTRYPOINT ["java", "-jar", "app.jar"]

build.gradle

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,42 @@ repositories {
2525
}
2626

2727
dependencies {
28-
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
29-
implementation 'org.springframework.boot:spring-boot-starter-security'
28+
// SpringBoot
3029
implementation 'org.springframework.boot:spring-boot-starter-web'
31-
compileOnly 'org.projectlombok:lombok'
3230
developmentOnly 'org.springframework.boot:spring-boot-devtools'
33-
runtimeOnly 'com.mysql:mysql-connector-j'
34-
annotationProcessor 'org.projectlombok:lombok'
3531
testImplementation 'org.springframework.boot:spring-boot-starter-test'
36-
testImplementation 'org.springframework.security:spring-security-test'
3732
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
33+
34+
// Spring Data JPA
35+
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
36+
37+
// Spring Security
38+
implementation 'org.springframework.boot:spring-boot-starter-security'
39+
testImplementation 'org.springframework.security:spring-security-test'
40+
41+
// MySQL
42+
runtimeOnly 'com.mysql:mysql-connector-j'
43+
44+
// Lombok
45+
compileOnly 'org.projectlombok:lombok'
46+
annotationProcessor 'org.projectlombok:lombok'
47+
48+
// JWT (토큰 인증)
49+
implementation 'io.jsonwebtoken:jjwt-api:0.11.1'
50+
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.1'
51+
runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.1'
52+
53+
// OAuth2
54+
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
55+
56+
// Redis
57+
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
58+
59+
// Validation (데이터 검증)
60+
implementation 'org.springframework.boot:spring-boot-starter-validation'
61+
62+
// Gson
63+
implementation 'com.google.code.gson:gson:2.11.0'
3864
}
3965

4066
tasks.named('test') {

docker-compose.yml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
version: '3.8'
2+
3+
services:
4+
mysql:
5+
image: mysql:8.0
6+
container_name: mysql-container
7+
environment:
8+
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
9+
MYSQL_DATABASE: plango
10+
MYSQL_USER: ${MYSQL_USER}
11+
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
12+
ports:
13+
- "3306:3306"
14+
volumes:
15+
- mysql_data:/var/lib/mysql # 데이터 저장 볼륨
16+
- /home/ubuntu/mysql-init:/docker-entrypoint-initdb.d # 초기화 스크립트
17+
networks:
18+
- app-network
19+
20+
redis:
21+
image: redis:latest
22+
container_name: redis-container
23+
ports:
24+
- "6379:6379"
25+
networks:
26+
- app-network
27+
28+
springboot-app:
29+
image: teniuscom/plango-backend:latest
30+
container_name: springboot-container
31+
ports:
32+
- "8080:8080"
33+
environment:
34+
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/plango
35+
SPRING_DATASOURCE_USERNAME: ${MYSQL_USER}
36+
SPRING_DATASOURCE_PASSWORD: ${MYSQL_PASSWORD}
37+
SPRING_REDIS_HOST: redis
38+
SPRING_REDIS_PORT: 6379
39+
depends_on:
40+
- mysql
41+
- redis
42+
volumes:
43+
# 로컬 디렉터리를 컨테이너 내부에 마운트
44+
- /home/ubuntu/storage:/home/ubuntu/storage # 파일 저장소
45+
networks:
46+
- app-network
47+
48+
volumes:
49+
mysql_data: # 이름 있는 볼륨 (/var/lib/docker/volumes/ 하위에 저장)
50+
51+
networks:
52+
app-network:

src/main/java/com/example/plango/PlangoApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import org.springframework.boot.SpringApplication;
44
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
56

7+
@EnableJpaAuditing
68
@SpringBootApplication
79
public class PlangoApplication {
810

0 commit comments

Comments
 (0)