温馨提示×

Jenkins在CentOS如何实现自动化部署

小樊
40
2025-12-27 12:43:38
栏目: 智能运维

在 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 11GitMaven(如已安装会自动识别)
  • 凭据管理:添加 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/SSHPublish Over SSH 发布到 Nginx 目录

五 安全加固与常见问题

  • 安全与权限
    • Jenkins 创建 低权限系统用户,通过 sudo 精细化授权(仅允许重启指定服务、写入部署目录)
    • 使用 SSH 密钥 而非密码,限制 .ssh/authorized_keys 权限为 600
    • 保护 Jenkins Web 界面API Token,仅在内网或配合反向代理与认证网关暴露
  • 常见问题排查
    • 构建失败优先查看 Console Output;SSH 失败检查 known_hostsSELinuxfirewalld、目标机 sudo 权限
    • Webhook 未触发:确认 Payload URLTokenContent type: application/json、以及 CSRF 豁免或正确 API Token 配置
    • 容器部署异常:确认目标机 Docker 运行、镜像拉取权限、端口占用与 volume 挂载路径正确
    • 首次初始化密码路径:/var/lib/jenkins/secrets/initialAdminPassword;确保 8080 端口与防火墙策略正确

0