# Jenkins CI/CD 配置指南 ## 📋 概述 本文档指导你如何在 Jenkins 中配置自动化 CI/CD 流水线,实现: - ✅ Gitea Webhook 自动触发构建 - ✅ 多阶段质量门禁(Lint + TypeCheck + Test + Build) - ✅ 自动部署到生产服务器 - ✅ 构建通知(邮件/钉钉/企业微信) --- ## 🔧 前置条件 ### 1. Jenkins 插件安装 确保以下插件已安装在 Jenkins 中: | 插件名称 | 用途 | 必需 | |---------|------|------| | **Pipeline** | 支持 Jenkinsfile 流水线 | ✅ 是 | | **Git Plugin** | Git 仓库集成 | ✅ 是 | | **Generic Webhook Trigger** | Gitea Webhook 触发 | ✅ 是 | | **NodeJS Plugin** | Node.js 环境管理 | ✅ 是 | | **HTML Publisher** | 发布测试报告 | ✅ 是 | | **SSH Agent Plugin** | SSH 部署连接 | ✅ 是 | | **Email Extension** | 邮件通知 | ⚠️ 可选 | | **DingTalk Plugin** | 钉钉通知 | ⚠️ 可选 | #### 安装步骤: 1. 登录 Jenkins:`http://:8080` 2. 导航到:**Manage Jenkins → Plugins → Available plugins** 3. 搜索并安装上述插件 4. 重启 Jenkins ### 2. 全局工具配置 #### 配置 Node.js: 1. **Manage Jenkins → Tools** 2. 找到 **NodeJS** 部分 3. 点击 **Add NodeJS** 4. 配置如下: ``` Name: Node.js 18 Install automatically: ✅ 勾选 Version: 18.20.x (LTS) ``` 5. 点击 **Save** #### 配置 Git: 1. 同样在 **Tools** 页面 2. 找到 **Git** 部分 3. 确保 Git 路径正确(通常 `/usr/bin/git`) 4. 如果未安装,选择 **Install automatically** --- ## 🚀 创建 Pipeline 任务 ### 方法 A:通过 Jenkins UI 创建(推荐新手) #### 步骤 1:创建新任务 1. 点击 **New Item** 2. 输入任务名称:`novalon-website-ci-cd` 3. 选择 **Pipeline** 4. 点击 **OK** #### 步骤 2:配置 General ``` ☑️ This project is parameterized (勾选) Parameters: ┌─ Boolean Parameter │ Name: DEPLOY_TO_PRODUCTION │ Default Value: false │ Description: 是否部署到生产环境(仅在 main 分支且测试通过后可用) └────────────────────────────── ☑️ GitHub project (可选) Project URL: https://git.f.novalon.cn/novalon/novalon-website ``` #### 步骤 3:配置 Build Triggers(触发器) ##### 选项 1:Gitea Webhook 触发(推荐) 1. 勾选 **Trigger builds remotely** 2. 设置 Authentication Token:`novalon-website-ci-token` 3. 在 **Build Triggers** 部分找到 **Generic Webhook Trigger** 或 **Gitea Webhook**: - 如果使用 **Generic Webhook Trigger** 插件: ``` Token: novalon-website-ci-token ``` 4. **保存任务后,获取 Webhook URL**: ``` http://:8080/generic-webhook-trigger/invoke?token=novalon-website-ci-token ``` ##### 选项 2:轮询 SCM(备选) ``` ☑️ Poll SCM Schedule: H/15 * * * * (每 15 分钟检查一次) ``` #### 步骤 4:配置 Pipeline(流水线定义) 选择 **Pipeline script from SCM**: ``` SCM: Git Repositories: Repository URL: https://git.f.novalon.cn/novalon/novalon-website.git Credentials: (添加 Gitea 凭据) Branch: */dev (或 */main) Script Path: Jenkinsfile Lightweight checkout: ☑️ 勾选 ``` #### 步骤 5:添加凭据(Credentials) 1. 点击 **Add → Jenkins** 2. 选择 **Username with password** 3. 输入 Gitea 账号密码: - Username: `你的 Gitea 用户名` - Password: `你的 Gitea 密码或 Personal Access Token` 4. ID: `gitea-credentials`(自定义) 5. 点击 **Add** #### 步骤 6:保存并测试 1. 点击 **Save** 保存配置 2. 点击 **Build Now** 手动触发一次构建 3. 查看控制台输出确认流程正常 --- ### 方法 B:Pipeline as Code(Jenkinsfile 已包含) 由于项目根目录已包含 [Jenkinsfile](../Jenkinsfile),Jenkins 会自动读取。 只需确保: 1. ✅ Jenkinsfile 在仓库根目录 2. ✅ Pipeline 任务指向正确的分支和 Jenkinsfile 路径 3. ✅ 所需插件已安装 --- ## 🔗 配置 Gitea Webhook ### 步骤 1:在 Gitea 中创建 Webhook 1. 打开 Gitea 仓库:`https://git.f.novalon.cn/novalon/novalon-website` 2. 点击 **Settings → Webhooks → Add Webhook → Gitea** 3. 配置如下: ``` Target URL: http://:8080/generic-webhook-trigger/invoke?token=novalon-website-ci-token HTTP Method: POST Content Type: application/json Secret: (留空或设置密钥) Trigger On: ☑️ Push Events ☐ Create Events ☐ Pull Request Events (可选) ☐ Tag Events (可选) Branch Filter: dev, main, develop (逗号分隔,留空表示所有分支) Active: ☑️ 勾选 ``` 4. 点击 **Add Webhook** ### 步骤 2:测试 Webhook 1. 在 Webhook 列表中,点击刚创建的 Webhook 2. 点击 **Test Delivery → Push Event** 3. 查看 **Recent Deliveries** 确认状态为 **200 OK** 4. 检查 Jenkins 是否收到触发并开始构建 --- ## 🔐 配置部署凭据(SSH) ### 步骤 1:生成 SSH 密钥对(如果还没有) ```bash # 在 Jenkins 服务器上执行 ssh-keygen -t rsa -b 4096 -C "jenkins@novalon" -f ~/.ssh/jenkins_deploy_key ``` ### 步骤 2:将公钥添加到生产服务器 ```bash # 复制公钥内容 cat ~/.ssh/jenkins_deploy_key.pub # 在生产服务器(139.155.109.62)上执行 echo "公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys ``` ### 步骤 3:在 Jenkins 中添加 SSH 凭据 1. **Manage Jenkins → Credentials → System → Global credentials** 2. **Add Credentials → SSH Username with private key** 3. 配置: ``` ID: deploy-server-ssh Username: root Private Key: ☑️ Enter directly (粘贴私钥内容:~/.ssh/jenkins_deploy_key 的内容) Passphrase: (如果有则填写,否则留空) ``` 4. 点击 **Save** ### 步骤 4:更新 Jenkinsfile 使用凭据 编辑 [Jenkinsfile](../Jenkinsfile) 中的部署阶段,添加: ```groovy stage('🚀 部署到生产环境') { when { allOf { anyOf { branch 'main'; branch 'develop' } expression { return params.DEPLOY_TO_PRODUCTION } } } steps { sshagent(['deploy-server-ssh']) { sh ''' # 部署命令... ''' } } } ``` --- ## 📧 配置通知 ### 选项 1:邮件通知 1. **Manage Jenkins → System** 2. 找到 **E-mail Notification** 部分: ``` SMTP server: smtp.qq.com (或你的 SMTP 服务器) SMTP Port: 465 Use SSL: ☑️ Username: your-email@qq.com Password: 你的授权码(不是 QQ 密码) Reply-To Address: your-email@qq.com Charset: UTF-8 ``` 3. 点击 **Test configuration** 发送测试邮件 4. 点击 **Save** ### 选项 2:钉钉机器人通知(推荐国内团队) 1. 创建钉钉群机器人: - 打开钉钉群 → 设置 → 智能群助手 → 添加机器人 - 选择 **Custom(通过 Webhook 地址接入)** - 复制 Webhook URL:`https://oapi.dingtalk.com/robot/send?access_token=xxx` 2. 安装 **DingTalk Plugin**(或在 Jenkinsfile 中使用 curl): 在 Jenkinsfile 的 `post { always {} }` 部分添加: ```groovy post { always { script { def webhookUrl = 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN' def message = """ { "msgtype": "markdown", "markdown": { "title": "Jenkins 构建通知", "text": "## Jenkins 构建通知\\n> 项目:${env.PROJECT_NAME}\\n> 分支:${env.GIT_BRANCH}\\n> 构建号:#${env.BUILD_NUMBER}\\n> 状态:${currentBuild.result ?: 'SUCCESS'}\\n> 时间:${new Date().format('yyyy-MM-dd HH:mm:ss')}" } } """ sh "curl -s -X POST '${webhookUrl}' -H 'Content-Type: application/json' -d '${message}'" } } } ``` --- ## 🧪 手动触发构建验证 ### 第一次构建建议手动触发: 1. 进入任务页面:`novalon-website-ci-cd` 2. 点击 **Build Now** 3. 点击正在运行的构建号查看实时日志 4. 确认以下阶段成功: ``` ✅ Stage 1: 🔧 环境准备 ✅ Stage 2: 📥 安装依赖 ✅ Stage 3: 🔍 ESLint 检查 ✅ Stage 4: 🔍 TypeScript 类型检查 ✅ Stage 5: 🧪 单元测试 + 覆盖率 ✅ Stage 6: 🏗️ 生产构建 ⏭️ Stage 7: 🧪 E2E 测试(需要 Playwright 浏览器) ⏭️ Stage 8: ⚡ 性能测试(需要 k6) ⏭️ Stage 9: 🚀 部署(需要勾选 DEPLOY_TO_PRODUCTION 参数) ``` ### 查看构建产物: 1. 点击完成的构建号 2. 左侧菜单查看: - **Console Output** - 完整日志 - **Coverage Report (Jest)** - 测试覆盖率报告 - **Edit Build Information** - 构建元数据 --- ## 🔄 常见问题排查 ### 问题 1:Webhook 未触发构建 **症状**:推送代码后 Jenkins 无反应 **解决方案**: 1. 检查 Gitea Webhook 的 **Recent Deliveries** 状态码是否为 200 2. 确认 Jenkins URL 正确且可从 Gitea 访问 3. 检查 Jenkins 安全设置(Configure Global Security): - CSRF Protection → Enable proxy compatibility - Allow anonymous read access(如果需要) ### 问题 2:Node.js 版本错误 **症状**:`ERROR: Node.js version not found` **解决方案**: 1. 确认已在 **Manage Jenkins → Tools** 中配置 Node.js 18 2. 检查 Jenkinsfile 中的 `nodejs(nodeJSInstallationName: '18')` 名称匹配 ### 问题 3:npm install 失败 **症状**:`npm ERR! network error` **解决方案**: 1. 检查 npm registry 配置(默认使用 npmmirror 镜像) 2. 如果是私有包,配置 `.npmrc` 文件 3. 检查 Jenkins 服务器的网络连接 ### 问题 4:SSH 部署失败 **症状**:`Permission denied (publickey)` **解决方案**: 1. 确认 SSH 私钥已正确添加到 Jenkins 凭据 2. 确认生产服务器的 `~/.ssh/authorized_keys` 包含对应公钥 3. 测试 SSH 连接:`ssh root@139.155.109.62` ### 问题 5:ESLint 或 TypeScript 检查失败 **症状**:构建在代码质量检查阶段失败 **解决方案**: 1. 查看完整错误日志 2. 在本地运行修复: ```bash npm run lint --fix npm run type-check ``` 3. 修复问题后重新提交代码 --- ## 📊 监控与优化 ### 构建历史分析 1. 进入任务主页 2. 查看构建趋势图(成功率、平均耗时) 3. 识别瓶颈阶段(通常是安装依赖或测试) ### 性能优化建议 1. **启用构建缓存**: ```groovy environment { CI_CACHE_PATH = "${HOME}/.cache/novalon-website" } ``` 2. **并行化测试**:在 Jenkinsfile 中使用 `parallel` 执行多个测试套件 3. **增量构建**:只对变更的模块运行测试(需要 monorepo 结构) 4. **Docker 化构建环境**:使用 Docker agent 保证一致性 --- ## ✅ 完成清单 完成以下所有项后,CI/CD 流水线即可正常运行: - [x] 推送代码到 Gitea ✅ - [ ] 安装 Jenkins 必要插件 - [ ] 配置全局工具(Node.js 18, Git) - [ ] 创建 Pipeline 任务(指向 dev 分支的 Jenkinsfile) - [ ] 添加 Gitea 凭据(Username with Password) - [ ] 配置 Gitea Webhook(Push Events → Jenkins Generic Trigger) - [ ] 添加部署 SSH 凭据(生产服务器访问权限) - [ ] 配置通知渠道(邮件/钉钉) - [ ] 手动触发首次构建验证 - [ ] 确认所有阶段成功通过 - [ ] 测试自动触发(推送代码 → Jenkins 自动构建) --- ## 🎯 下一步操作 ### 立即执行: 1. **登录 Jenkins 并按照上述步骤创建任务** 2. **配置 Gitea Webhook** 3. **手动触发第一次构建** 4. **查看构建日志确认流程正常** ### 本周内完成: 1. **设置构建失败告警** 2. **建立定期审查机制(每周审查构建成功率)** 3. **优化构建性能(目标:<10 分钟完成全流程)** --- ## 📞 技术支持 如遇到问题,请检查: 1. **Jenkins 系统日志**:`Manage Jenkins → System Log` 2. **Gitea Webhook 日志**:Webhook 页面的 Recent Deliveries 3. **构建控制台输出**:每次构建的 Console Output --- **文档版本**: v1.0 **最后更新**: 2026-01-15 **适用版本**: Jenkins 2.400+, Gitea 1.19+