在 Ubuntu 上使用 Jenkins 实现自动化部署的完整方案

一 环境准备与安装
sudo apt update && sudo apt install -y openjdk-11-jdk git maven docker.iosudo 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.keyecho "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/nullsudo apt update && sudo apt install -y jenkinssudo systemctl start jenkins && sudo systemctl enable jenkinssudo ufw allow 8080,22/tcp。以上步骤覆盖了在 Ubuntu 上安装 Java、Jenkins、Docker 与基础网络配置,适用于后续流水线构建与部署。二 Jenkins 初始化与插件配置
三 部署方式一 Docker 化 Spring Boot 应用
pipeline {agent anyenvironment {IMAGE = "your-registry/your-project:${env.BUILD_ID}"REGISTRY = "your-registry"}stages {stage('Checkout') {steps { git url: '[email protected]: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 || truedocker rm app-container || truedocker pull $IMAGEdocker 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 bashAPP_JAR="/opt/myapp/app.jar"case "$1" instart)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" || truenohup java -Xms512m -Xmx1g -jar "$APP_JAR" > app.log 2>&1 &echo "Restarted";;*)echo "Usage: $0 {start|stop|restart}"exit 1;;esacmvn 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') }。