Skip to content

Commit 22033fd

Browse files
committed
⚡ MarkSphere v1.0.16
CI/CD 시스템 Docker로 이전
1 parent 19091b4 commit 22033fd

File tree

4 files changed

+150
-52
lines changed

4 files changed

+150
-52
lines changed

.github/workflows/CICD.yml

Lines changed: 55 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,71 @@
1-
# github repository actions 페이지에 나타날 이름
2-
name: CI/CD using Github Actions & AWS CodeDeploy
1+
name: MarkSphere CI/CD (ARM64)
32

4-
# event trigger
5-
# main 브랜치에 push가 되었을 때 실행
63
on:
74
push:
8-
branches: [ "main", "test" ]
5+
branches: [ "main" ] # 메인 브랜치에 푸시될 때 실행
96

10-
permissions:
11-
contents: read
7+
env:
8+
REGISTRY: ghcr.io
9+
IMAGE_NAME: ${{ github.repository }}
1210

1311
jobs:
14-
build:
12+
build-and-push:
1513
runs-on: ubuntu-latest
14+
permissions:
15+
contents: read
16+
packages: write
1617

1718
steps:
18-
# JDK setting - github actions에서 사용할 JDK 설정
19-
- uses: actions/checkout@v3
20-
- name: Set up JDK 17
21-
uses: actions/setup-java@v3
22-
with:
23-
java-version: '17'
24-
distribution: 'temurin'
19+
- name: Checkout repository
20+
uses: actions/checkout@v4
2521

26-
# gradle caching - 빌드 시간 향상
27-
- name: Gradle Caching
28-
uses: actions/cache@v3
29-
with:
30-
path: |
31-
~/.gradle/caches
32-
~/.gradle/wrapper
33-
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
34-
restore-keys: |
35-
${{ runner.os }}-gradle-
22+
# 1. ARM64 빌드를 위한 에뮬레이터 설정 (핵심!)
23+
- name: Set up QEMU
24+
uses: docker/setup-qemu-action@v3
3625

37-
# gradle build
38-
- name: Build with Gradle
39-
run: |
40-
chmod +x ./gradlew
41-
./gradlew build -x test
26+
# 2. Docker Buildx 설정 (멀티 플랫폼 빌드 도구)
27+
- name: Set up Docker Buildx
28+
uses: docker/setup-buildx-action@v3
4229

43-
# make zip file
44-
- name: Make zip file
45-
run: zip -qq -r ./$GITHUB_SHA.zip .
46-
shell: bash
30+
# 3. GitHub Container Registry 로그인
31+
- name: Log in to the Container registry
32+
uses: docker/login-action@v3
33+
with:
34+
registry: ${{ env.REGISTRY }}
35+
username: ${{ github.actor }}
36+
password: ${{ secrets.GHCR_TOKEN }}
4737

48-
# AWS 사용자 정보 입력
49-
- name: Configure AWS credentials
50-
uses: aws-actions/configure-aws-credentials@v1
38+
# 4. 이미지 빌드 및 푸시 (ARM64 전용)
39+
- name: Build and push Docker image
40+
uses: docker/build-push-action@v5
5141
with:
52-
aws-access-key-id: ${{ secrets.ACCESS_KEY_ID }}
53-
aws-secret-access-key: ${{ secrets.ACCESS_KEY_SECRET }}
54-
aws-region: ap-northeast-2
42+
context: .
43+
platforms: linux/arm64 # OCI Ampere A1 아키텍처에 맞춤
44+
push: true
45+
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
46+
cache-from: type=gha
47+
cache-to: type=gha,mode=max
5548

56-
# S3에 zip 파일 업로드
57-
- name: Upload to S3
58-
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://${{ secrets.S3_BUCKET_NAME }}/deploy/$GITHUB_SHA.zip --source .
49+
deploy:
50+
needs: build-and-push
51+
runs-on: ubuntu-latest
5952

60-
# CodeDeploy에 배포 요청
61-
- name: Code Deploy
62-
run: aws deploy create-deployment --application-name ${{ secrets.CODE_DEPLOY_APP_NAME }}
63-
--deployment-config-name CodeDeployDefault.OneAtATime
64-
--deployment-group-name ${{ secrets.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }}
65-
--s3-location bucket=${{ secrets.S3_BUCKET_NAME }},bundleType=zip,key=deploy/$GITHUB_SHA.zip
53+
steps:
54+
# 5. OCI 서버에 SSH로 접속하여 배포 명령 전달
55+
- name: Deploy to OCI
56+
uses: appleboy/ssh-action@v1.0.3
57+
with:
58+
host: ${{ secrets.OCI_HOST }}
59+
username: ${{ secrets.OCI_USERNAME }}
60+
key: ${{ secrets.OCI_KEY }}
61+
script: |
62+
cd ~/marksphere-project # 프로젝트 폴더 경로로 이동
63+
64+
# 새 이미지 가져오기
65+
docker-compose pull
66+
67+
# 컨테이너 재시작 (변경사항 반영)
68+
docker-compose up -d --force-recreate
69+
70+
# 사용하지 않는 오래된 이미지 정리 (용량 관리)
71+
docker image prune -f

