Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群

这篇具有很好参考价值的文章主要介绍了Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Jenkins+Docker+SpringCloud部署方案优化

基于 Jenkins+Docker+SpringCloud微服务持续集成 作优化

上面部署方案存在的问题:

  1. 一次只能选择一个微服务部署
  2. 只有一台生产者部署服务器
  3. 每个微服务只有一个实例,容错率低

Jenkins+Docker+SpringCloud集群部署流程说明

Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
优化方案:

  1. 在一个Jenkins工程中可以选择多个微服务同时发布
  2. 在一个Jenkins工程中可以选择多台生产服务器同时部署
  3. 每个微服务都是以集群高可用形式部署

服务器列表

服务器名称 IP地址 安装软件 硬件配置 系统
代码托管服务器 192.168.100.240 Gitlab-12.9.9 2核4G CentOS Linux release 7.5.1804
持续集成服务器 192.168.100.241 Jenkins 2.401.2,JDK 11,JDK 1.8,Maven 3.8.8,Git 1.8.3.1,Docker 20.10.24-ce 2核4G CentOS Linux release 7.5.1804
代码审查服务器 192.168.100.242 mysql 5.7.43,sonarqube 6.7.7 1核2G CentOS Linux release 7.5.1804
Harbor仓库服务器 192.168.100.251 Docker 20.10.24-ce,Harbor 1.9.2 1核2G CentOS Linux release 7.5.1804
生产部署服务器 192.168.100.252 Docker 20.10.24-ce 1核2G CentOS Linux release 7.5.1804
生产部署服务器 192.168.100.253 Docker 20.10.24-ce 1核2G CentOS Linux release 7.5.1804

修改所有微服务配置

eureka配置
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
让eureka集群实现一个互相注册的功能!

# 集群版
spring:
  application:
    name: EUREKA-HA

---
server:
  port: 10086
spring:
  # 指定profile=eureka-server1
  profiles: eureka-server1
eureka:
  instance:
    # 指定当profile=eureka-server1时,主机名是eureka-server1
    hostname: 192.168.100.252
  client:
    service-url:
     # 将自己注册到eureka-server1、eureka-server2这个Eureka上面去
      defaultZone: http://192.168.100.252:10086/eureka,http://192.168.100.253:10086/eureka

---
server:
  port: 10086
spring:
  profiles: eureka-server2
eureka:
  instance:
    hostname: 192.168.100.253
  client:
    service-url:
      defaultZone: http://192.168.100.252:10086/eureka,http://192.168.100.253:10086/eureka

在启动微服务的时候,加入参数:spring.profiles.active 来读取对应的配置

其他微服务配置

除了Eureka注册中心以外,其他微服务配置都需要加入所有Eureka服务

# Eureka配置
eureka:
  client:
    service-url:  
      defaultZone: http://192.168.100.252:10086/eureka,http://192.168.100.253:10086/eureka # Eureka访问地址
  instance:
    prefer-ip-address: true

tensquare_zuul配置
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生tensquare_admin_service配置
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
tensquare_gathering配置
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
把代码提交到Gitlab中
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生

设计Jenkins集群项目的构建参数

因为要进行多项选择,安装Extended Choice Parameter插件
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
创建流水线项目(集群版)
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
添加参数化构建
选择字符串参数
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
添加多选项目参数
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
使用jdk1.8构建项目
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
点击构建查看效果
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生

编写多选项遍历脚本

多项目提交进行代码审查

// 定义变量以及引用变量,这样维护性好一点
// 引用凭证ID最好使用双引号 ""

// git凭证ID
def git_auth = "a4d0066f-6c58-4ab0-b714-6a24b3f5bc90"
// git的URL地址
def git_url = "git@192.168.100.240:tensquare_group/tensquare_back.git"
// 镜像的版本号
def tag = "latest"
// Harbor的url地址
def harbor_url = "192.168.100.251:85"
// 镜像库项目名称
def harbor_project = "tensquare"
// Harbor的登录凭证ID
def harbor_auth = "5785fbf3-a0f0-4234-8961-c866ca1e7046"

