
Generate new token 클릭scope 설정repo ➡️ Repository에 대한 전체 액세스 권한(코드, 커밋, 이슈, PR 등) 접근 가능
admin:org ➡️ GitHub 조직을 관리할 수 있는 관리자 권한(멤버 추가,제거, 조직 리포지토리 관리 등)
admin:repo_hook ➡️ 리포지토리 웹훅 권한(웹훅 생성 / 변경 / 삭제)

Docker Plugin
Generic Webhook Trigger Plugin
SSH server
GitHub API Plugin
GitHub Integration Plugin

kind : Username with password (GitHub ID & GitHub PASSWORD)scope : Global 선택ID : credential ID
scope : Global 선택kind : SSH Username with private key (ssh key(pem key) 인증)Username : EC2 login usernameEnter directly 선택 후, pem키 복사

GitHub hook trigger for GITScm polling 체크
Definition -> Pipeline script from SCM 선택




# EC2에 전달받은 jar를 배포 경로에 배포한다.
FROM openjdk:21
WORKDIR /app
COPY app.jar /app/app.jar
CMD ["java", "-jar", "app.jar"]
version: '3.8'
services:
db:
image: mysql:8.0 # pull image
container_name: beauty-care-db-container
environment:
MYSQL_ROOT_PASSWORD: {root 패스워드}
MYSQL_DATABASE: {database_schema}
volumes:
- db_data:/var/lib/mysql # 데이터 유지를 위해 볼륨 설정
networks:
- beauty_care_network # Spring Boot container와 네트워크 설정
ports:
- 3306:3306 # host 3306 -> container 3306
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 5
timeout: 5s
app:
build:
context: . # Dockerfile 경로
dockerfile: Dockerfile # 정의된 Docker file을 빌드하여, 이미지를 생성한다.
image: beauty-care-app # Docker image명
container_name: beauty-care-app-container
environment:
- SPRING_PROFILES_ACTIVE=prod # profile 설정
depends_on:
db:
condition: service_healthy # db container가 healthy일때 까지 대기
networks:
- beauty_care_network # db <-> backend container
ports:
- 8080:8080 # host 8080 -> container 8080
networks:
beauty_care_network:
external: true
name: beauty_care_network
driver: bridge
volumes:
db_data:
pipeline {
agent any
environment {
EC2_USER = 'ubuntu'
EC2_HOST = {EC2 Public IP}
SSH_KEY_ID = {Jenkins ssh key}
DEPLOY_DIR = {배포할 경로}
GIT_REPO = {.git 경로}
GIT_CREDENTIALS_ID = {Jenkins에 등록한 Credential ID}
DOCKER_COMPOSE_FILE = 'docker-compose.yml'
DOCKER_HOST = 'unix:///var/run/docker.sock'
}
stages {
stage('메인 브렌치 체크아웃') {
steps {
withCredentials([usernamePassword(credentialsId: GIT_CREDENTIALS_ID, passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
sh """
rm -rf beauty-care # 기존 디렉토리 삭제
git clone https://${GIT_USERNAME}:${GIT_PASSWORD}@{.git 경로} beauty-care
cd beauty-care
git checkout main
"""
}
}
}
stage('Gradle Build') {
steps {
script {
sh """
cd beauty-care
chmod +x ./gradlew
./gradlew clean build
"""
}
}
}
stage('JAR 배포') {
steps {
sshagent([SSH_KEY_ID]) {
# 배포 경로로 JAR 전달
sh """
scp -o StrictHostKeyChecking=no beauty-care/build/libs/beauty-care-0.0.1-SNAPSHOT.jar ${EC2_USER}@${EC2_HOST}:${DEPLOY_DIR}/app.jar
"""
}
}
}
stage('EC2에서 컨테이너 실행') {
steps {
sshagent([SSH_KEY_ID]) {
script {
# docker-compose.yml 및 Dockerfile 전달
sh "scp -o StrictHostKeyChecking=no beauty-care/docker-compose.yml ${EC2_USER}@${EC2_HOST}:${DEPLOY_DIR}/"
sh "scp -o StrictHostKeyChecking=no beauty-care/Dockerfile ${EC2_USER}@${EC2_HOST}:${DEPLOY_DIR}/"
// docker-compose up
def dockerDeployScript = """#!/bin/bash
set -e # 실패 시 즉시 종료
docker-compose -f ${DEPLOY_DIR}/docker-compose.yml down
cd ${DEPLOY_DIR}
docker-compose up -d --build
exit 0
"""
sh "echo \"${dockerDeployScript}\" | ssh -o StrictHostKeyChecking=no ${EC2_USER}@${EC2_HOST}"
}
}
}
}
}
post {
success {
echo '🎉 배포 성공'
}
failure {
echo '🚨 배포 실패'
}
}
}
docker-compose -f ${DEPLOY_DIR}/docker-compose.yml down️-f ➡️ docker-compose.yml 파일의 경로를 지정down ➡️ 기존 컨테이너 및 네트워크 종료docker-compose up -d --build-d ➡️ 백그라운드에서 실행--build ➡️ 컨테이너 실행 전에 이미지를 다시 빌드 (호스트에 이미지가 존재해도, 빌드한다.)