Files
note-book/Jenkinsfile
2026-05-19 11:46:42 +08:00

86 lines
2.4 KiB
Groovy

pipeline {
agent any
environment {
DOCKER_REGISTRY = 'your-registry'
IMAGE_NAME = 'family-accounting'
IMAGE_TAG = "${BUILD_NUMBER}"
CONTAINER_NAME = 'family_accounting_backend'
DEPLOY_DIR = '/opt/family-accounting'
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build Docker Image') {
steps {
script {
docker.build("${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}", "-f backend/Dockerfile backend/")
}
}
}
stage('Push to Registry') {
steps {
script {
docker.withRegistry("https://${DOCKER_REGISTRY}", 'docker-registry-credentials') {
docker.image("${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}").push()
docker.image("${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}").push('latest')
}
}
}
}
stage('Deploy via SSH') {
steps {
sshagent(['deploy-server-key']) {
sh """
ssh -o StrictHostKeyChecking=no deploy@your-server << 'EOF'
cd ${DEPLOY_DIR}
export TAG=${IMAGE_TAG}
export REGISTRY=${DOCKER_REGISTRY}
docker compose pull backend
docker compose up -d backend
docker image prune -f
EOF
"""
}
}
}
stage('Health Check') {
steps {
script {
sleep(10)
sh "curl -f http://your-server:3000/api/hello || exit 1"
}
}
}
stage('Cleanup') {
steps {
script {
sh """
docker image prune -f --filter "until=24h"
# 保留最近5个镜像
docker images ${DOCKER_REGISTRY}/${IMAGE_NAME} --format '{{.ID}}' | tail -n +6 | xargs -r docker rmi
"""
}
}
}
}
post {
success {
echo 'Deployment successful!'
}
failure {
echo 'Deployment failed!'
}
}
}