--- title: "05-Jenkins" created: 2026-03-19 tags: - 项目 aliases: - Jenkins --- # Jenkins ## Jenkins 是什么 Jenkins 是一款**开源的持续集成/持续交付(CI/CD)自动化工具**,用于自动化软件开发中的构建、测试和部署流程。是目前**企业使用最广泛**的 CI/CD 工具之一,特别适合私有化部署的场景。 ![[image-142565aa.png]] ![[diagram-1773900729770-bce8833a.png]] | **场景** | **说明** | | --- | --- | | **代码提交触发构建** | 每次 push 代码自动触发编译 | | **自动化测试** | 运行单元测试、集成测试 | | **代码质量检查** | 集成 SonarQube 分析代码 | | **自动化部署** | 部署到服务器、Docker、K8s | | **定时任务** | 定时执行脚本或构建 | | **多分支流水线** | 不同分支走不同流程 | > 想象你是一个工厂流水线主管: > > - 原来:工人手动焊接 → 手动检测 → 手动包装 > - 有了 Jenkins:**代码一提交,自动完成所有步骤**,出错了自动报警 ## 当前场景 | **环境** | **地址** | **用途** | **谁能访问** | | --- | --- | --- | --- | | **本地** | localhost | 自己开发调试 | 只有你 | | **内网** | crm.cnstaff.cn | 团队内部测试 | 公司内网 | | **预发布** | crm.quanzhi.com | 上线前最终验证 | 配置hosts后可访问 | | **生产** | crm.quanzhi.com | 真实用户使用 | 所有人 | 公司Jenkins环境 : ![[image-07d7f798.png]] 有不同的账号 ### 同步到内网 crm.cnstaff.cn 使用: quanzhi quanzhi.com.cn! 登录 可将项目同步到内网 > 点击 Crm → 点击左侧「立即构建」→ Jenkins 会自动把 crmnew 项目的代码打包同步到内网 ![[image-d5c369ea.png]] ![[image-ee8a5d89.png]] 这是**内网测试环境**,只有公司内部网络能访问 构建完成后,在内网打开 `crm.cnstaff.cn` 就能看到最新代码 ### **同步到预发布 crm.quanzhi.com/login** > **预发布环境** = 和生产环境几乎一样,但不是真正给用户用的 > > 用来在「上线前最后验证」 使用 yufabu yu@123 登录 可将项目同步到预发布 ![[image-e96ba121.png]] ![[image-658cbc92.png]] 预发布构建后,五分钟后代码才会同步到预发布 > Jenkins 构建完 ≠ 立刻生效 > > 预发布服务器有自动同步脚本,**5分钟跑一次**,所以要等一下 需要修改host 打开注释: ![[c04eab9870e3a332276ee3f3e0c1722b-eac72523.png]] 访问:crm.quanzhi.com/login ![[image-5cde787f.png]] ### 同步到生产 **crm.quanzhi.com/login** ats ats.com #### 区别在于hosts > **hosts 文件的作用**:让你电脑把 `crm.quanzhi.com` 解析到 `121.36.51.15`(预发布服务器),而不是真正的生产服务器 ![[image-7406a102.png]] hosts就是重定向对吧 crm.quanzhi.com这个域名本身是解析在生产服务器上 但是我们也可以自定义用hosts定向在121.36.51.15(预发布服务器)上?意思就是不管域名绑定哪个ip 我不管 我反正访问这个域名就相当于访问我定义的这个ip?取个别名 ![[image-93f6cad1.png]] **hosts 优先级 > DNS解析**,所以你配了hosts,DNS那边怎么解析都跟你没关系。 **但「别名」这个说法稍微差一点点** | **你说的** | **更准确的说法** | | --- | --- | | 取别名 | **域名欺骗 / 本地DNS覆盖** | | 重定向 | 重定向一般指服务器返回302跳转,不太一样 | > 更准确理解: > **"我本地认为这个域名对应这个IP,骗过我自己的电脑"** > 其他人的电脑不受影响,只有你自己的电脑会走预发布 **为什么要用域名而不直接访问IP?** 因为服务器上可能跑了**很多个网站**,用IP访问它不知道你要哪个: ```text 121.36.51.15 这台服务器上: ├── crm.quanzhi.com → CRM预发布 ├── www.quanzhi.com → 官网预发布 └── passport.quanzhi.com → 登录系统预发布 ``` 直接访问 `121.36.51.15` → 服务器懵了,不知道给你哪个 访问 `crm.quanzhi.com`(指向121.36.51.15)→ 服务器认出来,返回CRM **所以必须用域名,再用hosts把域名偷偷指向预发布服务器** ## 使用 ### **基础概念** #### **1. Jenkins 是什么** 一句话:**自动帮你做重复事情的机器人** 没有 Jenkins: ```text 你写完代码 → 手动提交 → 手动登录服务器 → 手动拉代码 → 手动编译 → 手动部署 ``` 有了 Jenkins: ```text 你写完代码 → 提交 → 点一下构建(甚至自动触发)→ 全部自动完成 ``` #### **2. 核心术语** | **术语** | **大白话** | **你们公司的例子** | | --- | --- | --- | | **Job / 任务** | Jenkins 里的一个「工作项」 | 截图里的 Crm、admincampus 等每一行 | | **Build / 构建** | 执行一次任务 | 点了「立即构建」就是执行一次 | | **Build Number** | 第几次构建 | Crm 的 #2760 就是第2760次构建 | | **Workspace** | Jenkins 拉代码的工作目录 | Jenkins 服务器上的一个文件夹 | | **Node / 节点** | 执行构建的机器 | 你们截图左边"1 空闲 2 空闲"就是2个节点 | | **Plugin / 插件** | 给 Jenkins 加功能的扩展 | SVN插件、邮件通知插件等 | | **Console Output** | 构建日志,排错全靠它 | 每次构建都能看到详细输出 | #### **3. Jenkins 的架构** ![[diagram-1773909997965-58ec4183.png]] > **Master** 负责管理和调度,**Node** 负责干活 > 小团队经常 Master 自己也干活 #### **4. 天气图标的含义** 你截图里每个任务前面都有天气图标,**它表示最近构建的稳定性**: | **图标** | **含义** | **说明** | | --- | --- | --- | | ☀️ 晴天 | 最近构建全部成功 | 健康状态,放心 | | 🌤️ 少云 | 大部分成功,偶尔失败 | 基本正常 | | ⛅ 多云 | 成功失败各半 | 需要关注 | | 🌧️ 下雨 | 大部分失败 | 有问题,需要排查 | | ⛈️ 雷暴 | 最近构建全部失败 | 赶紧修 | > 你们的 Crm 任务看起来是 **多云/下雨** 状态 → 说明最近有些构建失败了 #### **5. 构建状态的含义** | **颜色** | **状态** | **说明** | | --- | --- | --- | | 🔵 蓝色 | SUCCESS | 构建成功 | | 🔴 红色 | FAILURE | 构建失败 | | 🟡 黄色 | UNSTABLE | 构建完成但有警告 | | ⚪ 灰色 | ABORTED | 构建被手动取消 | | 🔵 闪烁 | RUNNING | 正在构建中 | --- ### **安装与配置** #### **1. Jenkins 的运行环境** ![[image-4b61dc51.png]] ```text 公司已经装好了 Jenkins (192.168.1.72:8080),所以不需要装 但了解安装过程有助于理解 ``` #### **2. 常见安装方式** ```bash # 方式一:Linux 直接安装(最常见) sudo apt install openjdk-17-jdk # 先装Java wget https://pkg.jenkins.io/debian/jenkins.io.key sudo apt install jenkins sudo systemctl start jenkins # 方式二:Docker 安装(推荐学习用) docker run -d -p 8080:8080 -p 50000:50000 \ -v jenkins_home:/var/jenkins_home \ jenkins/jenkins:lts # 方式三:Windows 安装(下载msi安装包) # https://www.jenkins.io/download/ ``` #### **3. 初始化配置** ![[image-476811ba.png]] ### **创建任务与构建** #### **1. Job 的类型** | **类型** | **说明** | **适用场景** | | --- | --- | --- | | **Freestyle Project** | 自由风格,界面配置 | 简单任务,你们公司应该用的这种 | | **Pipeline** | 用代码定义流程 | 复杂流程,现代主流 | | **Multibranch Pipeline** | 多分支流水线 | 每个分支自动构建 | | **Folder** | 文件夹,归类用 | 任务太多时分类 | #### **2. 一个 Job 的完整结构** ![[image-ff1351ed.png]] #### **3. 以你们的 Crm 任务为例(推测配置)** ```text ┌──────────────────────────────────────────┐ │ Job名称:Crm │ ├──────────────────────────────────────────┤ │ 源码管理: │ │ SVN → svn://xxx.xxx/crmnew │ │ 账号密码:配置好的凭据 │ ├──────────────────────────────────────────┤ │ 构建触发器: │ │ 手动触发(你点"立即构建") │ ├──────────────────────────────────────────┤ │ 构建步骤(Shell脚本,大概是这样): │ │ #!/bin/bash │ │ # 拉取SVN最新代码 │ │ svn update │ │ # 同步到内网服务器 │ │ rsync -avz ./ root@内网服务器:/var/www/crm/ │ ├──────────────────────────────────────────┤ │ 构建后操作: │ │ 无 / 发送通知 │ └──────────────────────────────────────────┘ ``` #### **4. 现在可以操作的事情** ##### **查看构建历史** ```text 点击 Crm → 左侧「构建历史」→ 点击某次构建编号 → Console Output ``` > **Console Output 是最重要的工具** > 构建成功了做了什么、失败了为什么,全在里面 ##### **查看 Job 配置(如果有权限)** ```text 点击 Crm → 左侧「配置」→ 可以看到这个任务的所有设置 ``` ### **构建触发器** #### **有哪些触发方式** ![[image-3e19ed03.png]] #### **定时构建语法(和Linux cron一样)** ```text # 格式:分 时 日 月 周 H/15 * * * * # 每15分钟 H 8 * * 1-5 # 工作日每天早上8点 H 0 * * * # 每天午夜 ``` #### **SVN/Git 钩子触发(最理想的方式)** ![[image-7db4dba2.png]] > 现在是**手动触发**,也可以配成自动 ### **Pipeline 流水线(进阶)** #### **1. 什么是 Pipeline** Pipeline 就是**用代码来定义构建流程**,比界面点点点更灵活: ```bash // Jenkinsfile - 流水线脚本 pipeline { agent any stages { stage('拉取代码') { steps { svn 'svn://your-repo/crmnew' } } stage('编译构建') { steps { sh 'npm install' sh 'npm run build' } } stage('部署到内网') { steps { sh 'rsync -avz ./dist/ root@内网服务器:/var/www/crm/' } } stage('部署到预发布') { steps { sh 'rsync -avz ./dist/ root@121.36.51.15:/var/www/crm/' } } } post { success { echo '✅ 构建部署成功!' } failure { echo '❌ 构建失败,请检查日志' } } } ``` #### **2. Pipeline 可视化** ![[image-6c51b9f4.png]] > 如果某个阶段失败了,后面就不会执行,很直观 ### **实战常见操作** #### **1. 构建失败怎么排查** ![[image-6903d446.png]] #### **2. 常用 Jenkins 页面** | **页面** | **路径** | **用途** | | --- | --- | --- | | 首页 | `/` | 查看所有任务状态 | | 任务详情 | `/job/Crm/` | 查看Crm的构建历史 | | 构建日志 | `/job/Crm/2760/console` | 查看第2760次构建的日志 | | 任务配置 | `/job/Crm/configure` | 修改任务配置 | | 系统管理 | `/manage` | 管理插件、全局配置 | | 凭据管理 | `/credentials` | 管理密码、SSH密钥 | #### **3. 公司的完整工作流** ![[diagram-1773912421976-121db05e.png]] --- **组内导航**:⬅️ [[04-从手动部署到自动呼吸:一场改变世界的运维革命|从手动部署到自动呼吸:一场改变世界的运维革命]] | 🏠 [[00-DevOps与运维|00-DevOps与运维]] | ➡️ [[06-CI-CD|CI-CD]]