Devops 开发运维高级篇之Jenkins+Docker+SpringCloud微服务持续集成

文章目录


一、持续集成流程说明

1. 大致流程解析

在这里插入图片描述

① 开发人员每天把代码提交到 Gitlab 代码仓库
② Jenkins从 Gitlab中拉取项目源码,编译并打成jar包,然后构建成Docker镜像,将镜像上传到Harbor私有仓库。
③ Jenkins发送SSH远程命令,让生产部署服务器到Harbor私有仓库拉取镜像到本地,然后创建容器。
④ 最后,用户可以访问到容器

2. 服务器列表

服务器名称IP地址安装的软件
代码托管服务器192.168.8.18Gitlab
持续集成服务器192.168.8.19Jenkins,Maven,Docker18.06.1-ce
Docker仓库服务器192.168.8.20Docker18.06.1-ce,Harbor1.9.2
生产部署服务器192.168.8.17Docker18.06.1-ce

3. SpringCloud微服务项目架构解析

  • 项目架构: 前后端分离

  • 后端技术栈: SpringBoot+SpringCloud+SpringDataJpa(Spring全家桶)

  • 微服务项目结构:
    在这里插入图片描述
    tensquare_parent: 父工程 , 存放基础配置
    tensquare_common: 通用工程,存放工具类
    tensquare_eureka_server: SpringCloud的Eureka注册中心
    tensquare_zuul: SpringCloud 的网关服务
    tensquare_admin_service: 基础权限认证中心,负责用户认证(使用JWT认证)
    tensquare_gathering: 一个简单的业务模块,活动微服务相关逻辑

  • 数据库结构
    在这里插入图片描述
    tensquare_user: 用户认证数据库,存放用户账户数据。对应tensquare_admin_service微服务tensquare_gathering: 活动微服务数据库。对应tensquare_gathering微服务

  • 微服务配置分析:
    tensquare_eureka ——》注册中心,优先开启
    tensquare_zuul ——》网关
    tensquare_admin_service ——》权限管理
    tensquare_gathering——》业务活动

二、微服务部署

1. 导入微服务项目包

微服务项目包解压,目录在idea中打开,idea会自动下载相关组件插件(等待时间较长)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
等待下载完成

在这里插入图片描述
在这里插入图片描述


报错解决:
SpringBoot启动类报错can not resolve method 'run(java.lang.class,String [])'问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. Windows本地配置maven环境

添加两个变量
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

修改配置文件组建下载地址设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

    <mirror>
      <id>aliyunmaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/repository/public</url>
    </mirror>

修改idea指向maven

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

自动更新

在这里插入图片描述

添加构建条件
在这里插入图片描述

    <build>
        <plugins>
            <plugin>
                <!--提供打包(将应用打包成可执行的jar包)-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <!-- 指定maven编译的jdk版本 -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <verbose>true</verbose>
                    <fork>true</fork>
                    <!--jdk地址-->
                    <executable>C:/Program Files/Java/jdk1.8.0_152/bin/javac</executable>
                </configuration>
            </plugin>
        </plugins>
    </build>

3. 安装MySQL数据库

  • 本地数据库导入(windows本地安装mysql5.7)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

安装完成以后需要配置环境变量

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

导入软件脚本到MySQL数据库中

在这里插入图片描述

#创建二个库
create database tensquare_gathering;
create database tensquare_user;

在这里插入图片描述

#导入脚本文件
use tensquare_gathering;
source D:/tensquare_gathering.sql;

use tensquare_user;
source D:/tensquare_user.sql;

在这里插入图片描述

4. 安装 Visual Studio Code

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

5. 安装 node.js

在这里插入图片描述

在这里插入图片描述
添加系统环境变量,需要识别npm命令
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Vscode终端中运行:npm run dev,会发现报错

在这里插入图片描述

解决方法:

  • 安装Python2

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

npm install -g cnpm --registry=https://registry.npm.taobao.org

在这里插入图片描述

使用cmd切换到tensquareAdmin目录下执行 cnpm uninstall node-sass

在这里插入图片描述

再执行安装命令 cnpm install node-sass

在这里插入图片描述

启动前端项目 ——》cnpm run dev

在这里插入图片描述
在这里插入图片描述

到此位置,前端部分已经安装部署完成


6. 配置启动Eureka注册中心

修改配置文件application.yml

在这里插入图片描述

# 单机版
server:
  port: 10086

#基本服务器信息
spring:
  application:
     name: eureka-server  #服务ID

