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. 相关文档 ​