Linux运维:Jenkins部署

Jenkins 完整部署流程

一句话总结:Jenkins 是自动化流水线工具,把"代码提交→编译打包→测试→部署上线"全流程自动化,不用人工一步步操作


一、先搞懂核心逻辑

Jenkins 就像一个自动化机器人,你告诉它"代码提交后要做什么",它就会按顺序自动执行所有步骤,成功就部署上线,失败就发通知告诉你哪里错了。

标准流程闭环

复制代码
开发者提交代码 → Git仓库 → Jenkins自动触发 → 拉取代码 → 编译打包 → 质量检查 → 推送镜像 → 部署到服务器 → 自动化测试 → 通知结果

二、完整部署步骤(以 Spring Boot + Docker + K8s 项目为例)

前置准备(一次性配置)

  1. 搭建 Jenkins 服务器:安装 JDK、Git、Docker、Maven 等工具
  2. 配置凭证:在 Jenkins 中添加 Git 仓库密钥、镜像仓库密码、服务器 SSH 密钥
  3. 配置环境:安装必要插件(Git、Pipeline、Docker、Kubernetes、SonarQube)
  4. 准备目标环境:测试服务器/生产服务器、Docker 镜像仓库、K8s 集群

步骤1:触发构建(3种方式)

  1. 自动触发(最常用):开发者提交代码到 Git 仓库(GitHub/GitLab),Git 通过 Webhook 通知 Jenkins 开始构建
  2. 定时触发:每天凌晨自动构建部署测试环境
  3. 手动触发:在 Jenkins 界面点击"立即构建"

步骤2:拉取最新代码

Jenkins 从 Git 仓库拉取指定分支(如 dev/master)的最新代码到本地工作目录。


步骤3:编译打包

  • Java 项目:执行 mvn clean package -DskipTests,生成 .jar
  • Python 项目:执行 pip install -r requirements.txt,打包依赖
  • 前端项目:执行 npm install && npm run build,生成 dist 静态文件

步骤4:代码质量检查(可选但生产必做)

调用 SonarQube 扫描代码,检查代码漏洞、代码异味、测试覆盖率,不达标则直接终止构建。


步骤5:构建 Docker 镜像

用项目根目录的 Dockerfile 构建镜像,打上版本号(如 v1.0.0 或 Git 提交哈希)。


步骤6:推送镜像到仓库

把构建好的镜像推送到私有镜像仓库(如 Harbor、Docker Hub),供部署环境拉取。


步骤7:部署到目标环境

方式1:部署到物理机/虚拟机

通过 SSH 连接到目标服务器,执行以下操作:

  1. 拉取最新镜像
  2. 停止旧容器
  3. 启动新容器
  4. 检查容器是否正常运行
方式2:部署到 K8s 集群(生产主流)

Jenkins 调用 kubectl apply -f deployment.yaml,更新 K8s 集群中的 Deployment,实现滚动更新。


步骤8:自动化测试(可选)

部署完成后,自动运行接口测试、UI 测试,验证部署是否成功。


步骤9:通知结果

通过邮件、钉钉、企业微信通知团队成员:

  • 构建成功:"项目 v1.0.0 已成功部署到测试环境"
  • 构建失败:"构建失败,错误原因:编译错误"

三、Jenkins Pipeline 脚本示例(直接能用)

这是生产环境最常用的声明式 Pipeline ,把所有步骤写在一个 Jenkinsfile 里,和代码一起存在 Git 仓库。

groovy 复制代码
pipeline {
    agent any
    environment {
        // 定义全局变量
        IMAGE_NAME = "harbor.example.com/demo/spring-boot-demo"
        IMAGE_TAG = "${BUILD_NUMBER}"
        K8S_NAMESPACE = "demo"
    }
    stages {
        stage('拉取代码') {
            steps {
                git url: 'https://git.example.com/demo/spring-boot-demo.git', branch: 'dev', credentialsId: 'git-credential'
            }
        }
        stage('编译打包') {
            steps {
                sh 'mvn clean package -DskipTests'
            }
        }
        stage('构建镜像') {
            steps {
                sh "docker build -t ${IMAGE_NAME}:${IMAGE_TAG} ."
            }
        }
        stage('推送镜像') {
            steps {
                withCredentials([usernamePassword(credentialsId: 'harbor-credential', usernameVariable: 'USER', passwordVariable: 'PASS')]) {
                    sh "docker login harbor.example.com -u ${USER} -p ${PASS}"
                    sh "docker push ${IMAGE_NAME}:${IMAGE_TAG}"
                }
            }
        }
        stage('部署到K8s') {
            steps {
                sh "kubectl set image deployment/spring-boot-demo spring-boot-demo=${IMAGE_NAME}:${IMAGE_TAG} -n ${K8S_NAMESPACE}"
                sh "kubectl rollout status deployment/spring-boot-demo -n ${K8S_NAMESPACE}"
            }
        }
    }
    post {
        success {
            dingtalk (
                robot: 'jenkins-dingtalk',
                type: 'MARKDOWN',
                title: '构建成功',
                text: [
                    "### 项目部署成功",
                    "项目名称:spring-boot-demo",
                    "版本号:${IMAGE_TAG}",
                    "部署环境:测试环境"
                ]
            )
        }
        failure {
            dingtalk (
                robot: 'jenkins-dingtalk',
                type: 'MARKDOWN',
                title: '构建失败',
                text: [
                    "### 项目部署失败",
                    "项目名称:spring-boot-demo",
                    "构建号:${BUILD_NUMBER}",
                    "请查看Jenkins日志排查问题"
                ]
            )
        }
    }
}

四、面试标准答案

Jenkins 是一个开源的持续集成和持续部署工具,它的完整部署流程是:

首先,开发者提交代码到 Git 仓库,Git 通过 Webhook 触发 Jenkins 构建。Jenkins 拉取最新代码后,执行编译打包、代码质量检查等步骤,然后构建 Docker 镜像并推送到镜像仓库。最后,Jenkins 通过 SSH 或 kubectl 将应用部署到测试环境或生产环境,部署完成后自动运行测试并通知团队成员结果。

整个过程完全自动化,大大提高了开发效率,减少了人工操作带来的错误。

需要我给你一个纯物理机部署(不用Docker/K8s)的Pipeline脚本吗?

相关推荐
o丁二黄o11 小时前
Gemini镜像站办公效能深度解析:多模态链式调用与自动化工作流构建指南
运维·人工智能·自动化
叶半欲缺11 小时前
密码忘记了吗?Linux单用户模式下修改密码!
linux·运维·服务器
handler0111 小时前
【Linux 网络】一文读懂 HTTP 协议
linux·c语言·网络·c++·笔记·网络协议·http
铅笔小新z11 小时前
【Linux】进程信号
linux·服务器
晓蓝WQuiet11 小时前
vim/linux使用笔记
linux·笔记·vim
终端行者11 小时前
jenkins Pipeline 企业级别的流水线构建 Docker 负责打包 最后上传到Nexus
ci/cd·docker·jenkins
相思难忘成疾11 小时前
【Linux网络服务】基于Euler系统的主从DNS服务器深度配置
linux·运维·服务器
光电笑映11 小时前
Linux 文件 IO:缓冲区、重定向与一切皆文件
linux·运维·服务器