Skip to content

Jenkins部署

1. 概述

Jenkins 是一个开源的自动化服务器,用于实现持续集成和持续部署(CI/CD)。梵医云系统使用 Jenkins 进行自动化构建、镜像构建和部署。本文档介绍如何部署和使用 Jenkins。

2. 环境要求

2.1 硬件要求

组件最低配置推荐配置
CPU4 核8 核及以上
内存8 GB16 GB 及以上
硬盘100 GB200 GB 及以上
网络100 Mbps1 Gbps

2.2 软件要求

软件版本要求说明
操作系统CentOS 7+ / Ubuntu 20.04+Linux 发行版
JDK11+Java 运行环境
Maven3.6+项目构建工具
Git2.0+版本控制工具
Docker20.10+容器运行时
Docker Compose1.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 -version

3.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 -version

3.3 安装 Git

bash
# CentOS/RHEL
sudo yum install -y git

# Ubuntu/Debian
sudo apt install -y git

# 验证安装
git --version

3.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.repo

Ubuntu/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 jenkins

Ubuntu/Debian

bash
sudo apt update
sudo apt install -y jenkins

3.5.3 启动 Jenkins

bash
sudo systemctl start jenkins
sudo systemctl enable jenkins

3.5.4 访问 Jenkins

打开浏览器访问:

http://your-server-ip:8080

3.5.5 解锁 Jenkins

  1. 查看初始密码
bash
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
  1. 在 Jenkins 解锁页面输入密码
  2. 安装推荐插件
  3. 创建管理员账号

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

  1. 进入"Manage Jenkins" -> "Global Tool Configuration"
  2. 找到"JDK"部分
  3. 点击"JDK 安装..."
  4. 配置 JDK:
    • Name: JDK11
    • JAVA_HOME: /opt/jdk11
  5. 点击"保存"

4.3 配置 Maven

  1. 进入"Manage Jenkins" -> "Global Tool Configuration"
  2. 找到"Maven"部分
  3. 点击"Maven 安装..."
  4. 配置 Maven:
    • Name: Maven3.8.8
    • MAVEN_HOME: /opt/maven-3.8.8
  5. 点击"保存"

4.4 配置 Git

  1. 进入"Manage Jenkins" -> "Global Tool Configuration"
  2. 找到"Git"部分
  3. 配置 Git:
    • Name: Git
    • Path to Git executable: /usr/bin/git
  4. 点击"保存"

4.5 配置 Docker

  1. 进入"Manage Jenkins" -> "Configure System"
  2. 找到"Cloud"部分
  3. 点击"Add a new cloud" -> "Docker"
  4. 配置 Docker:
    • Docker Host URI: unix:///var/run/docker.sock
    • Server URL: http://localhost:2375
  5. 点击"Test Connection"验证连接
  6. 点击"保存"

4.6 配置凭证

4.6.1 添加 Git 凭证

  1. 进入"Credentials" -> "System" -> "Global credentials"
  2. 点击"Add Credentials"
  3. 配置凭证:
    • Kind: Username with password
    • Username: your-git-username
    • Password: your-git-password
    • ID: git-credentials
    • Description: Git 凭证
  4. 点击"创建"

4.6.2 添加 Harbor 凭证

  1. 进入"Credentials" -> "System" -> "Global credentials"
  2. 点击"Add Credentials"
  3. 配置凭证:
    • Kind: Username with password
    • Username: admin
    • Password: Harbor12345
    • ID: harbor-credentials
    • Description: Harbor 凭证
  4. 点击"创建"

5. 创建 Jenkins 任务

5.1 创建 Pipeline 任务

  1. 点击"新建任务"
  2. 输入任务名称:fanyi-cloud-build
  3. 选择任务类型:Pipeline
  4. 点击"确定"

5.2 配置 Pipeline

  1. 进入任务配置页面
  2. 配置"General"部分:
    • Description: 梵医云项目构建任务
  3. 配置"构建触发器"部分:
    • 勾选"Build periodically"
    • 日程表:H H * * *(每小时构建一次)
  4. 配置"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
  5. 点击"保存"

6. Jenkins Pipeline 说明

6.1 Pipeline 结构

梵医云项目的 Jenkins Pipeline 包含以下阶段:

  1. 拉取代码:从 Git 仓库拉取代码
  2. 初始化变量:初始化构建变量
  3. 预发版通知:发送预发版通知
  4. 打包:使用 Maven 打包项目
  5. 构建镜像:使用 Docker 构建镜像
  6. 推送镜像:推送镜像到 Harbor
  7. 发版结束通知:发送发版结束通知

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 手动构建

  1. 进入 Jenkins 首页
  2. 点击任务名称:fanyi-cloud-build
  3. 点击"Build with Parameters"
  4. 选择要构建的服务
  5. 选择分支或标签
  6. 点击"开始构建"