Dockerfile

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# 1단계: 빌드 스테이지 (JDK 설치 버전)
2+
# eclipse-temurin은 ARM64를 공식 지원하는 안정적인 베이스 이미지입니다.
3+
FROM eclipse-temurin:17-jdk-jammy AS build
4+
WORKDIR /app
5+
6+
# 빌드 속도 향상을 위해 Gradle 래퍼와 의존성 파일을 먼저 복사
7+
COPY gradlew .
8+
COPY gradle gradle
9+
COPY build.gradle .
10+
COPY settings.gradle .
11+
12+
# 실행 권한 부여 및 의존성 다운로드 (캐싱 활용)
13+
RUN chmod +x ./gradlew
14+
RUN ./gradlew dependencies --no-daemon
15+
16+
# 전체 소스 코드 복사 및 빌드
17+
COPY src src
18+
RUN ./gradlew bootJar -x test --no-daemon
19+
20+
# 2단계: 실행 스테이지 (JRE 경량 버전)
21+
FROM eclipse-temurin:17-jre-jammy
22+
WORKDIR /app
23+
24+
# 빌드 스테이지에서 생성된 JAR 파일만 복사
25+
COPY --from=build /app/build/libs/*.jar app.jar
26+
27+
# Spring Boot 포트 개방
28+
EXPOSE 8080
29+
30+
# 애플리케이션 실행
31+
ENTRYPOINT ["java", "-jar", "app.jar"]

docker-compose.yml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
services:
2+
# 1. Redis 컨테이너 설정
3+
redis:
4+
image: redis:alpine
5+
container_name: marksphere-redis
6+
ports:
7+
- "6379:6379"
8+
volumes:
9+
- redis_data:/data
10+
restart: always
11+
networks:
12+
- marksphere-network
13+
14+
selenium:
15+
image: selenium/standalone-chromium:latest
16+
container_name: marksphere-selenium
17+
shm_size: '2gb'
18+
environment:
19+
- SE_NODE_MAX_SESSIONS=5
20+
- SE_NODE_OVERRIDE_MAX_SESSIONS=true
21+
- SE_SESSION_REQUEST_TIMEOUT=60
22+
ports:
23+
- "4444:4444"
24+
networks:
25+
- marksphere-network
26+
27+
# 2. Spring Boot 애플리케이션 설정
28+
marksphere-app:
29+
build: .
30+
container_name: marksphere-app
31+
ports:
32+
- "127.0.0.1:8080:8080"
33+
env_file:
34+
- .env
35+
depends_on:
36+
- redis
37+
restart: always
38+
networks:
39+
- marksphere-network
40+
41+
# 데이터 보존을 위한 볼륨 정의
42+
volumes:
43+
redis_data:
44+
45+
# 컨테이너 간 통신을 위한 네트워크 정의
46+
networks:
47+
marksphere-network:
48+
driver: bridge

src/main/java/com/sonkim/bookmarking/common/config/WebDriverFactory.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
import org.apache.commons.pool2.PooledObject;
77
import org.apache.commons.pool2.impl.DefaultPooledObject;
88
import org.openqa.selenium.WebDriver;
9-
import org.openqa.selenium.chrome.ChromeDriver;
109
import org.openqa.selenium.chrome.ChromeOptions;
10+
import org.openqa.selenium.remote.RemoteWebDriver;
11+
12+
import java.net.MalformedURLException;
13+
import java.net.URL;
1114

1215
@Slf4j
1316
@RequiredArgsConstructor
@@ -18,8 +21,18 @@ public class WebDriverFactory extends BasePooledObjectFactory<WebDriver> {
1821
// 새로운 WebDriver 인스턴스 생성
1922
@Override
2023
public WebDriver create() {
21-
log.info(">>>>> WebDriver 인스턴스 생성");
22-
return new ChromeDriver(options);
24+
log.info(">>>>> Remote WebDriver 인스턴스 생성 (Selenium Container 접속)");
25+
26+
options.addArguments("--headless=new");
27+
options.addArguments("--no-sandbox");
28+
options.addArguments("--disable-dev-shm-usage");
29+
30+
try {
31+
// Docker Compose 서비스 이름인 'selenium'을 호스트로 사용합니다.
32+
return new RemoteWebDriver(new URL("http://selenium:4444/wd/hub"), options);
33+
} catch (MalformedURLException e) {
34+
throw new RuntimeException("Selenium 서버 URL이 잘못되었습니다.", e);
35+
}
2336
}
2437

2538
// 객체를 풀에서 관리할 수 있도록 래핑

0 commit comments

Comments
 (0)