Jenkins部署
1. 概述
Jenkins 是一个开源的自动化服务器,用于实现持续集成和持续部署(CI/CD)。梵医云系统使用 Jenkins 进行自动化构建、镜像构建和部署。本文档介绍如何部署和使用 Jenkins。
2. 环境要求
2.1 硬件要求
| 组件 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 4 核 | 8 核及以上 |
| 内存 | 8 GB | 16 GB 及以上 |
| 硬盘 | 100 GB | 200 GB 及以上 |
| 网络 | 100 Mbps | 1 Gbps |
2.2 软件要求
| 软件 | 版本要求 | 说明 |
|---|---|---|
| 操作系统 | CentOS 7+ / Ubuntu 20.04+ | Linux 发行版 |
| JDK | 11+ | Java 运行环境 |
| Maven | 3.6+ | 项目构建工具 |
| Git | 2.0+ | 版本控制工具 |
| Docker | 20.10+ | 容器运行时 |
| Docker Compose | 1.29+ | 容器编排工具 |
3. 安装 Jenkins
3.1 安装 JDK
bash
# 下载 JDK
cd /opt
wget https://download.java.net/java/GA/jdk11.0.2/9/GPL/openjdk-11.0.2_linux-x64_bin.tar.gz
# 解压 JDK
tar -zxvf openjdk-11.0.2_linux-x64_bin.tar.gz
mv jdk-11.0.2 jdk11
# 配置环境变量
cat >> /etc/profile << EOF
export JAVA_HOME=/opt/jdk11
export PATH=\$JAVA_HOME/bin:\$PATH
EOF
source /etc/profile
# 验证安装
java -version3.2 安装 Maven
bash
# 下载 Maven
cd /opt
wget https://archive.apache.org/dist/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
# 解压 Maven
tar -zxvf apache-maven-3.8.8-bin.tar.gz
mv apache-maven-3.8.8 maven-3.8.8
# 配置环境变量
cat >> /etc/profile << EOF
export MAVEN_HOME=/opt/maven-3.8.8
export PATH=\$MAVEN_HOME/bin:\$PATH
EOF
source /etc/profile
# 验证安装
mvn -version3.3 安装 Git
bash
# CentOS/RHEL
sudo yum install -y git
# Ubuntu/Debian
sudo apt install -y git
# 验证安装
git --version3.4 安装 Docker
参考 Docker部署 文档。
3.5 安装 Jenkins
3.5.1 添加 Jenkins 仓库
CentOS/RHEL:
bash
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repoUbuntu/Debian:
bash
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'3.5.2 安装 Jenkins
CentOS/RHEL:
bash
sudo yum install -y jenkinsUbuntu/Debian:
bash
sudo apt update
sudo apt install -y jenkins3.5.3 启动 Jenkins
bash
sudo systemctl start jenkins
sudo systemctl enable jenkins3.5.4 访问 Jenkins
打开浏览器访问:
http://your-server-ip:80803.5.5 解锁 Jenkins
- 查看初始密码
bash
sudo cat /var/lib/jenkins/secrets/initialAdminPassword- 在 Jenkins 解锁页面输入密码
- 安装推荐插件
- 创建管理员账号
4. 配置 Jenkins
4.1 安装插件
登录 Jenkins 后,安装以下插件:
- Git Plugin
- Git Parameter Plugin
- Docker Pipeline Plugin
- Docker Build Step Plugin
- Pipeline Utility Steps
- SSH Agent Plugin
- Credentials Binding Plugin
4.2 配置 JDK
- 进入"Manage Jenkins" -> "Global Tool Configuration"
- 找到"JDK"部分
- 点击"JDK 安装..."
- 配置 JDK:
- Name:
JDK11 - JAVA_HOME:
/opt/jdk11
- Name:
- 点击"保存"
4.3 配置 Maven
- 进入"Manage Jenkins" -> "Global Tool Configuration"
- 找到"Maven"部分
- 点击"Maven 安装..."
- 配置 Maven:
- Name:
Maven3.8.8 - MAVEN_HOME:
/opt/maven-3.8.8
- Name:
- 点击"保存"
4.4 配置 Git
- 进入"Manage Jenkins" -> "Global Tool Configuration"
- 找到"Git"部分
- 配置 Git:
- Name:
Git - Path to Git executable:
/usr/bin/git
- Name:
- 点击"保存"
4.5 配置 Docker
- 进入"Manage Jenkins" -> "Configure System"
- 找到"Cloud"部分
- 点击"Add a new cloud" -> "Docker"
- 配置 Docker:
- Docker Host URI:
unix:///var/run/docker.sock - Server URL:
http://localhost:2375
- Docker Host URI:
- 点击"Test Connection"验证连接
- 点击"保存"
4.6 配置凭证
4.6.1 添加 Git 凭证
- 进入"Credentials" -> "System" -> "Global credentials"
- 点击"Add Credentials"
- 配置凭证:
- Kind:
Username with password - Username:
your-git-username - Password:
your-git-password - ID:
git-credentials - Description:
Git 凭证
- Kind:
- 点击"创建"
4.6.2 添加 Harbor 凭证
- 进入"Credentials" -> "System" -> "Global credentials"
- 点击"Add Credentials"
- 配置凭证:
- Kind:
Username with password - Username:
admin - Password:
Harbor12345 - ID:
harbor-credentials - Description:
Harbor 凭证
- Kind:
- 点击"创建"
5. 创建 Jenkins 任务
5.1 创建 Pipeline 任务
- 点击"新建任务"
- 输入任务名称:
fanyi-cloud-build - 选择任务类型:
Pipeline - 点击"确定"
5.2 配置 Pipeline
- 进入任务配置页面
- 配置"General"部分:
- Description:
梵医云项目构建任务
- Description:
- 配置"构建触发器"部分:
- 勾选"Build periodically"
- 日程表:
H H * * *(每小时构建一次)
- 配置"Pipeline"部分:
- Definition:
Pipeline script from SCM - SCM:
Git - Repository URL:
https://gitee.com/fantianyi-network/fanyi-cloud.git - Credentials:
git-credentials - Branches to build:
*/master - Script Path:
Jenkinsfile
- Definition:
- 点击"保存"
6. Jenkins Pipeline 说明
6.1 Pipeline 结构
梵医云项目的 Jenkins Pipeline 包含以下阶段:
- 拉取代码:从 Git 仓库拉取代码
- 初始化变量:初始化构建变量
- 预发版通知:发送预发版通知
- 打包:使用 Maven 打包项目
- 构建镜像:使用 Docker 构建镜像
- 推送镜像:推送镜像到 Harbor
- 发版结束通知:发送发版结束通知
6.2 Pipeline 参数
Pipeline 支持以下参数:
ServicesDeploy:选择要构建的服务
- fanyi-dependencies
- fanyi-gateway
- fanyi-module-ai-biz
- fanyi-module-bpm-biz
- fanyi-module-crm-biz
- fanyi-module-erp-biz
- fanyi-module-infra-biz
- fanyi-module-product-biz
- fanyi-module-promotion-biz
- fanyi-module-statistics-biz
- fanyi-module-trade-biz
- fanyi-module-member-biz
- fanyi-module-mp-biz
- fanyi-module-pay-biz
- fanyi-module-report-biz
- fanyi-module-system-biz
buildTag:选择分支或标签
- 默认值:
*/master
- 默认值:
6.3 Pipeline 环境变量
Pipeline 使用以下环境变量:
groovy
environment {
GIT_URL="https://gitee.com/fantianyi-network/fanyi-cloud.git"
GIT_ID="git-credentials"
MAVEN_BIN = '/opt/maven-3.8.8/bin'
REGISTRY = 'harbor.kangshouyun.com'
HARBOR_NAMESPACE = 'fanyi-cloud'
HARBOR_USERNAME = 'admin'
HARBOR_PASSWORD = 'Harbor12345'
PROJECT = 'fanyi-cloud'
WECHAT_KEY = 'your-wechat-key'
}6.4 Pipeline 阶段详解
6.4.1 拉取代码
groovy
stage ('拉取代码') {
steps {
checkout scmGit(
branches: [[name: "${params.buildTag}"]],
extensions: [],
userRemoteConfigs: [[credentialsId: "${GIT_ID}", url: "${GIT_URL}"]]
)
}
}6.4.2 初始化变量
groovy
stage('初始化变量') {
agent none
steps {
script {
ServicesBuild = "${params.ServicesDeploy}".split(",")
}
}
}6.4.3 预发版通知
groovy
stage('预发版通知') {
agent none
steps {
script {
for (service in ServicesBuild) {
stage ("pre release ${service}") {
sh "curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${WECHAT_KEY}' \
-H 'Content-Type: application/json' \
-d '{\"msgtype\": \"text\",\"text\": {\"content\":\"服务正在准备发版,当前项目:${PROJECT};当前服务:${service}\"}}'"
}
}
}
}
}6.4.4 打包
groovy
stage('打包') {
agent none
steps {
script {
for (service in ServicesBuild) {
stage ("package ${service}") {
if("${service}".trim() == "fanyi-dependencies"){
sh "cd fanyi-dependencies && ${MAVEN_BIN}/mvn clean install"
}
if("${service}".trim() == "fanyi-gateway"){
sh "cd fanyi-gateway && ${MAVEN_BIN}/mvn clean package -am -Dmaven.test.skip=true"
}
if("${service}".trim() == "fanyi-module-system-biz"){
sh "${MAVEN_BIN}/mvn clean package -pl fanyi-module-system/fanyi-module-system-biz -am -Dmaven.test.skip=true"
}
}
}
}
}
}6.4.5 构建镜像
groovy
stage('构建镜像') {
agent none
steps {
script {
for (service in ServicesBuild) {
stage ("build ${service}") {
if("${service}".trim() == "fanyi-gateway"){
sh "cd fanyi-gateway && docker build -f Dockerfile -t ${service} ."
sh "docker tag ${service} $REGISTRY/$HARBOR_NAMESPACE/${service}:latest"
}
}
}
}
}
}6.4.6 推送镜像
groovy
stage('推送镜像之latest') {
agent none
steps {
script {
for (service in ServicesBuild) {
stage ("pushLatest ${service}") {
if("${service}".trim() != "fanyi-dependencies"){
sh "docker login $REGISTRY -u $HARBOR_USERNAME -p $HARBOR_PASSWORD"
sh "docker push $REGISTRY/$HARBOR_NAMESPACE/${service}:latest"
sh "docker image prune -f"
}
}
}
}
}
}6.4.7 发版结束通知
groovy
stage('发版结束通知') {
agent none
steps {
script {
for (service in ServicesBuild) {
stage ("pre release ${service}") {
sh "curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${WECHAT_KEY}' \
-H 'Content-Type: application/json' \
-d '{\"msgtype\": \"text\",\"text\": {\"content\":\"服务发版已结束,当前项目:${PROJECT};当前服务:${service}\"}}'"
}
}
}
}
}7. 使用 Jenkins 构建项目
7.1 手动构建
- 进入 Jenkins 首页
- 点击任务名称:
fanyi-cloud-build - 点击"Build with Parameters"
- 选择要构建的服务
- 选择分支或标签
- 点击"开始构建"
7.2 查看构建日志
- 进入任务页面
- 点击构建编号
- 点击"Console Output"查看日志
7.3 查看构建历史
- 进入任务页面
- 点击"Build History"查看历史构建记录
8. 通知配置
8.1 企业微信通知
8.1.1 获取企业微信 Webhook
- 登录企业微信管理后台
- 进入"应用管理" -> "应用"
- 创建或选择应用
- 进入"接收消息" -> "设置 API 接收"
- 获取 Webhook URL
8.1.2 配置 Webhook
在 Pipeline 中配置企业微信 Webhook:
groovy
environment {
WECHAT_KEY = 'your-wechat-key'
}8.1.3 发送通知
使用 curl 发送企业微信通知:
bash
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${WECHAT_KEY}' \
-H 'Content-Type: application/json' \
-d '{\"msgtype\": \"text\",\"text\": {\"content\":\"服务正在准备发版,当前项目:${PROJECT};当前服务:${service}\"}}'8.2 邮件通知
8.2.1 配置邮件通知
- 进入"Manage Jenkins" -> "Configure System"
- 找到"邮件通知"部分
- 配置邮件:
- SMTP server:
smtp.example.com - Default user e-mail suffix:
@example.com - Use SSL: 勾选
- SMTP port:
465 - Sender E-mail Address:
jenkins@example.com - Reply-To Address:
jenkins@example.com - Character set:
UTF-8
- SMTP server:
- 点击"Test configuration"测试邮件发送
- 点击"保存"
8.2.2 配置任务邮件通知
- 进入任务配置页面
- 找到"构建后操作"部分
- 勾选"E-mail Notifications"
- 配置邮件:
- Recipients:
team@example.com - Send e-mail for every unstable build: 勾选
- Send e-mail for each failed build: 勾选
- Recipients:
- 点击"保存"
9. Harbor 镜像仓库集成
9.1 安装 Harbor
参考 Harbor 官方文档进行安装。
9.2 配置 Harbor
- 登录 Harbor
- 创建项目:
fanyi-cloud - 创建用户:
jenkins - 分配用户权限
9.3 Jenkins 登录 Harbor
在 Pipeline 中配置 Harbor 登录:
groovy
environment {
REGISTRY = 'harbor.kangshouyun.com'
HARBOR_USERNAME = 'admin'
HARBOR_PASSWORD = 'Harbor12345'
}
stage('推送镜像之latest') {
agent none
steps {
script {
sh "docker login $REGISTRY -u $HARBOR_USERNAME -p $HARBOR_PASSWORD"
sh "docker push $REGISTRY/$HARBOR_NAMESPACE/${service}:latest"
}
}
}10. 常见问题
10.1 构建失败
问题:构建失败
解决方案:
- 查看构建日志
- 检查代码是否有语法错误
- 检查依赖是否正确
- 检查环境变量是否正确
10.2 Docker 构建失败
问题:Docker 镜像构建失败
解决方案:
- 检查 Dockerfile 是否正确
- 检查 Docker 是否正常运行
- 检查网络连接
- 检查磁盘空间
10.3 推送镜像失败
问题:推送镜像到 Harbor 失败
解决方案:
- 检查 Harbor 凭证是否正确
- 检查 Harbor 是否正常运行
- 检查网络连接
- 检查 Harbor 权限
10.4 通知发送失败
问题:企业微信通知发送失败
解决方案:
- 检查 Webhook Key 是否正确
- 检查网络连接
- 检查企业微信配置
- 查看企业微信后台日志
10.5 Maven 依赖下载失败
问题:Maven 依赖下载失败
解决方案:
- 检查网络连接
- 配置 Maven 镜像
- 清理 Maven 本地仓库
- 检查 Maven 配置
11. 性能优化
11.1 并行构建
在 Pipeline 中使用并行构建:
groovy
stage('打包') {
parallel {
stage('package gateway') {
steps {
sh "cd fanyi-gateway && ${MAVEN_BIN}/mvn clean package -am -Dmaven.test.skip=true"
}
}
stage('package system') {
steps {
sh "${MAVEN_BIN}/mvn clean package -pl fanyi-module-system/fanyi-module-system-biz -am -Dmaven.test.skip=true"
}
}
}
}11.2 使用构建缓存
配置 Maven 使用本地仓库缓存:
groovy
options {
skipDefaultCheckout()
buildDiscarder(logRotator(numToKeepStr: '10'))
timestamps()
}11.3 限制并发构建数
在"Manage Jenkins" -> "Configure System"中配置:
- 执行者数量:
4 - 并发构建数:
2
12. 安全配置
12.1 启用安全矩阵
- 进入"Manage Jenkins" -> "Configure Global Security"
- 配置"授权策略":
- 勾选"安全矩阵"
- 添加用户和权限
- 点击"保存"
12.2 配置 CSRF 保护
- 进入"Manage Jenkins" -> "Configure Global Security"
- 配置"CSRF Protection":
- 勾选"防止跨站点请求伪造"
- 点击"保存"
12.3 配置代理
- 进入"Manage Jenkins" -> "Configure Global Security"
- 配置"代理服务器":
- 勾选"启用代理"
- 配置代理地址和端口
- 点击"保存"
13. 备份和恢复
13.1 备份 Jenkins 配置
bash
# 备份 Jenkins 配置
sudo cp -r /var/lib/jenkins/jobs /backup/jenkins_jobs_$(date +%Y%m%d)
sudo cp -r /var/lib/jenkins/users /backup/jenkins_users_$(date +%Y%m%d)13.2 备份 Jenkins 插件
bash
# 备份 Jenkins 插件
sudo cp -r /var/lib/jenkins/plugins /backup/jenkins_plugins_$(date +%Y%m%d)13.3 恢复 Jenkins 配置
bash
# 恢复 Jenkins 配置
sudo cp -r /backup/jenkins_jobs_20240101 /var/lib/jenkins/jobs
sudo cp -r /backup/jenkins_users_20240101 /var/lib/jenkins/users13.4 恢复 Jenkins 插件
bash
# 恢复 Jenkins 插件
sudo cp -r /backup/jenkins_plugins_20240101 /var/lib/jenkins/plugins14. 监控和日志
14.1 查看 Jenkins 日志
bash
# 查看 Jenkins 日志
sudo tail -f /var/log/jenkins/jenkins.log14.2 查看构建日志
在 Jenkins 界面中查看构建日志。
14.3 配置日志轮转
编辑 /etc/logrotate.d/jenkins:
/var/log/jenkins/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 jenkins jenkins
}15. 注意事项
- 资源管理:合理配置 Jenkins 资源,避免资源争抢
- 日志管理:定期清理日志文件,避免磁盘空间不足
- 备份策略:定期备份 Jenkins 配置和插件
- 安全配置:启用安全矩阵和 CSRF 保护
- 监控告警:配置 Jenkins 监控和告警,及时发现问题
- 版本管理:记录 Jenkins 版本,便于升级和回滚
- 权限管理:合理配置用户权限,确保安全性
- 插件管理:定期更新插件,保持系统最新
