diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 89d5b26..855e1fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..933a751 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ + +FROM openjdk:17 +WORKDIR /app +COPY build/libs/*.jar app.jar +CMD ["java", "-jar", "app.jar"] diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..e0e3f50 --- /dev/null +++ b/Jenkinsfile @@ -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..' + } + } +} diff --git a/build.gradle b/build.gradle index c08c790..5824c90 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ version = '0.0.1-SNAPSHOT' java { toolchain { - languageVersion = JavaLanguageVersion.of(21) + languageVersion = JavaLanguageVersion.of(17) } } diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100644 index 0000000..6c09de6 --- /dev/null +++ b/scripts/deploy.sh @@ -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 "✅ 배포 완료!"