#enreka服务器配置
eureka:
  client:
    fetch-registry: false    #单机版关闭enreka相互注册
    register-with-eureka: false
    service-url:
      defaultZone:  http://localhost:${server.port}/eureka #暴露eureka服务访问地址
  server:
    enable-self-preservation: false #关闭自我保护

运行注册中心
在这里插入图片描述

在这里插入图片描述
浏览器访问 http://localhost:10086
在这里插入图片描述

7. 配置启动网关zuul

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8. 配置启动权限管理admin_service

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

9. 配置启动业务模块

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

到此,微服务的所有服务都已开启成功


三、微服务测试

1. 测试后端服务

安装postmam
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

获取token令牌

在这里插入图片描述

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMTk0MjgxNTMzMjMwNDE5OTY4Iiwic3ViIjoiYWRtaW4iLCJpYXQiOjE2NDUzNzM3OTMsInJvbGVzIjoiYWRtaW4iLCJleHAiOjE2NDUzNzU1OTN9.XyodVOf3_2ioYOO9F6EexxUA9Kruridt3AN0cmD3NE8

获取数据库信息成功
在这里插入图片描述

2. 测试前端服务

cnpm run dev

在这里插入图片描述

登录平台
http://localhost:9528

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这里可以看到数据库中存储的信息,表明前端和数据库对接成功

四、对微服务中的服务进行打包

1. IDEA中进行jar包构建

在这里插入图片描述

这里如果提示mvn无法识别则需要重启IDEA再进行打包

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. 对jar包进行单独运行

在这里插入图片描述

java -jar tensquare_eureka_server-1.0-SNAPSHOT.jar

在这里插入图片描述

3. 浏览器访问

使用浏览器访问
http://localhost:10086/

在这里插入图片描述

由此可以看出,对于打的jar包是可以单独在本地进行运行的

五、部署docker及harbor仓库

docker的部署及基础操作可参考前文

1. 部署docker

以下服务器上均需部署docker

Jenkins 服务器 192.168.8.19
Harbor镜像仓库服务器 192.168.8.20
生产部署服务器 192.168.8.17

#环境配置
systemctl stop firewalld
systemctl disable firewalld

vim /etc/selinux/config
SELINUX=disabled

vim /etc/resolv.conf
nameserver 114.114.114.114

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

#设置阿里云镜像源
cd /etc/yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#安装 docker-ce 社区版
yum install -y docker-ce
systemctl start docker
systemctl enable docker

#配置镜像加速,官方网址可参考:https://help.aliyun.com/document_detail/60750.html
mkdir -p /etc/docker
#直接命令行输入以下内容:

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://t466r8qg.mirror.aliyuncs.com"]
}
EOF

#把Harbor地址加入到Docker信任列表(harbor仓库的docker中不需要配)
vim /etc/docker/daemon.json 

{
  "registry-mirrors": ["https://t466r8qg.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.8.20:85"]
}

systemctl daemon-reload							
systemctl restart docker						

#网络优化
vim /etc/sysctl.conf
net.ipv4.ip_forward=1

sysctl -p
systemctl restart network
systemctl restart docker
docker version	 						

2. harbor仓库部署

注意:需要先部署docker,并且启动docker

  • 先安装 docker-compose
cd /usr/local/bin/
#docker-compose下载好拖进该目录中
chmod +x /usr/local/bin/docker-compose
  • 查看docker-compose是否安装成功
docker-compose -version
  • 上传压缩包到 linux,并解压
tar zxvf harbor-offline-installer-v1.9.2.tgz -C /opt/
  • 修改配置文件
cd /opt/harbor
vim harbor.yml
#修改 hostname 和 port hostname: 192.168.8.20
port: 85
  • 安装Harbor(docker处于启动状态)
./prepare
./install.sh 
  • Harbor的命令如下
docker-compose up -d 启动
docker-compose stop 停止
docker-compose restart 重新启动
  • 访问 Harbor
    http://192.168.8.20:85
    默认账户密码:admin/Harbor12345

创建项目

  • Harbor的项目分为公开和私有的:
    公开项目:所有用户都可以访问,通常存放公共的镜像,默认有一个library公开项目。
    私有项目:只有授权用户才可以访问,通常存放项目本身的镜像。

在这里插入图片描述
在这里插入图片描述

创建用户,分配权限

在这里插入图片描述在这里插入图片描述

给私有项目分配用户
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

角色权限说明
访客对于指定项目拥有只读权限
开发人员对于指定项目拥有读写权限
维护人员对于指定项目拥有读写权限,创建 Webhooks
项目管理员除了读写权限,同时拥有用户管理/镜像扫描等管理权限

