在 CentOS 上用 Jenkins 落地自动化部署
一 环境准备与安装
- 安装 Java 11(Jenkins 2.4xx 起建议使用 Java 11+):sudo yum install -y java-11-openjdk-devel
- 安装 Git:sudo yum install -y git
- 安装 Docker(可选,容器化部署):sudo yum install -y yum-utils device-mapper-persistent-data lvm2 && sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && sudo yum install -y docker-ce docker-ce-cli containerd.io && sudo systemctl start docker && sudo systemctl enable docker
- 安装 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://<服务器IP>:8080,使用初始密码解锁(/var/lib/jenkins/secrets/initialAdminPassword),安装推荐插件(如 Git、Pipeline)
二 Jenkins 初始化与核心配置
- 插件建议:Git Plugin、Pipeline、Generic Webhook Trigger、SSH、Publish Over SSH、Maven Integration、Docker Pipeline(容器化时)
- 全局工具:在 Manage Jenkins → Global Tool Configuration 配置 JDK 11、Git、Maven(如已安装会自动识别)
- 凭据管理:添加 SSH 私钥(用于拉取私有仓库与远程部署)、代码仓库凭据(HTTPS/SSH)
- 防火墙放行:sudo firewall-cmd --permanent --add-port=8080/tcp && sudo firewall-cmd --reload(云服务器需在安全组放行 8080)
三 触发方式与任务创建
- 触发方式
- 轮询 SCM:在任务配置的 Build Triggers 勾选 Poll SCM,示例 **H/5 * * * *** 表示每 5 分钟检查一次变更
- Webhook(推荐):安装 Generic Webhook Trigger,生成 Token,在 GitHub/GitLab Webhooks 配置 Payload URL:http://:8080/generic-webhook-trigger/invoke?token=;或使用 GitHub hook trigger for GITScm polling 配合仓库 Webhook
- 创建任务
- 新建 Pipeline 任务,选择 Pipeline script from SCM,SCM 选 Git,填写仓库 URL 与 分支(如 main),指定 Jenkinsfile 路径(如根目录留空)
四 流水线示例与部署方式
- 示例一 Java(Maven + Tomcat,SSH 直连目标机)
- 思路:拉取代码 → 构建打包(war/jar)→ 通过 SCP 传输产物 → SSH 重启服务
- Jenkinsfile 片段:
pipeline {
agent any
tools { jdk ‘OpenJDK 11’; maven ‘Maven 3.8.6’ }
stages {
stage(‘Checkout’) { steps { git branch: ‘main’, url: ‘https://github.com/your-org/your-app.git’ } }
stage(‘Build’) { steps { sh ‘mvn clean package -DskipTests’ } }
stage(‘Deploy’) {
steps {
sh ‘scp target/app.war tomcat@prod-server:/opt/tomcat/webapps/’
sh ‘ssh tomcat@prod-server “systemctl restart tomcat”’
}
}
}
post { always { junit ‘target/surefire-reports/*.xml’ } }
}
- 示例二 使用 Publish Over SSH 传输产物并远程执行命令
- 在 Manage Jenkins → System 配置 SSH Server(名称如 prod-server),在任务中使用 sshPublisher 将产物传到 /opt/app 并执行重启命令
- Jenkinsfile 片段:
stage(‘Deploy’) {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: ‘prod-server’,
verbose: true,
transfers: [sshTransfer(sourceFile: ‘target/*.jar’, removePrefix: ‘target’, remoteDirectory: ‘/opt/app’)],
command: ‘systemctl restart app.service’
)
]
)
}
}
- 示例三 容器化部署(Docker)
- 思路:构建镜像 → 推送到镜像仓库(可选)→ 在目标机拉取并启动容器(可用 docker-compose)
- Jenkinsfile 片段:
stage(‘Build Docker Image’) {
steps { sh ‘docker build -t your-registry/your-app:${BUILD_NUMBER} .’ }
}
stage(‘Push Image’) {
steps { sh ‘docker push your-registry/your-app:${BUILD_NUMBER}’ }
}
stage(‘Deploy with Compose’) {
steps { sh ‘ssh deploy@prod-server “cd /opt/app && docker-compose pull && docker-compose up -d --force-recreate”’ }
}
- 前端项目(Node.js)补充
- 安装 NodeJS 插件,在 Global Tool Configuration 配置 Node.js 版本;构建步骤执行:npm install、npm run build,产物(如 dist)通过 SCP/SSH 或 Publish Over SSH 发布到 Nginx 目录
五 安全加固与常见问题
- 安全与权限
- 为 Jenkins 创建 低权限系统用户,通过 sudo 精细化授权(仅允许重启指定服务、写入部署目录)
- 使用 SSH 密钥 而非密码,限制 .ssh/authorized_keys 权限为 600
- 保护 Jenkins Web 界面 与 API Token,仅在内网或配合反向代理与认证网关暴露
- 常见问题排查
- 构建失败优先查看 Console Output;SSH 失败检查 known_hosts、SELinux、firewalld、目标机 sudo 权限
- Webhook 未触发:确认 Payload URL、Token、Content type: application/json、以及 CSRF 豁免或正确 API Token 配置
- 容器部署异常:确认目标机 Docker 运行、镜像拉取权限、端口占用与 volume 挂载路径正确
- 首次初始化密码路径:/var/lib/jenkins/secrets/initialAdminPassword;确保 8080 端口与防火墙策略正确