Oracle Cloud 백엔드 젠킨스 배포

동오·2025년 2월 27일

기타

목록 보기
2/4

추후 docker-compose까지 만들고 다시 수정할 예정 입니다.

도커 파일

FROM eclipse-temurin:21-jre-alpine as builder
WORKDIR extracted
ADD ./build/libs/*.jar app.jar
RUN java -Djarmode=layertools -jar app.jar extract

FROM eclipse-temurin:21-jre-alpine
WORKDIR application
COPY --from=builder extracted/dependencies/ ./
COPY --from=builder extracted/spring-boot-loader/ ./
COPY --from=builder extracted/snapshot-dependencies/ ./
COPY --from=builder extracted/application/ ./
EXPOSE 8080
ENTRYPOINT ["java", "org.springframework.boot.loader.launch.JarLauncher"]

젠킨스 파이프라인

pipeline {
    agent any
    
    environment {
        DOCKER_IMAGE = "ghcr.io/kdo1999/ci-cd-test/ci-cd-backend"
        DOCKER_TAG = ":latest"
        CONTAINER_NAME = "ci-cd-backend"
        GITHUB_CREDENTIALS = credentials('ci-cd-github')
    }
    
    stages {
        stage('Login to GitHub Container Registry') {
            steps {
                sh 'echo $GITHUB_CREDENTIALS_PSW | docker login ghcr.io -u $GITHUB_CREDENTIALS_USR --password-stdin'
            }
        }
        
        stage('Pull Docker Image') {
            steps {
                sh 'docker pull ${DOCKER_IMAGE}${DOCKER_TAG}'
            }
        }
        
        stage('Deploy') {
            steps {
                sh '''
                docker stop ${CONTAINER_NAME} || true
                docker rm ${CONTAINER_NAME} || true
                docker rmi $(docker images | grep "${DOCKER_IMAGE}" | grep '<none>' | awk '{print $3}') || true
                
                docker run -it -d --name ${CONTAINER_NAME} \
                  --restart unless-stopped \
                  -p 8080:8080 \
                  -v ./logs:/application/logs \
                  ${DOCKER_IMAGE}
                '''
            }
        }
    }

    post {
        always {
            sh 'docker logout ghcr.io'
        }
        success {
            withCredentials([string(credentialsId: 'Discord-Webhook', variable: 'DISCORD')]) {
                        discordSend description: """
                        제목 : ${currentBuild.displayName}
                        결과 : ${currentBuild.result}
                        실행 시간 : ${currentBuild.duration / 1000}s
                        """,
                        link: env.BUILD_URL, result: currentBuild.currentResult, 
                        title: "${env.JOB_NAME} : ${currentBuild.displayName} 성공", 
                        webhookURL: "$DISCORD"
            }
        }
        failure {
            withCredentials([string(credentialsId: 'Discord-Webhook', variable: 'DISCORD')]) {
                        discordSend description: """
                        제목 : ${currentBuild.displayName}
                        결과 : ${currentBuild.result}
                        실행 시간 : ${currentBuild.duration / 1000}s
                        """,
                        link: env.BUILD_URL, result: currentBuild.currentResult, 
                        title: "${env.JOB_NAME} : ${currentBuild.displayName} 실패", 
                        webhookURL: "$DISCORD"
            }
        }
    }
}

Github 액션

name: Build and Push Docker Image

on:
  push:
    branches: [ main, develop ]
    
jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
    - name: Checkout code
      uses: actions/checkout@v3

    - name: Set up JDK 21
      uses: actions/setup-java@v3
      with:
        java-version: '21'
        distribution: 'temurin'
        cache: gradle

    - name: Build with Gradle
      run: |
        cd backend
        ./gradlew bootJar

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2

    - name: Login to GitHub Container Registry
      uses: docker/login-action@v2
      with:
        registry: ghcr.io
        username: ${{ github.actor }}
        password: ${{ secrets.REPOSITORY_TOKEN }}

    - name: Extract metadata for Docker
      id: meta
      uses: docker/metadata-action@v4
      with:
        images: ghcr.io/${{ github.repository }}/ci-cd-backend
        tags: |
          type=ref,event=branch
          type=ref,event=pr
          type=sha,format=long
          latest

    - name: Build and push Docker image
      uses: docker/build-push-action@v4
      with:
        context: ./backend
        push: true
        tags: ${{ steps.meta.outputs.tags }}
        labels: ${{ steps.meta.outputs.labels }}
        cache-from: type=gha
        cache-to: type=gha,mode=max
        platforms: linux/amd64,linux/arm64
    - name: jenkins deploy
      if: success()
      uses: appleboy/jenkins-action@master
      with:
        url: ${{ secrets.JENKINS_URL }}
        user: ${{ secrets.JENKINS_USER }}
        token: ${{ secrets.JENKINS_DEPLOY_TOKEN }}
        job: ${{ secrets.JENKINS_JOB }}

0개의 댓글