추후 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 }}