node {
    // 获取当前选择的项目名称 ,调用split方法 以逗号切割项目名称 返回的变量是一个数组
    def selectedProjectNames = "${project_name}".split(",")

    stage('拉取代码') {
      checkout scmGit(branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
    }
    stage('代码审查') {

      //
      for(int i=0;i<selectedProjectNames.length;i++){
        // 遍历selectedProjectNames后取出每个元素里的内容,就是project_name 项目信息
        def projectInfo = selectedProjectNames[i];
        // 取出项目名字 , 以@符号切割 [0] 为第一个参数 tensquare_eureka
        def currentProjectName = "${projectInfo}".split("@")[0]
        // 当前遍历的项目端口,取出项目端口
        def currentProjectPort = "${projectInfo}".split("@")[1]

        // 定义当前Jenkins的SonarQubeScanner工具的环境,位于全局工具配置的SonarQube Scanner 的name定义为'sonar-scanner'
        def scannerHome = tool 'sonar-scanner'
        // 引用当前JenkinsSonarQube的环境,系统配置的SonarQube servers定义的name以及代码审查服务器位置
        withSonarQubeEnv('sonarqube') {
          sh """
             cd ${currentProjectName}
             ${scannerHome}/bin/sonar-scanner
             """
        }
      }
    }

   stage('编译安装公共子工程') {
     sh "mvn -f tensquare_common clean install"
   }
   stage('编译打包微服务工程,上传镜像') {
     // 项目参数传入的project_name 修改为变量
     sh "mvn -f ${project_name} clean package dockerfile:build"

     // 定义镜像名称
     def imageName = "${project_name}:${tag}"

     // 对镜像打标签
     sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"

     // 把镜像推送到Harbor,项目为私有级别,登录时涉及一个问题,登录harbor需要输入账号和密码,Jenkinsfile需要配置项目目录下,会暴露给所有开发人员,为了安全使用凭证方式
     withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {

     // 登录到Harbor,引用如上定义的username和password,就是用户haibo的信息
     sh "docker login -u ${username} -p ${password} ${harbor_url}"

     // 镜像上传
     sh "docker push ${harbor_url}/${harbor_project}/${imageName}"

     sh "echo 镜像上传成功"
     }

     // 部署应用
     sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project $project_name $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
   }
}

尝试多选项目进行构建
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
控制台输出能够看到进行了两次代码审查,证明Jenkinsfile能够对项目进行遍历审查

但构建结果是失败的,在编译打包的时候无法进行遍历与project_name切割
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生

多个项目打包及构建上传镜像

修改Jenkinsfile,注释掉远程发布,查看编译构建和打包效果

// git凭证ID
def git_auth = "a4d0066f-6c58-4ab0-b714-6a24b3f5bc90"
// git的URL地址
def git_url = "git@192.168.100.240:tensquare_group/tensquare_back.git"
// 镜像的版本号
def tag = "latest"
// Harbor的url地址
def harbor_url = "192.168.100.251:85"
// 镜像库项目名称
def harbor_project = "tensquare"
// Harbor的登录凭证ID
def harbor_auth = "5785fbf3-a0f0-4234-8961-c866ca1e7046"

node {
    // 获取当前选择的项目名称 ,调用split方法 以逗号切割项目名称 返回的变量是一个数组
    def selectedProjectNames = "${project_name}".split(",")

    stage('拉取代码') {
      checkout scmGit(branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
    }
    stage('代码审查') {

      //
      for(int i=0;i<selectedProjectNames.length;i++){
        // 遍历selectedProjectNames后取出每个元素里的内容,就是project_name 项目信息
        def projectInfo = selectedProjectNames[i];
        // 取出项目名字 , 以@符号切割 [0] 为第一个参数 tensquare_eureka
        def currentProjectName = "${projectInfo}".split("@")[0]
        // 当前遍历的项目端口,取出项目端口
        def currentProjectPort = "${projectInfo}".split("@")[1]

        // 定义当前Jenkins的SonarQubeScanner工具的环境,位于全局工具配置的SonarQube Scanner 的name定义为'sonar-scanner'
        def scannerHome = tool 'sonar-scanner'
        // 引用当前JenkinsSonarQube的环境,系统配置的SonarQube servers定义的name以及代码审查服务器位置
        withSonarQubeEnv('sonarqube') {
          sh """
             cd ${currentProjectName}
             ${scannerHome}/bin/sonar-scanner
             """
        }
      }
    }

   stage('编译安装公共子工程') {
     sh "mvn -f tensquare_common clean install"
   }
   stage('编译打包微服务工程,上传镜像') {
     for(int i=0;i<selectedProjectNames.length;i++){
       // 遍历selectedProjectNames后取出每个元素里的内容,就是project_name 项目信息
       def projectInfo = selectedProjectNames[i];
       // 取出项目名字 , 以@符号切割 [0] 为第一个参数 tensquare_eureka
       def currentProjectName = "${projectInfo}".split("@")[0]
       // 当前遍历的项目端口,取出项目端口
       def currentProjectPort = "${projectInfo}".split("@")[1]

     // 项目参数传入的project_name 修改为变量
     sh "mvn -f ${currentProjectName} clean package dockerfile:build"

     // 定义镜像名称
     def imageName = "${currentProjectName}:${tag}"

     // 对镜像打标签
     sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"

     // 把镜像推送到Harbor,项目为私有级别,登录时涉及一个问题,登录harbor需要输入账号和密码,Jenkinsfile需要配置项目目录下,会暴露给所有开发人员,为了安全使用凭证方式
     withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {

       // 登录到Harbor,引用如上定义的username和password,就是用户haibo的信息
       sh "docker login -u ${username} -p ${password} ${harbor_url}"

       // 镜像上传
       sh "docker push ${harbor_url}/${harbor_project}/${imageName}"

       sh "echo 镜像上传成功"
     }

     // 部署应用
     //sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project $project_name $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
     }
   }
}

Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
此时可以发现两个服务都可以进行代码扫描以及进行构建打包和上传至镜像仓库!
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生

把Eureka注册中心集群部署到多台服务器

配置第二台生产服务器 192.168.100.253

# 卸载旧版本
sudo yum remove docker \
                   docker-client \
                   docker-client-latest \
                   docker-common \
                   docker-latest \
                   docker-latest-logrotate \
                   docker-logrotate \
                   docker-engine
# 删除docker的所有镜像和容器
rm -rf /var/lib/docker

# 安装基本的依赖包
sudo yum install yum-utils device-mapper-persistent-data lvm2 -y

# 设置镜像仓库 Docker yum源
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新yum软件包索引
sudo yum makecache fast

# 列出需要安装的版本列表
yum list docker-ce --showduplicates | sort -r

# 安装docker-ce-20.10
yum install docker-ce-20.10.* docker-ce-cli-20.10.* containerd -y

# 配置Docker镜像仓库加速以及配置Harbor镜像仓库信任
mkdir /etc/docker -p
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://k68iw3ol.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.100.251:85"]
}
EOF

# 开启内核转发,后续报错排查后回来整理的笔记,重要!!!
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

# 重装使配置生效
sysctl -p /etc/sysctl.conf

systemctl daemon-reload && systemctl enable --now docker

配置远程部署服务器

Jenkins服务器拷贝公钥到远程生产服务器02

ssh-copy-id 192.168.100.253

系统配置->添加远程服务器
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Publish over SSH–> 新增一台机器
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
项目配置添加参数

配置能够选择多个服务器
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
返回项目构建查看效果
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
更改Jenkinsfile

添加遍历服务器启动容器配置

// git凭证ID
def git_auth = "a4d0066f-6c58-4ab0-b714-6a24b3f5bc90"
// git的URL地址
def git_url = "git@192.168.100.240:tensquare_group/tensquare_back.git"
// 镜像的版本号
def tag = "latest"
// Harbor的url地址
def harbor_url = "192.168.100.251:85"
// 镜像库项目名称
def harbor_project = "tensquare"
// Harbor的登录凭证ID
def harbor_auth = "5785fbf3-a0f0-4234-8961-c866ca1e7046"

node {
    // 获取当前选择的项目名称,调用split方法切割逗号,意为切开项目名称
    def selectedProjectNames = "${project_name}".split(",")
    // 获取当前选择的服务器名称
    def selectedServers = "${publish_server}".split(",")

    stage('拉取代码') {
      checkout scmGit(branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
    }
    stage('代码审查') {
      // 对项目遍历进行代码审查,定义变量i=0 遍历数组selectedProjectNames 数组长度为length
      for(int i=0;i<selectedProjectNames.length;i++){
        // 取出每个元素里的内容 定义变量为projectInfo 就是项目信息,即包含项目名字也包含项目端口
        def projectInfo = selectedProjectNames[i];
        // 对 projectInfo 进行切割 引用projectInfo 变量,使用@符号切,当前遍历的项目名字 [0] 为获取的第一个元素 就是项目名字
        def currentProjectName = "${projectInfo}".split("@")[0]
        // 当前遍历的项目端口         [1] 就是获取的第二个元素
        def currentProjectPort = "${projectInfo}".split("@")[1]

        // 定义当前Jenkins的SonarQubeScanner工具的环境,位于全局工具配置的SonarQube Scanner 的name定义为'sonar-scanner'
        def scannerHome = tool 'sonar-scanner'
        // 引用当前JenkinsSonarQube的环境,系统配置的SonarQube servers定义的name以及代码审查服务器位置
        withSonarQubeEnv('sonarqube') {
          sh """
            cd ${currentProjectName}
            ${scannerHome}/bin/sonar-scanner
             """
        }
      }
    }
   stage('编译安装公共子工程') {
     sh "mvn -f tensquare_common clean install"
   }
   stage('编译打包微服务工程,上传镜像') {
     for(int i=0;i<selectedProjectNames.length;i++){
       // 取出每个元素里的内容 定义变量为projectInfo 就是项目信息,即包含项目名字也包含项目端口
       def projectInfo = selectedProjectNames[i];
       // 对 projectInfo 进行切割 引用projectInfo 变量,使用@符号切,当前遍历的项目名字 [0] 为获取的第一个元素 就是项目名字
       def currentProjectName = "${projectInfo}".split("@")[0]
       // 当前遍历的项目端口         [1] 就是获取的第二个元素
       def currentProjectPort = "${projectInfo}".split("@")[1]

       // 项目参数传入的project_name 修改为变量
       sh "mvn -f ${currentProjectName} clean package dockerfile:build"

       // 定义镜像名称
       def imageName = "${currentProjectName}:${tag}"

       // 对镜像打标签
       sh "docker tag ${imageName} ${harbor_url}/${harbor_project}/${imageName}"

       // 把镜像推送到Harbor,项目为私有级别,登录时涉及一个问题,登录harbor需要输入账号和密码,Jenkinsfile需要配置项目目录下,会暴露给所有开发人员,为了安全使用凭证方式
       withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {

         // 登录到Harbor,引用如上定义的username和password,就是用户haibo的信息
         sh "docker login -u ${username} -p ${password} ${harbor_url}"

         // 镜像上传
         sh "docker push ${harbor_url}/${harbor_project}/${imageName}"

         sh "echo 镜像上传成功"
       }
     // 遍历所有的服务器,分别部署
       for(int j=0;j<selectedServers.length;j++){
         // 获取当前遍历的服务器名称
         def currentServerName = selectedServers[j]

         // 加上的参数格式:--spring.profiles.active=eureka-server1/eureka-server2
         def activeProfile = "--spring.profiles.active="

         // 根据不同的服务器名字来读取不同的eureka配置信息
         if(currentServerName=="master_server"){
            activeProfile = activeProfile+"eureka-server1"
         }else if (currentServerName=="slave_server"){
            activeProfile = activeProfile+"eureka-server2"
         }
         // 部署应用
         sshPublisher(publishers: [sshPublisherDesc(configName: "${currentServerName}", transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deployCluster.sh $harbor_url $harbor_project $currentProjectName $tag $currentProjectPort $activeProfile", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
       }
       echo "${currentProjectName}完成编译,构建镜像"
     }
   }
}

更改服务器端部署脚本

deploy.sh的基础上再编写一个deployCluster.sh脚本

增加一个变量profile,用来存储新增的位置变量activeProfile,也是传参的$6

vim /opt/jenkins_shell/deployCluster.sh

#!/bin/sh
# 接收外部参数
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
Profile=$6

imageName=$harbor_url/$harbor_project_name/$project_name:$tag

echo "$imageName"

# 查询容器是否存在,存在则删除
containerId=`docker ps -a | grep -w ${project_name}:${tag}  | awk '{print $1}'`

if [ "$containerId" !=  "" ] ; then
    # 停掉容器
    docker stop $containerId

    # 删除容器
    docker rm $containerId
	
	echo "成功删除容器"
fi

# 查询镜像是否存在,存在则删除
imageId=`docker images | grep -w $project_name  | awk '{print $3}'`

if [ "$imageId" !=  "" ] ; then
      
    # 删除镜像
    docker rmi -f $imageId
	
	echo "成功删除镜像"
fi


# 登录Harbor
docker login -u haibo -p LIUhaibo123 $harbor_url

# 下载镜像
docker pull $imageName

# 启动容器
docker run -di -p $port:$port $imageName $profile

echo "容器启动成功"

# 添加执行权限
chmod +x /opt/jenkins_shell/deployCluster.sh

尝试构建项目,部署eureka服务器至两台服务器上
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
eureka集群启动并且使用10086端口
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
部署剩下的微服务集群
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
四个微服务都部署完成后通过浏览器查看,并且所有微服务都已经成功注册到eureka服务器也已经形成集群形式
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生

报错问题排查

第一个报错:eureka服务器容器启动后端口为8080
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
容器启动后查看容器日志,发现eureka服务器监听端口为8080,心想我的配置文件设置为10086端口为什么启动后是监听8080端口?
重构Jenkinsfile文件的docker容器启动传参部分

        // 加上的参数格式:--spring.profiles.active=eureka-server1/eureka-server2
         def activeProfile = "--spring.profiles.active=" //添加等号 = 

         // 根据不同的服务器名字来读取不同的eureka配置信息
         if(currentServerName=="master_server"){
            activeProfile = activeProfile+"eureka-server1"
         }else if (currentServerName=="slave_server"){
            activeProfile = activeProfile+"eureka-server2"
         }

于是手动启动容器传参后报错

docker run -di -p 10086:10086 2c37266049d5  --spring.profiles.activeeureka-server2
WARNING: IPv4 forwarding is disabled. Networking will not work.
# 警告:IPv4转发已禁用。网络将不起作用。

添加docker ipv4转发

vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

# 重装使配置生效
sysctl -p /etc/sysctl.conf

# 重启docker
systemctl restart docker

启动后还是监听8080端口,尝试使用--spring.profiles.active=eureka-server2进行传参后启动成功

docker run -di -p 10086:10086 2c37266049d5  --spring.profiles.active=eureka-server2

Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生

第二个报错:【已解决】com.mysql.jdbc.exceptions.jdbc4.CommunicationsExcepti:Communications link failure ----mysql连接报错

Nginx+Zuul集群实现高可用网关

Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
配置nginx

配置负载均衡池,里面地址就是zuul网关地址
proxy_pass 选择不同的zuulServer

# 位于pro02生产服务器进行配置
# 安装Nginx

# 修改Nginx配置
vim /etc/nginx/nginx.conf
# http模块添加
    upstream zuulServer {
      server 192.168.100.252:10020 weight=1;
      server 192.168.100.253:10020 weight=1;
    }

vim /etc/nginx/conf.d/default.conf
server {
    listen       85;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;
    root /usr/share/nginx/html;

    location / {
    #    root   /usr/share/nginx/html;
    #    index  index.html index.htm;
    # 指定服务器负载均衡服务器
        proxy_pass http://zuulServer/;
    }

# 重启Nginx
systemctl restart nginx

修改前端代码对于Nginx的访问地址
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
更改完成后代码上传至Gitlab代码仓库
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
构建前端web项目流水线并访问

Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
浏览器访问
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生
同时也可以新增数据,前后端能互相调用组件工作,实验完成!
Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群,# Jenkins,jenkins,docker,spring cloud,微服务,运维开发,云原生文章来源地址https://www.toymoban.com/news/detail-639347.html

到了这里,关于Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署

    努力了这么久,但凡有点儿天赋,也该有些成功的迹象了。 本篇文章引导你使用 Jenkins 部署 SpringBoot 项目,同时使用 Docker 和 Git 实现简单的持续集成和持续部署。(项目地址:sso-merryyou) 流程图如下: push 代码到 Github 触发 WebHook 。(因网络原因,本篇使用gitee) Jenkins 从仓库拉去

    2024年02月21日
    浏览(42)
  • 【黑马头条之项目部署_持续集成Jenkins】

    本笔记内容为黑马头条项目的项目部署_持续集成部分 目录 一、内容介绍 1、什么是持续集成 2、持续集成的好处 3、今日内容 二、软件开发模式 1、软件开发生命周期 2、软件开发瀑布模型 3、软件的敏捷开发 三、Jenkins安装配置 1、Jenkins介绍 2、Jenkins环境搭建 1.Jenkins安装配置

    2024年02月10日
    浏览(44)
  • 一个springboot项目的jenkins持续集成配置

    目录 1.项目基本情况 2.jenkins的下载 1)  安装jdk 2)下载、启动和配置jenkins 3. 启动Jenkins 4. 安装Jenkins插件 5. 重启jenkins 6.jenkins工具的配置 1) jdk的路径配置 7.创建springboot项目的持续集成任务 1)  新建项目 2)代码拉取 3)  打包项目 4)启动jar程序 5)解决jenkins构建结束后终止所

    2024年02月10日
    浏览(41)
  • 基于Jenkins实现Docker应用的持续集成与部署

    1. 服务器部署安装有docker 在docker应用开发中最常见的就是开发Dockerfile文件,可以使用代码仓库来管理它。 而在企业私有开发环境中是无法访问公有代码仓库(如Github)的。这时可以搭建私有代码仓库。 安装软件 sudo yum install -y subversion mod_dav_svn 创建svn仓库 sudo mkdir -p /srv/s

    2023年04月20日
    浏览(46)
  • 基于Docker+Jenkins+Gitl搭建持续集成环境(部分关键笔记)

    Jenkins 访问地址: ip地址:10000 查看密码 问题 jenkins升级问题 jenkins时区设置问题 配置插件更新代理 安装WebHooks并启用 配置Jenkins参数 解决jenkins安装插件报错: An error occurred during installation: No such plugin: cloudbees-folder Index of /jenkins/plugins/skip-certificate-check/latest/ | 清华大学开源软件

    2024年02月10日
    浏览(44)
  • 【Jenkins】持续集成与交付 (六):Gitlab代码托管服务安装

    💖The Begin💖点点关注,收藏不迷路💖

    2024年04月28日
    浏览(41)
  • 详细步骤记录:持续集成Jenkins自动化部署一个Maven项目

    提示:本教程基于CentOS Linux 7系统下进行 1. 下载安装jdk11 官网下载地址:https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.html 本文档教程选择的是jdk-11.0.20_linux-x64_bin.tar.gz 解压jdk-11.0.20_linux-x64_bin.tar.gz命令为: 2. 下载Jenkins的war包 官网下载地址:https://mirrors.tuna.tsing

    2024年02月04日
    浏览(58)
  • docker+k8s+jenkins+harbor持续集成自动化部署

    另外一篇文章有讲docker的安装与相关配置,暂时就不讲了 1、关闭防火墙并修改主机名 2、永久禁用swap 用#注释掉swap一行(新版centos已经默认禁用) 3、配置镜像加速 到阿里云获取自己镜像加速地址 4、安装 docker-compose 官网找到下载地址 https://github.com/docker/compose/releases 版本地址

    2024年02月08日
    浏览(63)
  • Jenkins持续集成、持续部署(CICD)-尚硅谷(含自己整理的前端、后端项目部署详细步骤)

    在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试;或者前后端分离后,经常会修改接口,然后重新部署;这些情况都会涉及到频繁的打包部署; 手动打包常规步骤: 1.提交

    2024年02月03日
    浏览(59)
  • 一文完成Jenkins+Docker+Git(多分支构建)打包、部署,实现可持续化集成

    官网:Jenkins官网 参考:Jenkins简介 Jenkins是一个开源软件项目,起源于Hudson(Hudson是商用的),是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成 可在Tomcat等流行的servlet容器中运行,也可独立运

    2024年01月18日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包