Linux 上用 Jenkins 部署应用的实操指南
一 环境准备与安装
- 安装 JDK 8/11/17(Jenkins 对 Java 版本有对应关系,建议优先 JDK 11 LTS),并配置 JAVA_HOME。
- 安装 Git、Maven/Gradle(按项目需要)。
- 安装方式二选一:
- 包管理安装(推荐):
- Ubuntu/Debian:导入 Jenkins GPG 与源后执行安装,启动并设置开机自启。
- CentOS/RHEL:添加 Jenkins 仓库后安装,启动并设置开机自启。
- WAR 包运行:下载 jenkins.war,使用 java -jar 启动,或配置为 systemd 服务以便守护进程运行。
- 访问 http://服务器IP:8080,按向导完成初始化(首次密码通常在 /var/lib/jenkins/secrets/initialAdminPassword 或控制台输出)。
- 建议安装插件:Git plugin、Maven Integration、Pipeline、SSH Pipeline Steps/Publish Over SSH、Deploy to container(如需部署到 Tomcat)。
二 全局工具与凭据配置
- 全局工具配置(Manage Jenkins → Global Tool Configuration):
- 配置 JDK(自动安装或填写路径)、Maven/Gradle、Git。
- 凭据管理(Manage Jenkins → Manage Credentials):
- 代码仓库凭据(SSH 密钥或用户名/密码)。
- 目标服务器 SSH 凭据(建议用 SSH 密钥,创建专用部署账号)。
- 制品仓库凭据(如 Nexus/Artifactory,可选)。
- 系统配置(Manage Jenkins → System):
- 配置 SSH Servers(用于 Publish Over SSH 或 sshPublisher),设置 Remote Directory 与应用目录结构。
三 部署方式一 Publish Over SSH 部署 WAR 到 Tomcat
- 适用场景:传统 Java Web 应用(WAR 包),部署到 Tomcat。
- 步骤:
- 安装并启用插件:Publish Over SSH。
- 在系统配置中添加目标服务器(Host、Port、Credentials、Remote Directory)。
- 在 Job 的“构建后操作”添加 Send build artifacts over SSH:
- Source files:target/*.war
- Remove prefix:target/
- Remote directory:/opt/tomcat/webapps(示例)
- Exec command:执行部署脚本(停止 Tomcat → 备份旧包 → 部署新包 → 启动 Tomcat)。
- 远程服务器准备部署脚本(示例要点):
- 停止 Tomcat(如 $TOMCAT_HOME/bin/shutdown.sh 或 kill 进程)。
- 备份 webapps/应用 与 work/Catalina。
- 拷贝新 WAR 到 webapps。
- 启动 Tomcat(如 $TOMCAT_HOME/bin/startup.sh),并 tail 日志验证。
- 触发构建,查看控制台输出与远程日志,确认部署成功。
四 部署方式二 Pipeline 部署 JAR 到 Linux 服务
- 适用场景:Spring Boot 等可执行 JAR 项目,直接作为系统服务运行。
- 步骤:
- 新建 Pipeline 任务,选择“Pipeline script from SCM”,指向含 Jenkinsfile 的仓库。
- 在目标服务器准备目录与启动脚本(示例要点):
- 目录:/opt/apps/yourapp/(放置 app.jar 与 start.sh/stop.sh)。
- 启动脚本:使用 nohup java -jar app.jar > app.log 2>&1 &;为便于排查,可在脚本开头加入 JENKINS_NODE_COOKIE=dontKillMe(避免被 Jenkins 杀掉子进程)。
- 可选:使用 systemd 管理应用(创建 /etc/systemd/system/yourapp.service,ExecStart 指向 java -jar,并配置 User、WorkingDirectory、Restart=always)。
- 参考 Jenkinsfile(核心片段):
- 备份旧包(如按时间重命名到 /opt/backup/)。
- 拉取代码(指定分支与 credentialsId)。
- 构建打包(如 mvn -U -Dmaven.test.skip=true clean package)。
- 停止旧进程(按 JAR 名 或 PID 判断并 kill)。
- 拷贝新包到目标目录。
- 启动新进程(nohup 或 systemctl start)。
- 可选:清理 N 天前 的备份包。
- 触发构建(可结合 GitLab push 等 Webhook 实现自动部署)。
五 安全与运维要点
- 使用 SSH 密钥 而非口令,限制部署账号权限,仅授予必要目录与服务的读写/执行权限。
- 建议以 非 root 运行 Jenkins 与目标应用,配合 sudo 精细化授权。
- 防火墙放行 8080(或实际端口),生产环境建议启用 HTTPS 与反向代理(如 Nginx)。
- 构建与运行分离:Jenkins 负责构建与传输,应用由 systemd 或受控脚本管理,便于 启动/停止/回滚。
- 日志与审计:保留 构建日志 与 应用日志,关键操作写入审计信息;定期清理过期 备份包。
- 回滚策略:保留最近 N 个构建产物(如按时间命名),回滚时直接选择历史包与对应脚本执行。