docs: add comprehensive Jenkins CI/CD setup guide
- Step-by-step configuration for Pipeline job - Gitea Webhook integration instructions - SSH deployment credentials setup - Notification configuration (email/DingTalk) - Troubleshooting common issues - Performance optimization tips
This commit is contained in:
@@ -0,0 +1,467 @@
|
||||
# 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://<your-jenkins-ip>: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://<jenkins-ip>: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://<your-jenkins-ip>: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+
|
||||
Reference in New Issue
Block a user