3. 使用Dockerfile制作微服务镜像

利用Dockerfile制作一个Eureka注册中心的镜像

  • 上传 Eureka 的微服务 jar 包到 linux 中,并编写Dockerfile
FROM openjdk:8-jdk-alpine 
ARG JAR_FILE
COPY ${JAR_FILE} app.jar 
EXPOSE 10086
ENTRYPOINT ["java","-jar","/app.jar"]
  • 构建镜像
docker build --build-arg JAR_FILE=tensquare_eureka_server-1.0-SNAPSHOT.jar -t eureka:v1 .
  • 创建容器
docker run -i --name=eureka -p 10086:10086 eureka:v1
  • 访问容器

http://192.168.8.19:10086/

4. Jenkins服务器上传镜像至Harbor仓库

  • 给镜像打上标签
docker tag eureka:v1 192.168.8.20:85/tensquare/eureka:v1
  • 登录harbor仓库,获取权限
docker login -u tom -p Abcd1234 192.168.8.20:85
  • 推送镜像
docker push 192.168.8.20:85/tensquare/eureka:v1 

在这里插入图片描述
在这里插入图片描述

5. 生产服务器上拉取镜像

  • 登录harbor仓库,获取权限
docker login -u tom -p Abcd1234 192.168.8.20:85
  • 拉取镜像
docker pull 192.168.8.20:85/tensquare/eureka:v1 

在这里插入图片描述

六、项目代码上传到Gitlab仓库

1. Gitlab仓库建立二个项目(前端与后端)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. 提交后端项目

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

重新定义远程仓库地址

在这里插入图片描述
在这里插入图片描述

这里需要复制gitlab仓库中 tensquare_back 项目中 HTTP 的URL
在这里插入图片描述

在这里插入图片描述
提交完成后,在Gitlab仓库中查看项目的变化

在这里插入图片描述

3. 提交前端项目

Windows本地安装TortoiseGit(小乌龟)用来提交前端项目代码

在这里插入图片描述

安装汉化包
在这里插入图片描述
在这里插入图片描述

右键桌面,点击设置进行汉化选择

在这里插入图片描述
在这里插入图片描述

到前端项目的路径下,右击鼠标选中Git同步

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在Gitlab仓库上查看是否提交成功
在这里插入图片描述

七、从Gitlab上拉取项目源码

1. 创建pipeline项目

在这里插入图片描述

使用项目中Jenkinsfile方式去拉取代码

在这里插入图片描述

使用流水线语法中的片段生成器来进行生成拉取代码

在这里插入图片描述

2. 设置参数化构建

在这里插入图片描述

3. 创建Jenkinsfile文件

在这里插入图片描述

//定义gitlab的凭证
def git_auth="03757112-b3bd-4955-93ef-ad84869f39a9"
//定义gitlab的URL路径
def git_url="git@192.168.8.18:gl/tensquare_back.git"

