在 Ubuntu 上使用 Jenkins 实现自动化部署的完整方案
一 环境准备与安装
sudo apt update && sudo apt install -y openjdk-11-jdk git maven docker.io
sudo systemctl start docker && sudo systemctl enable docker
# 新版 Debian/Ubuntu 推荐 GPG 与签名源
wget -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io.key
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt update && sudo apt install -y jenkins
sudo systemctl start jenkins && sudo systemctl enable jenkins
sudo ufw allow 8080,22/tcp。二 Jenkins 初始化与插件配置
三 部署方式一 Docker 化 Spring Boot 应用
pipeline {
agent any
environment {
IMAGE = "your-registry/your-project:${env.BUILD_ID}"
REGISTRY = "your-registry"
}
stages {
stage('Checkout') {
steps { git url: 'git@github.com:your/project.git', branch: 'main' }
}
stage('Build') {
steps { sh 'mvn -B -DskipTests clean package' }
}
stage('Build Docker Image') {
steps { script { docker.build(IMAGE) } }
}
stage('Push Image') {
steps {
withCredentials([usernamePassword(credentialsId: 'docker-creds',
usernameVariable: 'USER',
passwordVariable: 'PASS')]) {
sh "docker login -u $USER -p $PASS $REGISTRY"
sh "docker push $IMAGE"
}
}
}
stage('Deploy to Server') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'prod-ubuntu',
transfers: [
sshTransfer(
execCommand: """
docker stop app-container || true
docker rm app-container || true
docker pull $IMAGE
docker run -d --name app-container -p 8080:8080 $IMAGE
"""
)
]
)
]
)
}
}
}
post {
success { archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true }
failure { echo '部署失败,请检查日志' }
}
}
sudo usermod -aG docker jenkins && sudo systemctl restart jenkins。四 部署方式二 直接发布可执行 JAR 到目标机
#!/usr/bin/env bash
APP_JAR="/opt/myapp/app.jar"
case "$1" in
start)
nohup java -Xms512m -Xmx1g -jar "$APP_JAR" > app.log 2>&1 &
echo "Started, PID: $!"
;;
stop)
pkill -f "$APP_JAR" && echo "Stopped"
;;
restart)
pkill -f "$APP_JAR" || true
nohup java -Xms512m -Xmx1g -jar "$APP_JAR" > app.log 2>&1 &
echo "Restarted"
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
mvn clean package -DskipTests。/opt/myapp/remote_run.sh restart。五 触发策略与常见问题处理
H/5 * * * *(每 5 分钟检查一次变更)。sudo usermod -aG docker jenkins && sudo systemctl restart jenkins。options { timeout(time: 30, unit: 'MINUTES') }。