- 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
12 KiB
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 | 钉钉通知 | ⚠️ 可选 |
安装步骤:
- 登录 Jenkins:
http://<your-jenkins-ip>:8080 - 导航到:Manage Jenkins → Plugins → Available plugins
- 搜索并安装上述插件
- 重启 Jenkins
2. 全局工具配置
配置 Node.js:
- Manage Jenkins → Tools
- 找到 NodeJS 部分
- 点击 Add NodeJS
- 配置如下:
Name: Node.js 18
Install automatically: ✅ 勾选
Version: 18.20.x (LTS)
- 点击 Save
配置 Git:
- 同样在 Tools 页面
- 找到 Git 部分
- 确保 Git 路径正确(通常
/usr/bin/git) - 如果未安装,选择 Install automatically
🚀 创建 Pipeline 任务
方法 A:通过 Jenkins UI 创建(推荐新手)
步骤 1:创建新任务
- 点击 New Item
- 输入任务名称:
novalon-website-ci-cd - 选择 Pipeline
- 点击 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 触发(推荐)
-
勾选 Trigger builds remotely
-
设置 Authentication Token:
novalon-website-ci-token -
在 Build Triggers 部分找到 Generic Webhook Trigger 或 Gitea Webhook:
- 如果使用 Generic Webhook Trigger 插件:
Token: novalon-website-ci-token
- 如果使用 Generic Webhook Trigger 插件:
-
保存任务后,获取 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)
- 点击 Add → Jenkins
- 选择 Username with password
- 输入 Gitea 账号密码:
- Username:
你的 Gitea 用户名 - Password:
你的 Gitea 密码或 Personal Access Token
- Username:
- ID:
gitea-credentials(自定义) - 点击 Add
步骤 6:保存并测试
- 点击 Save 保存配置
- 点击 Build Now 手动触发一次构建
- 查看控制台输出确认流程正常
方法 B:Pipeline as Code(Jenkinsfile 已包含)
由于项目根目录已包含 Jenkinsfile,Jenkins 会自动读取。
只需确保:
- ✅ Jenkinsfile 在仓库根目录
- ✅ Pipeline 任务指向正确的分支和 Jenkinsfile 路径
- ✅ 所需插件已安装
🔗 配置 Gitea Webhook
步骤 1:在 Gitea 中创建 Webhook
- 打开 Gitea 仓库:
https://git.f.novalon.cn/novalon/novalon-website - 点击 Settings → Webhooks → Add Webhook → Gitea
- 配置如下:
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: ☑️ 勾选
- 点击 Add Webhook
步骤 2:测试 Webhook
- 在 Webhook 列表中,点击刚创建的 Webhook
- 点击 Test Delivery → Push Event
- 查看 Recent Deliveries 确认状态为 200 OK
- 检查 Jenkins 是否收到触发并开始构建
🔐 配置部署凭据(SSH)
步骤 1:生成 SSH 密钥对(如果还没有)
# 在 Jenkins 服务器上执行
ssh-keygen -t rsa -b 4096 -C "jenkins@novalon" -f ~/.ssh/jenkins_deploy_key
步骤 2:将公钥添加到生产服务器
# 复制公钥内容
cat ~/.ssh/jenkins_deploy_key.pub
# 在生产服务器(139.155.109.62)上执行
echo "公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
步骤 3:在 Jenkins 中添加 SSH 凭据
- Manage Jenkins → Credentials → System → Global credentials
- Add Credentials → SSH Username with private key
- 配置:
ID: deploy-server-ssh
Username: root
Private Key:
☑️ Enter directly
(粘贴私钥内容:~/.ssh/jenkins_deploy_key 的内容)
Passphrase: (如果有则填写,否则留空)
- 点击 Save
步骤 4:更新 Jenkinsfile 使用凭据
编辑 Jenkinsfile 中的部署阶段,添加:
stage('🚀 部署到生产环境') {
when {
allOf {
anyOf { branch 'main'; branch 'develop' }
expression { return params.DEPLOY_TO_PRODUCTION }
}
}
steps {
sshagent(['deploy-server-ssh']) {
sh '''
# 部署命令...
'''
}
}
}
📧 配置通知
选项 1:邮件通知
- Manage Jenkins → System
- 找到 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 - 点击 Test configuration 发送测试邮件
- 点击 Save
选项 2:钉钉机器人通知(推荐国内团队)
-
创建钉钉群机器人:
- 打开钉钉群 → 设置 → 智能群助手 → 添加机器人
- 选择 Custom(通过 Webhook 地址接入)
- 复制 Webhook URL:
https://oapi.dingtalk.com/robot/send?access_token=xxx
-
安装 DingTalk Plugin(或在 Jenkinsfile 中使用 curl):
在 Jenkinsfile 的 post { always {} } 部分添加:
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}'"
}
}
}
🧪 手动触发构建验证
第一次构建建议手动触发:
- 进入任务页面:
novalon-website-ci-cd - 点击 Build Now
- 点击正在运行的构建号查看实时日志
- 确认以下阶段成功:
✅ 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 参数)
查看构建产物:
- 点击完成的构建号
- 左侧菜单查看:
- Console Output - 完整日志
- Coverage Report (Jest) - 测试覆盖率报告
- Edit Build Information - 构建元数据
🔄 常见问题排查
问题 1:Webhook 未触发构建
症状:推送代码后 Jenkins 无反应
解决方案:
- 检查 Gitea Webhook 的 Recent Deliveries 状态码是否为 200
- 确认 Jenkins URL 正确且可从 Gitea 访问
- 检查 Jenkins 安全设置(Configure Global Security):
- CSRF Protection → Enable proxy compatibility
- Allow anonymous read access(如果需要)
问题 2:Node.js 版本错误
症状:ERROR: Node.js version not found
解决方案:
- 确认已在 Manage Jenkins → Tools 中配置 Node.js 18
- 检查 Jenkinsfile 中的
nodejs(nodeJSInstallationName: '18')名称匹配
问题 3:npm install 失败
症状:npm ERR! network error
解决方案:
- 检查 npm registry 配置(默认使用 npmmirror 镜像)
- 如果是私有包,配置
.npmrc文件 - 检查 Jenkins 服务器的网络连接
问题 4:SSH 部署失败
症状:Permission denied (publickey)
解决方案:
- 确认 SSH 私钥已正确添加到 Jenkins 凭据
- 确认生产服务器的
~/.ssh/authorized_keys包含对应公钥 - 测试 SSH 连接:
ssh root@139.155.109.62
问题 5:ESLint 或 TypeScript 检查失败
症状:构建在代码质量检查阶段失败
解决方案:
- 查看完整错误日志
- 在本地运行修复:
npm run lint --fix npm run type-check - 修复问题后重新提交代码
📊 监控与优化
构建历史分析
- 进入任务主页
- 查看构建趋势图(成功率、平均耗时)
- 识别瓶颈阶段(通常是安装依赖或测试)
性能优化建议
-
启用构建缓存:
environment { CI_CACHE_PATH = "${HOME}/.cache/novalon-website" } -
并行化测试:在 Jenkinsfile 中使用
parallel执行多个测试套件 -
增量构建:只对变更的模块运行测试(需要 monorepo 结构)
-
Docker 化构建环境:使用 Docker agent 保证一致性
✅ 完成清单
完成以下所有项后,CI/CD 流水线即可正常运行:
- 推送代码到 Gitea ✅
- 安装 Jenkins 必要插件
- 配置全局工具(Node.js 18, Git)
- 创建 Pipeline 任务(指向 dev 分支的 Jenkinsfile)
- 添加 Gitea 凭据(Username with Password)
- 配置 Gitea Webhook(Push Events → Jenkins Generic Trigger)
- 添加部署 SSH 凭据(生产服务器访问权限)
- 配置通知渠道(邮件/钉钉)
- 手动触发首次构建验证
- 确认所有阶段成功通过
- 测试自动触发(推送代码 → Jenkins 自动构建)
🎯 下一步操作
立即执行:
- 登录 Jenkins 并按照上述步骤创建任务
- 配置 Gitea Webhook
- 手动触发第一次构建
- 查看构建日志确认流程正常
本周内完成:
- 设置构建失败告警
- 建立定期审查机制(每周审查构建成功率)
- 优化构建性能(目标:<10 分钟完成全流程)
📞 技术支持
如遇到问题,请检查:
- Jenkins 系统日志:
Manage Jenkins → System Log - Gitea Webhook 日志:Webhook 页面的 Recent Deliveries
- 构建控制台输出:每次构建的 Console Output
文档版本: v1.0 最后更新: 2026-01-15 适用版本: Jenkins 2.400+, Gitea 1.19+