import java.text.SimpleDateFormat
def TODAY = (new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date())
pipeline {
agent any
environment {
strDockerTag = "${TODAY}_${BUILD_ID}"
strDockerImage = "wombat1234/frontend-app:${strDockerTag}" // 프론트용 도커 이미지
strGitUrl = "https://github.com/your-org/frontend-repo.git"
}
stages {
// 1. Checkout
stage('Checkout') {
steps {
git branch: 'main', url: strGitUrl
}
}
// 2. Vite Build
stage('Build (Vite)') {
steps {
sh '''
npm install
npm run build
'''
}
}
// 3. Docker Image Build
stage('Docker Image Build') {
steps {
script {
oDockImage = docker.build(strDockerImage, "-f Dockerfile .")
}
}
}
// 4. Docker Image Push
stage('Docker Image Push') {
steps {
script {
docker.withRegistry('', 'DockerHub_Credential') {
oDockImage.push()
}
}
}
}
// 5. Deploy Production
stage('Deploy Production') {
steps {
sshagent(credentials: ['Prod-PrivateKey']) {
sh '''
ssh -o StrictHostKeyChecking=no ubuntu@your.production.server "
docker pull ${strDockerImage} &&
docker stop frontend || true &&
docker rm frontend || true &&
docker run -d --name frontend -p 80:80 ${strDockerImage}
"
'''
}
}
}
}
// 6. Slack Noti
post {
success {
slackSend(
tokenCredentialId: 'slack-token',
channel: '#젠킨스-노티',
color: 'good',
message: "${JOB_NAME} (${BUILD_NUMBER}) 프론트엔드 프로덕션 배포 성공! ✅\nDetails: (<${BUILD_URL}|here>)"
)
}
failure {
slackSend(
tokenCredentialId: 'slack-token',
channel: '#젠킨스-노티',
color: 'danger',
message: "${JOB_NAME} (${BUILD_NUMBER}) 프론트엔드 프로덕션 배포 실패! ❌\nDetails: (<${BUILD_URL}|here>)"
)
}
}
}