在 CentOS 上用 Jenkins 实现自动化部署
一 架构与准备
- 组件与版本建议:操作系统 CentOS 7/8,JDK 8/11,Jenkins LTS,版本控制 Git,构建工具 Maven/Gradle,可选容器化 Docker 与 Docker Compose。
- 安装基础依赖与 Jenkins:
- 安装 Java 与工具:sudo yum update -y && sudo yum install -y java-1.8.0-openjdk-devel git
- 添加 Jenkins YUM 源并安装:
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install -y jenkins
- 启动与开机自启:sudo systemctl start jenkins && sudo systemctl enable jenkins
- 解锁与初始化:首次访问 http://:8080,初始密码在 /var/lib/jenkins/secrets/initialAdminPassword;建议安装推荐插件(如 Git、Pipeline、Maven Integration)。
二 触发自动化
- 源码管理与凭证:在 Jenkins 任务中配置 Git 仓库 URL 与分支;为私有仓库添加 SSH 私钥或 用户名/密码凭证。
- 触发方式:
- 轮询 SCM:在“构建触发器”中设置 Poll SCM(如 H/5 * * * * 表示每 5 分钟检查一次变更)。
- Webhook 自动触发:在 GitHub/GitLab 项目设置 Webhook,指向 http://<JENKINS_URL>/github-webhook/(或 GitLab 等效路径);Jenkins 安装 Generic Webhook Trigger 插件可更灵活地处理事件与参数。
三 构建与部署流水线
- 方式 A Pipeline as Code(推荐,Jenkinsfile)
- 在代码根目录放置 Jenkinsfile,示例(按项目替换参数):
pipeline {
agent any
tools { maven ‘Maven 3.8’ } // 需在“全局工具配置”预置 Maven 名称
stages {
stage(‘Checkout’) {
steps { git url: ‘git@github.com:org/repo.git’, branch: ‘main’ }
}
stage(‘Build’) {
steps { sh ‘mvn clean package -DskipTests’ }
}
stage(‘Deploy’) {
steps {
sh ‘’’
scp target/app.jar deploy@prod-server:/opt/app/releases/app.jar
ssh deploy@prod-server ‘systemctl restart myapp || true’
‘’’
}
}
}
post { success { echo ‘Deploy success’ } failure { echo ‘Deploy failed’ } }
}
- 关键点:在“全局工具配置”预置 JDK、Git、Maven;使用 SSH 凭据执行远程拷贝与重启。
- 方式 B 远程部署插件(Publish Over SSH)
- 安装 Publish Over SSH 插件;在“系统管理 → 系统配置”中添加目标服务器 SSH 信息(Host、Port、Credentials、Remote Directory)。
- 在任务“构建后操作”中配置:
- Source files:target/*.war(或 target/app.jar)
- Remove prefix:target
- Remote directory:/opt/app/releases
- Exec command:systemctl restart myapp 或执行部署脚本(如备份、回滚、启动)。
四 常见场景示例
- Java(WAR 部署到 Tomcat)
- 构建:mvn clean package;部署:通过 scp 将 WAR 复制到 $TOMCAT/webapps,执行 $TOMCAT/bin/shutdown.sh → 启动 startup.sh;为降低风险可先停旧进程、备份旧包、再启动,必要时实现回滚(保留最近 N 个版本)。
- 前端(Node.js + NPM/Yarn)
- 安装 NodeJS 插件并在“全局工具配置”预置 Node 版本;构建步骤执行:node -v、npm/yarn、npm run build;产物 dist/ 通过 rsync/SSH 同步到 Nginx 静态目录并 reload Nginx。
- 容器化(Docker)
- 在代码根目录提供 Dockerfile 与可选 docker-compose.yml;构建阶段执行:docker build -t myapp:${BUILD_NUMBER} .;部署阶段执行:docker stop myapp || true && docker rm myapp || true && docker run -d --name myapp -p 8080:8080 myapp:${BUILD_NUMBER}(生产建议配合 镜像仓库与 滚动升级策略)。
五 安全与优化建议
- 凭据与权限:使用 Jenkins 凭据存储管理 SSH 私钥、Git 凭证;目标服务器采用 最小权限的部署用户(如仅允许部署相关目录与服务的 sudo 权限)。
- 稳定性:构建/部署阶段使用 set -eux、区分失败路径;必要时用 nohup 或 systemd 托管应用进程,避免构建代理退出导致进程被杀。
- 回滚与灰度:保留最近 N 个构建产物(如按 BUILD_NUMBER 命名目录);支持按版本号快速回滚;多实例时可先 灰度/金丝雀发布再全量。
- 通知与审计:接入 邮件/企业微信/钉钉 通知;在“系统管理 → 系统配置”中配置 Extended E-mail Notification(SMTP、端口 465/587、授权码等),并在流水线 post 阶段发送结果。
- 网络与代理:如内网访问受限,配置 HTTP/HTTPS 代理;Jenkins 配置与插件站点使用可达的镜像源,避免“离线”问题。