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
28 changes: 10 additions & 18 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,29 +23,21 @@ jobs:
- name: Grant execute permission for Gradle Wrapper
run: chmod +x ./gradlew

- name: Cache Gradle dependencies
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

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

- name: Build with Gradle
run: ./gradlew build
# 빌드로 jar 파일을 만들 필요는 없어보이고, 나머지 작업은 jenkins 에서..
# - name: Build with Gradle
# run: ./gradlew build

- name: Compile Source Code # ✅ 소스 코드 컴파일 추가
run: ./gradlew compileJava --no-daemon

- name: Run tests with Gradle # ✅ 테스트 실행
run: ./gradlew test --no-daemon --refresh-dependencies

- name: Clear Gradle cache on failure
if: failure()
run: rm -rf ~/.gradle/caches

# - name: Test with Gradle
# run: ./gradlew test

5 changes: 5 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

FROM openjdk:17
WORKDIR /app
COPY build/libs/*.jar app.jar
CMD ["java", "-jar", "app.jar"]
78 changes: 78 additions & 0 deletions Jenkinsfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
pipeline {
agent any

// Docker Hub 자격증명 및 이미지 정보 (Jenkins의 Credentials에 등록되어 있어야 합니다)
environment {
DOCKERHUB_CREDENTIALS = credentials('docker') // Jenkins에 등록된 Docker Hub 크리덴셜 ID
IMAGE_NAME = 'na0th/na0th'
IMAGE_TAG = '1.0.0' // 필요에 따라 버전을 동적으로 지정할 수도 있음.
}

stages {
stage('Git Checkout') {
steps {
checkout scm
}
}
stage('Build JAR with Gradle') { // ✅ JAR 빌드 추가
steps {
script {
echo "🛠️ Gradle 실행 권한 부여"
sh "chmod +x ./gradlew" // ✅ 실행 권한 추가

echo "🛠️ Gradle을 사용하여 JAR 빌드"
sh "./gradlew clean build -x test" // 테스트 제외하고 빌드

echo "📂 빌드된 파일 확인:"
sh "ls -al build/libs/"
}
}
}
stage('Build Docker Image') {
steps {
script {
echo "빌드 중: ${IMAGE_NAME}:${IMAGE_TAG}"
sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ."
}
}
}

stage('Push Docker Image') {
steps {
script {
echo "Docker Hub에 로그인 중.."
// 환경 변수 DOCKERHUB_CREDENTIALS_USR, DOCKERHUB_CREDENTIALS_PSW는 credentials()로부터 자동으로 설정됨
withCredentials([usernamePassword(credentialsId: 'docker', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
sh "echo ${DOCKER_PASS} | docker login -u ${DOCKER_USER} --password-stdin"
}
echo "이미지 푸시 중: ${IMAGE_NAME}:${IMAGE_TAG}"
sh "docker push ${IMAGE_NAME}:${IMAGE_TAG}"
}
}
}


stage('Deploy to EC2') {
steps {
sshagent (credentials: ['ec2-ssh']) {
sh """
echo "🚀 배포 스크립트 업로드 중..."
scp -o StrictHostKeyChecking=no ./scripts/deploy.sh ubuntu@54.180.87.11:/home/ubuntu/deploy.sh

echo "🚀 EC2에서 배포 스크립트 실행..."
ssh -tt ubuntu@54.180.87.11 -o StrictHostKeyChecking=no "chmod +x /home/ubuntu/deploy.sh && /home/ubuntu/deploy.sh"
"""
}
}
}
}

post {
success {
echo '🚀 배포 성공! happy!!'
}
failure {
echo '❌ 배포 실패.. sad..'
}
}
}
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ version = '0.0.1-SNAPSHOT'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
languageVersion = JavaLanguageVersion.of(17)
}
}

Expand Down
19 changes: 19 additions & 0 deletions scripts/deploy.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/bin/bash

# docker-compose.yml이 위치한 디렉토리로 이동 (필요한 경우)
cd /home/ubuntu/myproject || exit

echo "📦 최신 Docker 이미지 가져오기..."
docker-compose pull

echo "존재하는 컨테이너 중지"
docker compose down

echo "🔄 컨테이너 재시작..."
# 컨테이너가 실행 중이면 업데이트 적용을 위해 재시작합니다.
docker-compose up -d

echo "🧹 불필요한 이미지 정리..."
docker image prune -f

echo "✅ 배포 완료!"