Jenkins自动化部署Ubuntu应用
导读:在 Ubuntu 上使用 Jenkins 实现自动化部署的完整方案 一 环境准备与安装 准备一台 Ubuntu 22.04 LTS 服务器,安装 OpenJDK 11(Jenkins 官方推荐版本),并安装 Git、Maven、Docke...
在 Ubuntu 上使用 Jenkins 实现自动化部署的完整方案
一 环境准备与安装
- 准备一台 Ubuntu 22.04 LTS 服务器,安装 OpenJDK 11(Jenkins 官方推荐版本),并安装 Git、Maven、Docker(按项目需要)。
- 安装与启动 Jenkins(APT 方式,含新版签名与源):
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 - 访问 http://< 服务器IP> :8080,首次解锁密码在 /var/lib/jenkins/secrets/initialAdminPassword。
- 防火墙放行端口(如使用 UFW):
sudo ufw allow 8080,22/tcp。
以上步骤覆盖了在 Ubuntu 上安装 Java、Jenkins、Docker 与基础网络配置,适用于后续流水线构建与部署。
二 Jenkins 初始化与插件配置
- 推荐插件:Git Plugin、Pipeline、Docker Pipeline、SSH Pipeline Steps、Blue Ocean、Credentials Binding、Maven Integration。
- 安全与可用性:
- 禁用匿名访问,创建管理员用户;在 Manage Jenkins → Configure System 配置 JDK、Maven、Git 路径。
- 如需加速插件安装,可在 Manage Jenkins → Plugin Manager → Advanced 将 Update Site 替换为国内镜像(如清华源)。
- 凭据管理:添加 SSH 私钥(用于目标机部署)、Docker Registry 账号(如需推送镜像)。
这些插件与配置为流水线拉取代码、构建、容器化与远程发布提供支撑。
三 部署方式一 Docker 化 Spring Boot 应用
- 适用场景:代码提交 → 拉取 → Maven 编译 → Docker 镜像打包 → 推送镜像仓库 → SSH 远程部署到目标 Ubuntu 主机。
- 项目根目录放置 Jenkinsfile(示例):
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 '部署失败,请检查日志' } } } - 目标机权限与连通性:
- 将 jenkins 用户加入 docker 组:
sudo usermod -aG docker jenkins & & sudo systemctl restart jenkins。 - 确保 Jenkins→目标机 SSH 免密或凭据正确,且目标机防火墙放行 22/8080。
该流程覆盖 Docker 化应用的完整 CI/CD,包含镜像构建、推送与远程运行。
- 将 jenkins 用户加入 docker 组:
四 部署方式二 直接发布可执行 JAR 到目标机
- 适用场景:不使用容器,直接在目标 Ubuntu 主机运行 Spring Boot JAR。
- 思路:Jenkins 构建后通过 SSH 发送 JAR 并执行远程脚本启停应用。示例远程脚本 remote_run.sh(放置于目标机):
#!/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 - 在 Jenkins 的 Freestyle 任务中:
- 源码管理:配置 Git 仓库与凭据。
- 构建:执行
mvn clean package -DskipTests。 - 构建后操作:使用 Send build artifacts over SSH 将 target/*.jar 传到目标机(如 /opt/myapp/),并 Exec command 执行:
/opt/myapp/remote_run.sh restart。
- 避免 Jenkins 结束后杀掉子进程:在远程脚本启动命令前导出变量 BUILD_ID=dontKillMe(或 JENKINS_NODE_COOKIE=dontKillMe)。
该方式适合轻量部署与物理/虚拟机环境,脚本化管理启停与回滚。
五 触发策略与常见问题处理
- 触发策略:
- 轮询 SCM:如
H/5 * * * *(每 5 分钟检查一次变更)。 - Webhook:GitHub/GitLab 推送事件触发(需公网可达或内网隧道)。
- 轮询 SCM:如
- 常见问题与要点:
- Permission denied(Docker):
sudo usermod -aG docker jenkins & & sudo systemctl restart jenkins。 - SSH 超时:检查云安全组/本机防火墙与 22 端口连通性。
- 构建卡住:为关键阶段设置超时,例如
options { timeout(time: 30, unit: 'MINUTES') }。 - 插件安装慢:更换 Update Site 为国内镜像源。
- 进程被杀死:在远程启动 Java 前导出 BUILD_ID=dontKillMe。
这些策略与排错项覆盖了常见的网络、权限与进程生命周期问题,可显著提升流水线的稳定性与可维护性。
- Permission denied(Docker):
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Jenkins自动化部署Ubuntu应用
本文地址: https://pptw.com/jishu/775433.html