7.2 查看构建日志

  1. 进入任务页面
  2. 点击构建编号
  3. 点击"Console Output"查看日志

7.3 查看构建历史

  1. 进入任务页面
  2. 点击"Build History"查看历史构建记录

8. 通知配置

8.1 企业微信通知

8.1.1 获取企业微信 Webhook

  1. 登录企业微信管理后台
  2. 进入"应用管理" -> "应用"
  3. 创建或选择应用
  4. 进入"接收消息" -> "设置 API 接收"
  5. 获取 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 配置邮件通知

  1. 进入"Manage Jenkins" -> "Configure System"
  2. 找到"邮件通知"部分
  3. 配置邮件:
    • 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
  4. 点击"Test configuration"测试邮件发送
  5. 点击"保存"

8.2.2 配置任务邮件通知

  1. 进入任务配置页面
  2. 找到"构建后操作"部分
  3. 勾选"E-mail Notifications"
  4. 配置邮件:
    • Recipients: team@example.com
    • Send e-mail for every unstable build: 勾选
    • Send e-mail for each failed build: 勾选
  5. 点击"保存"

9. Harbor 镜像仓库集成

9.1 安装 Harbor

参考 Harbor 官方文档进行安装。

9.2 配置 Harbor

  1. 登录 Harbor
  2. 创建项目:fanyi-cloud
  3. 创建用户:jenkins
  4. 分配用户权限

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 构建失败

问题:构建失败

解决方案

  1. 查看构建日志
  2. 检查代码是否有语法错误
  3. 检查依赖是否正确
  4. 检查环境变量是否正确

10.2 Docker 构建失败

问题:Docker 镜像构建失败

解决方案

  1. 检查 Dockerfile 是否正确
  2. 检查 Docker 是否正常运行
  3. 检查网络连接
  4. 检查磁盘空间

10.3 推送镜像失败

问题:推送镜像到 Harbor 失败

解决方案

  1. 检查 Harbor 凭证是否正确
  2. 检查 Harbor 是否正常运行
  3. 检查网络连接
  4. 检查 Harbor 权限

10.4 通知发送失败

问题:企业微信通知发送失败

解决方案

  1. 检查 Webhook Key 是否正确
  2. 检查网络连接
  3. 检查企业微信配置
  4. 查看企业微信后台日志

10.5 Maven 依赖下载失败

问题:Maven 依赖下载失败

解决方案

  1. 检查网络连接
  2. 配置 Maven 镜像
  3. 清理 Maven 本地仓库
  4. 检查 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 启用安全矩阵

  1. 进入"Manage Jenkins" -> "Configure Global Security"
  2. 配置"授权策略":
    • 勾选"安全矩阵"
    • 添加用户和权限
  3. 点击"保存"

12.2 配置 CSRF 保护

  1. 进入"Manage Jenkins" -> "Configure Global Security"
  2. 配置"CSRF Protection":
    • 勾选"防止跨站点请求伪造"
  3. 点击"保存"

12.3 配置代理

  1. 进入"Manage Jenkins" -> "Configure Global Security"
  2. 配置"代理服务器":
    • 勾选"启用代理"
    • 配置代理地址和端口
  3. 点击"保存"

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/users

13.4 恢复 Jenkins 插件

bash
# 恢复 Jenkins 插件
sudo cp -r /backup/jenkins_plugins_20240101 /var/lib/jenkins/plugins

14. 监控和日志

14.1 查看 Jenkins 日志

bash
# 查看 Jenkins 日志
sudo tail -f /var/log/jenkins/jenkins.log

14.2 查看构建日志

在 Jenkins 界面中查看构建日志。

14.3 配置日志轮转

编辑 /etc/logrotate.d/jenkins

/var/log/jenkins/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0644 jenkins jenkins
}

15. 注意事项

  1. 资源管理:合理配置 Jenkins 资源,避免资源争抢
  2. 日志管理:定期清理日志文件,避免磁盘空间不足
  3. 备份策略:定期备份 Jenkins 配置和插件
  4. 安全配置:启用安全矩阵和 CSRF 保护
  5. 监控告警:配置 Jenkins 监控和告警,及时发现问题
  6. 版本管理:记录 Jenkins 版本,便于升级和回滚
  7. 权限管理:合理配置用户权限,确保安全性
  8. 插件管理:定期更新插件,保持系统最新

16. 相关文档