node {
    stage('pull code') {
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
}

在这里插入图片描述

提交到Gitlab仓库
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4. 查看构建项目的结果

在这里插入图片描述

八、SonarQube代码审查

1. 创建项目,设置参数

使用上面的tensquare_back项目,并进行参数配置

在这里插入图片描述

在这里插入图片描述

tensquare_eureka_server
tensquare_zuul
tensquare_admin_service
tensquare_gathering
注册中心
服务网关
认证中心
活动微服务

在这里插入图片描述

在这里插入图片描述

2. 每个项目的根目录下添加sonar-project.properties

在这里插入图片描述

# must be unique in a given SonarQube instance
sonar.projectKey=tensquare_admin_service
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=tensquare_admin_service
sonar.projectVersion=1.0

# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
# This property is optional if sonar.modules is set.
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.binaries=.

sonar.java.source=1.8
sonar.java.target=1.8
#sonar.java.libraries=**/target/classes/**

# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8

3. 修改Jenkinsfile构建脚本

在这里插入图片描述

//定义gitlab的凭证
def git_auth="03757112-b3bd-4955-93ef-ad84869f39a9"
//定义gitlab的URL路径
def git_url="git@192.168.8.18:gl/tensquare_back.git"

node {
    stage('pull code') {
        //切换成变量,字符串符号使用双引号
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
    stage('check code') {
            //定义SonarQubeScanner工具
            def scannerHome = tool 'sonar-scanner'
            //引用SonarQube系统环境
            withSonarQubeEnv('sonarqube') {
            sh """
                cd ${project_name}
                ${scannerHome}/bin/sonar-scanner
               """
               }
    }
}

提交Jenkinsfile文件到Gitlab仓库
在这里插入图片描述

再次构建进行代码检查

在这里插入图片描述

登录sonarqube,检查结果
在这里插入图片描述

九、Dockerfile编译、生成镜像

1. 安装通用工程common

在idea中对Jenkinsfile进行更改,增加安装common工具的命令

//定义gitlab的凭证
 def git_auth="03757112-b3bd-4955-93ef-ad84869f39a9"
 //定义gitlab的URL路径
 def git_url="git@192.168.8.18:gl/tensquare_back.git"

 node {
     stage('pull code') {
         checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
     stage('check code') {
                    //定义SonarQubeScanner工具
                     def scannerHome = tool 'sonar-scanner'
                     //引用SonarQube系统环境
                     withSonarQubeEnv('sonarqube') {
                     sh """
                         cd ${project_name}
                         ${scannerHome}/bin/sonar-scanner
                        """
                     }
     }
     //编译,打包,镜像制作
     stage('make package images') {
        sh "mvn -f tensquare_common clean install"
     }
 }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 构建tensquare_back项目进行测试

在这里插入图片描述
问题分析:
在每一个微服务中都有一个pom.xml文件,里面有指向父进程 pom.xml的选项(如下图),common工具在进行加载的时候会先对其中的 pom.xml 文件进行加载,挨个加载其中的插件,因为 common 本身是一个工具而不是服务,工具在进行打包编译的时候并不需要指定方式。

在这里插入图片描述

解决方案:

把父工程 pom.xml 中的 maven 插件代码移至除了 tensquare_common 以外每个子工程 pom.xml中

在这里插入图片描述在这里插入图片描述

剪切的代码粘贴到每个微服务的pom.xml文件中,除了common不用放,其他四个微服务都需要操作

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 重新构建项目

在这里插入图片描述

构建成功,公共子工程被安装到的路径:
/root/repo/com/tensquare/tensquare_common/1.0-SNAPSHOT/tensquare_common-1.0-SNAPSHOT.jar

在这里插入图片描述

在这里插入图片描述

4. 编译打包所有微服务项目

在 Jenkinsfile 中写入微服务打包代码

在这里插入图片描述

//定义gitlab的凭证
 def git_auth="03757112-b3bd-4955-93ef-ad84869f39a9"
 //定义gitlab的URL路径
 def git_url="git@192.168.8.18:gl/tensquare_back.git"

 node {
     stage('pull code') {
         checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
     stage('check code') {
                    //定义SonarQubeScanner工具
                     def scannerHome = tool 'sonar-scanner'
                     //引用SonarQube系统环境
                     withSonarQubeEnv('sonarqube') {
                     sh """
                         cd ${project_name}
                         ${scannerHome}/bin/sonar-scanner
                        """
                     }
     }
     //添加公共子工程
     stage('make install public sub project') {
            sh "mvn -f tensquare_common clean install"
     }
     //编译打包微服务
     stage('make package') {
            sh "mvn -f ${project_name} clean package"
     }
 }

进行代码提交

在这里插入图片描述
在这里插入图片描述

构建eureka服务

在这里插入图片描述

在这里插入图片描述

构建tensquare_zuul服务网关

在这里插入图片描述
失败原因:
因为Jenkins服务器中并没有tensquare_paren工程,而zuul需要依赖这个工程

解决方法:
传递父工程进Jenkins仓库
在这里插入图片描述在这里插入图片描述
继续打包zuul服务网关

在这里插入图片描述

在这里插入图片描述
打包权限中心服务

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

打包活动微服务

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

到此所有的微服务项目就已经全部打包成功了

5. 构建Docker镜像

利用 dockerfile-maven-plugin 插件构建 Docker 镜像

在每个微服务项目的 pom.xml 加入 dockerfile-maven-plugin 插件

在这里插入图片描述

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <repository>${project.artifactId}</repository>
                    <buildArgs>
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>

在每个微服务项目根目录下建立Dockerfile文件,需要注意的是每个项目公开的端口是不一样的

tensquare_admin_service:
在这里插入图片描述

#FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 9001
ENTRYPOINT ["java","-jar","/app.jar"]

tensquare_eureka_server:

#FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 10086
ENTRYPOINT ["java","-jar","/app.jar"]

tensquare_gathering:

#FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 9002
ENTRYPOINT ["java","-jar","/app.jar"]

tensquare_zuul:

#FROM java:8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 10020
ENTRYPOINT ["java","-jar","/app.jar"]

修改 Jenkinsfile ,在其中写入构建脚本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

构建eureka服务

在这里插入图片描述

Jenkins服务器中查看镜像

在这里插入图片描述

制作其他微服务的镜像

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

到此为此,所有微服务镜像制作完成!!

十、镜像上传 Harbor 仓库

1. 对镜像打标签

修改Jenkinsfile脚本

//定义gitlab的凭证
 def git_auth="03757112-b3bd-4955-93ef-ad84869f39a9"
 //定义gitlab的URL路径
 def git_url="git@192.168.8.18:gl/tensquare_back.git"

//镜像标签
def tag="latest"
//harbor的url地址
def harbor_url="192.168.8.20:85"
//镜像仓库名
def harbor_name="tensquare"

 node {
     stage('pull code') {
         checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
     stage('check code') {
                    //定义SonarQubeScanner工具
                     def scannerHome = tool 'sonar-scanner'
                     //引用SonarQube系统环境
                     withSonarQubeEnv('sonarqube') {
                     sh """
                         cd ${project_name}
                         ${scannerHome}/bin/sonar-scanner
                        """
                     }
     }
     //添加公共子工程
     stage('make install public sub project') {
            sh "mvn -f tensquare_common clean install"
     }
     //编译打包微服务,制作镜像
     stage('make package') {
            sh "mvn -f ${project_name} clean package dockerfile:build"
            //定义镜像名称
                       def imageName="${project_name}:${tag}"
            //对镜像打标签
            sh "docker tag ${imageName} ${harbor_url}/${harbor_name}/${imageName}"
     }
 }

在这里插入图片描述
在这里插入图片描述

代码提交后,构建eureka测试打标签结果

在这里插入图片描述
在这里插入图片描述

对所有的微服务进行打标签

在这里插入图片描述

2. Jenkins中添加 harbor 的凭证

镜像上传 harbor 仓库需要先进行登录,但是如果把账号密码卸载脚本中并不是很安全也不切合实际,所以需要使用变量的方式来进行调用。

输入harbor用户的账号和密码并添加凭证
在这里插入图片描述

变量中会用到这个凭证的ID在这里插入图片描述

778a9460-c68d-4ab6-ab7f-f5113ec3a900

在这里插入图片描述

使用流水线语法中的片段生成器来生成代码,并把复制到Jenkinsfile脚本中

在这里插入图片描述
在这里插入图片描述

//定义gitlab的凭证
 def git_auth="03757112-b3bd-4955-93ef-ad84869f39a9"
 //定义gitlab的URL路径
 def git_url="git@192.168.8.18:gl/tensquare_back.git"

//镜像标签
def tag="latest"
//harbor的url地址
def harbor_url="192.168.8.20:85"
//镜像仓库名
def harbor_name="tensquare"
//harbor凭证
def harbor_auth="778a9460-c68d-4ab6-ab7f-f5113ec3a900"

 node {
     stage('pull code') {
         checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
     stage('check code') {
                    //定义SonarQubeScanner工具
                     def scannerHome = tool 'sonar-scanner'
                     //引用SonarQube系统环境
                     withSonarQubeEnv('sonarqube') {
                     sh """
                         cd ${project_name}
                         ${scannerHome}/bin/sonar-scanner
                        """
                     }
     }
     //添加公共子工程
     stage('make install public sub project') {
            sh "mvn -f tensquare_common clean install"
     }
     //编译打包微服务,制作镜像
     stage('make package') {
            sh "mvn -f ${project_name} clean package dockerfile:build"
            //定义镜像名称
            def imageName="${project_name}:${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 镜像上传成功"
            }
     }
 } 

更改提交代码后,测试镜像上传

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. 登录harbor仓库查看结果

登录harbor仓库查看项目中的镜像是否已经上传成功

在这里插入图片描述

到此,所有微服务的镜像成功上传到harbor仓库中

十一、拉取镜像和发布应用

1. 安装 Publish Over SSH 插件

Publish Over SSH 插件可以实现远程发送Shell命令,安装完需要重启 Jenkins

在这里插入图片描述

2. 配置远程部署服务器

拷贝公钥,从Jenkins服务器拷贝到生产服务器

ssh-copy-id 192.168.8.17

在这里插入图片描述
在这里插入图片描述

Jenkins 系统配置中添加远程服务器

在这里插入图片描述

3. 修改Jenkinsfile构建脚本生成远程调用模板代码

在这里插入图片描述

在这里插入图片描述

//定义gitlab的凭证
 def git_auth="03757112-b3bd-4955-93ef-ad84869f39a9"
 //定义gitlab的URL路径
 def git_url="git@192.168.8.18:gl/tensquare_back.git"

//镜像标签
def tag="latest"
//harbor的url地址
def harbor_url="192.168.8.20:85"
//镜像仓库名
def harbor_name="tensquare"
//harbor凭证
def harbor_auth="778a9460-c68d-4ab6-ab7f-f5113ec3a900"

 node {
     stage('pull code') {
         checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
     stage('check code') {
                    //定义SonarQubeScanner工具
                     def scannerHome = tool 'sonar-scanner'
                     //引用SonarQube系统环境
                     withSonarQubeEnv('sonarqube') {
                     sh """
                         cd ${project_name}
                         ${scannerHome}/bin/sonar-scanner
                        """
                     }
     }
     //添加公共子工程
     stage('make install public sub project') {
            sh "mvn -f tensquare_common clean install"
     }
     //编译打包微服务,制作镜像
     stage('make package') {
            sh "mvn -f ${project_name} clean package dockerfile:build"
            //定义镜像名称
            def imageName="${project_name}:${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)])
     }
 }

添加端口新参数

在这里插入图片描述

4. 部署脚本deploy.sh中的内容

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

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 tom -p Abcd1234 $harbor_url

# 下载镜像
docker pull $imageName

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

echo "容器启动成功"

在生产服务器上创建目录,并放入脚本

mkdir /opt/jenkins_shell
cd /opt/jenkins_shell/
vim deploy.sh
chmod +x deploy.sh 

在这里插入图片描述

Jenkinsfile更改提交进行构建测试

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5. 验证结果

在生产服务器上检查结果

在这里插入图片描述

在浏览器中查看服务

在这里插入图片描述

十二、通过微服务访问后端数据库

1. idea中修改微服务配置文件

tensquare_admin_service
在这里插入图片描述

tensquare_eureka_server

在这里插入图片描述

tensquare_gathering
在这里插入图片描述

tensquare_gathering

在这里插入图片描述

修改完以后进行提交代码仓库

在这里插入图片描述

在这里插入图片描述

进行构建
在这里插入图片描述
在这里插入图片描述

生产服务器上查看结果

在这里插入图片描述

登录注册中心查看是否注册成功

在这里插入图片描述

2. 数据库进行授权远程登录

把脚本文件放入/root/目录下
在这里插入图片描述

mysql -uroot -pabc123
grant all privileges on *.* to 'root'@'%' identified by 'abc123' with grant option;

create database tensquare_gathering;
create database tensquare_user;

#导入脚本文件
use tensquare_gathering;
source /root/tensquare_gathering.sql;

use tensquare_user;
source /root/tensquare_user.sql;

3. 使用postman连接数据库

在这里插入图片描述

在这里插入图片描述

十三、部署前端静态web网站

1. 安装nginx服务器

生产服务器上部署nginx服务器

yum install -y epel-release 
yum -y install nginx 
#修改nginx的端口,默认80,改为9090
vi /etc/nginx/nginx.conf

    server {
        listen       9090;
        listen       [::]:9090;
        server_name  _;
        root         /usr/share/nginx/html;
#关闭selinux,将SELINUX=disabled 
setenforce 0 						#先临时关闭
vi /etc/selinux/config 				#编辑文件,永久关闭 SELINUX=disabled
#启动Nginx
systemctl enable nginx 设置开机启动
systemctl start nginx 启动
systemctl stop nginx 停止
systemctl restart nginx 重启

访问:http://192.168.8.17:9090/

在这里插入图片描述

2. 安装NodeJS插件

在这里插入图片描述

3. 配置Nginx服务器

Manage Jenkins->Global Tool Configuration

在这里插入图片描述

创建前端流水线项目

在这里插入图片描述

添加参数化构建

在这里插入图片描述

添加声明式脚本代码

//harbor的凭证
def  git_auth="03757112-b3bd-4955-93ef-ad84869f39a9"

node {
    stage('pull code') {
        //切换成变量,字符串符号使用双引号
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: 'git@192.168.8.18:gl/tensquare_back.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)])
    }
}

在这里插入图片描述

在这里插入图片描述

前端项目中更改配置文件中的网关地址
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

点击提交以后,点击推送

在这里插入图片描述

在Gitlab上查看提交结果
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

构建完成以后重新登录

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发莫的了呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值