Jenkins+Docker+SpringCloud微服务持续集成(五):微服务前后端结合

链接:https://pan.baidu.com/s/1HR3Q-cojnCidRy1xrdlOxg
提取码:7m56
--来自百度网盘超级会员V3的分享

部署其他微服务
注册中心eureka服务配置指定生产服务器地址
image

服务网关配置指定生产服务器地址
image

认证中心配置,数据库使用Jenkins中的数据库
image

活动微服务配置
image

修改完成进行提交
image

数据库脚本导入Jenkins服务器中的MySQL

点击查看代码
mysql> create database tensquare_user;

mysql> use tensquare_user;

mysql> source /opt/tensquare_user.sql;

mysql> create database tensquare_gathering;

mysql> use tensquare_gathering;

mysql> source /opt/tensquare_gathering.sql;

------------------------授权远程登录-------------------------------------
grant all privileges on *.* to 'root'@'%' identified by 'abc123' with grant option;

mysql> flush privileges;

准备完毕,可以直接部署所有微服务
image
image

生产服务器中容器列表
image
image

使用postman测试后台数据连接
image
image

微服务持续集成(7)-部署前端静态web网站
image

安装Nginx服务器
yum install epel-release
yum -y install nginx

修改nginx的端口,默认80,改为9090:
vi /etc/nginx/nginx.conf

关闭selinux,SELINUX=disabled
setenforce 0 先临时关闭
vi /etc/selinux/config 编辑文件,永久关闭
SELINUX=disabled

启动Nginx
systemctl enable nginx 设置开机启动
systemctl start nginx 启动
systemctl stop nginx 停止
systemctl restart nginx 重启

安装NodeJS插件
image

Jenkins配置Nginx服务器
Manage Jenkins->Global Tool Configuration
image

创建前端流水线项目
image

点击查看代码
//harbor的凭证
def  git_auth="1be38991-873b-4a68-8eb6-312347fdc0a4"

node {
    stage('pull code') {
        //切换成变量,字符串符号使用双引号
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: 'git@192.168.195.180:kgc_group/tensquare_front.git']]])
    }

    stage('make package,deploy') {
            //使用nodejs的npm打包
            nodejs('nodejs12'){
                sh '''
                    npm install
                    npm run build
                '''
            }
            //远程部署
            sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/usr/share/nginx/html', remoteDirectorySDF: false, removePrefix: 'dist', sourceFiles: 'dist/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    }
}

image
image
image
image
image

开始构建

生产服务器验证查看/usr/share/nginx/html根目录
image

Jenkins+Docker+SpringCloud部署方案优化

上面部署方案存在的问题:
1)一次只能选择一个微服务部署
2)只有一台生产者部署服务器
3)每个微服务只有一个实例,容错率低

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

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

修改所有微服务配置
注册中心配置(*)

再去启动一台docker2服务器(安装部署docker环境)

点击查看代码
# 集群版
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.195.184
  client:
    service-url:
      # 将自己注册到eureka-server1、eureka-server2这个Eureka上面去
      defaultZone: http://192.168.195.184:10086/eureka/,http://192.168.195.182:10086/eureka/

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

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

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

点击查看代码
# Eureka配置
eureka:
  client: 
    service-url:
      defaultZone: http://192.168.195.182:10086/eureka,http://192.168.195.184:10086/eureka # Eureka 访问地址
  instance:
    prefer-ip-address: true

把代码提交到Gitlab中

设计Jenkins集群项目的构建参数
1)安装Extended Choice Parameter插件支持多选框
image

2)创建流水线项目
image
image

3)添加参数
字符串参数:分支名称
image

多选框:项目名称
image
image
image
image

最后效果(注意用英文逗号):
image

循环打包编译制作镜像

点击查看代码
//git的凭证
def git_auth="1be38991-873b-4a68-8eb6-312347fdc0a4"
//git的URL
def git_url="git@192.168.195.180:kgc_group/tensquare_back.git"
//镜像标签
def tag="latest"
//harbor的url地址
def harbor_url="192.168.195.183:85"
//镜像仓库名
def harbor_name="tensquare"
//harbor的凭证
def harbor_auth="e8b4bf42-2a87-4611-90f7-4b4a75479b5c"

node {
    //获取当前选择项目名称
    def selectedProjectNames="${project_name}".split(",")


    stage('pull code') {
        //切换成变量,字符串符号使用双引号
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }

    stage('check code') {
            for(int i=0;i<selectedProjectNames.length;i++){
                //项目信息  tensquare_eureka_server@10086
                def projectInfo=selectedProjectNames[i]

                //当前的项目名称
                def currentProjectName="${projectInfo}".split("@")[0]

                //当前的项目端口
                def currentProjectPort="${projectInfo}".split("@")[1]

                //定义SonarQubeScanner工具
                def scannerHome = tool 'sonar-scanner'
                            //引用SonarQube系统环境
                            withSonarQubeEnv('sonarqube') {
                            sh """
                                cd ${currentProjectName}
                                ${scannerHome}/bin/sonar-scanner
                               """
                            }
            }

    }
    //添加公共子工程
    stage('make install public sub project') {
            sh  "mvn -f tensquare_common clean install"
    }
    //打包微服务,制作镜像,上传镜像
    stage('make package images,push images') {
        for(int i=0;i<selectedProjectNames.length;i++){
            //项目信息  tensquare_eureka_server@10086
            def projectInfo=selectedProjectNames[i]

            //当前的项目名称
            def currentProjectName="${projectInfo}".split("@")[0]

            //当前的项目端口
            def currentProjectPort="${projectInfo}".split("@")[1]

            sh  "mvn -f ${currentProjectName} clean package dockerfile:build"
            //定义镜像名称
            def imageName="${currentProjectName}:${tag}"
            //对镜像打标签
            sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"
            //镜像推送到harbor
            withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
                //登录harbor
                sh "docker login -u ${username} -p ${password} ${harbor_url}"
                //镜像上传
                sh "docker push ${harbor_url}/${harbor_name}/${imageName}"
                sh "echo 镜像上传成功"
            }
        }
            //部署应用
            sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh ${harbor_url} ${harbor_name} ${project_name} ${tag} ${port}", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

    }

}
posted @ 2022-03-06 21:59  视觉装置在笑  阅读(192)  评论(0)    收藏  举报