Jenkins+Docker+SpringCloud微服务持续集成

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

Jenkins+Docker+SpringCloud持续集成流程说明

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

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

服务器列表

服务器名称 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

SpringCloud微服务源码概述

项目架构:前后端分离
后端技术栈:SpringBoot+SpringCloud+SpringDataJpa(Spring全家桶)
微服务项目结构:
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

  1. tensquare_parent:父工程,存放基础配置
  2. tensquare_common:通用工程,存放工具类
  3. tensquare_eureka_server:SpringCloud的Eureka注册中心
  4. tensquare_zuul:SpringCloud的网关服务
  5. tensquare_admin_service:基础权限认证中心,负责用户认证(使用JWT认证)
  6. tensquare_gathering:一个简单的业务模块,活动微服务相关逻辑

数据库结构:

  1. tensquare_user:用户认证数据库,存放用户账户数据。对应tensquare_admin_service微服务
  2. tensquare_gathering:活动微服务数据库。对应tensquare_gathering微服务

微服务配置分析:

  1. tensquare_eureka
  2. tensquare_zuul
  3. tensquare_admin_service
  4. tensquare_gathering

本地运行微服务

本地运行微服务,按顺序逐一启动

运行eureka服务器
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
通过浏览器进入localhost:10086
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
开启zuul网关
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
开启权限中心
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
开启微服务
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
刷新Eureka页面业务都成功部署
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

本地部署微服务

SpringBoot微服务项目打包,必须导入该插件
在pom.xml里添加
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

# 在Pom.xml添加
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
项目打包
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
打包后在target下产生jar包
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
本地运行微服务的jar包

java -jar xxx.jar

查看效果
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

Docker安装和Dockerfile制作微服务镜像

Docker安装

# 卸载旧版本
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

mkdir /etc/docker -p
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://k68iw3ol.mirror.aliyuncs.com"]
}
EOF

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

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

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

部分问题总结

安装docker后无法启动的问题排查
之前所有的安装设置daemon文件为daemon.json格式,但在今天设置后发生报错,并且为之后docker添加harbor地址信任后重启docker埋下伏笔,一直找不到原因,无数次修改json文件,问题的最终在于,参考文章:CentOS7 启动docker.service失败,但又无法连接harbor私有仓库。

cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
     "https://k68iw3ol.mirror.aliyuncs.com",
     "https://docker.mirrors.ustc.edu.cn",
     "http://hub-mirror.c.163.com"
   ],
   "exec-opts":["native.cgroupdriver=systemd"]
}
EOF

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Dockerfile制作微服务镜像

命令 作用
FROM image_name:tag
MAINTAINER user_name 声明镜像的作者
ENV key value 设置环境变量 (可以写多条)
RUN command 编译镜像时运行的脚本(可以写多条)
CMD 设置容器的启动命令
ENTRYPOINT 设置容器的入口程序
ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir 设置工作目录
ARG 设置编译镜像时加入的参数
VOLUMN 设置容器的挂载卷

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

# 将eureka的jar包上传至服务器
mkdir /root/eureka
mv tensquare_eureka_server-1.0-SNAPSHOT.jar /root/eureka/

cd /root/eureka/
vim 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 .

# 查看镜像是否创建成功
[root@jenkins eureka]# docker image ls
REPOSITORY   TAG            IMAGE ID       CREATED         SIZE
eureka       v1             0147238f31a1   5 seconds ago   150MB
openjdk      8-jdk-alpine   a3562aa0b991   4 years ago     105MB

# 创建容器验证镜像是否成功
docker run -id --name=eureka -p 10086:10086 eureka:v1

# 查看日志
docker logs -f 容器id

构建镜像
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
浏览器访问
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

Harbor镜像仓库安装及使用

Harbor简介

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Harbor(港口,港湾)是一个用于存储和分发Docker镜像的企业级Registry服务器。
除了Harbor这个私有镜像仓库之外,还有Docker官方提供的Registry。相对Registry,Harbor具有很多优势:

  1. 提供分层传输机制,优化网络传输 Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
  2. 提供WEB界面,优化用户体验 只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。
  3. 支持水平扩展集群 当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。
  4. 良好的安全机制,企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。

Harbor安装

Harbor需要安装在192.168.100.251
参考文章:Harbor prepare脚本分析

# 安装docker
# 参考之前的安装过程

# 安装docker-compose
sudo curl -L "https://kgithub.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose
docker-compose version

# 安装harbor
wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v1.9.2/harbor-offline-installer-v1.9.2.tgz

mkdir /opt/harbor
tar xf harbor-offline-installer-v1.9.2.tgz -C /opt

# 修改Harbor的配置
vim harbor.yml
 5 hostname: 192.168.100.251
10   port: 85
27 harbor_admin_password: Harbor12345  # 也可更改harbor默认密码

# 产生配置脚本
./prepare
# 安装Harbor
./install.sh

# 启动Harbor
docker-compose up -d    # 启动
docker-compose stop     # 停止
docker-compose restart  # 重新启动

# 完成安装后,通过192.168.100.251:85进行浏览器访问

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
配置Harbor开机随系统启动,服务器重启后默认Harbor无法正常启动,可以使用systemd管理Harbor启停
参考文章:harbor安装并配置https

# 先停止已经启动的harbor
docker-compose -f docker-compose.yml down

cat > /usr/lib/systemd/system/harbor.service << 'EOF'
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=https://github.com/goharbor/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
Environment=Harbor_Path=/opt/harbor
ExecStart=/usr/local/bin/docker-compose -f ${Harbor_Path}/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f ${Harbor_Path}/docker-compose.yml down

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload && systemctl enable harbor --now

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

在Harbor创建用户和项目

创建项目

Harbor的项目分为公开和私有的:

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

我们可以为微服务项目创建一个新的项目:
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
创建用户
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
给私有项目分配用户
进入tensquare项目->成员
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

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

上传镜像到Harbor

# 把Harbor地址加入到Docker信任列表
vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://k68iw3ol.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.100.251:85"]
}

systemctl daemon-reload && systemctl restart docker

# 登录Harbor
docker login -u haibo -p LIUhaibo123 192.168.100.251:85

# 给镜像打上标签
[root@jenkins eureka]# docker images
REPOSITORY   TAG            IMAGE ID       CREATED          SIZE
eureka       v1             0147238f31a1   36 minutes ago   150MB
openjdk      8-jdk-alpine   a3562aa0b991   4 years ago      105MB

docker tag eureka:v1 192.168.100.251:85/tensquare/eureka:v1

[root@jenkins eureka]# docker images
REPOSITORY                            TAG            IMAGE ID       CREATED          SIZE
192.168.100.251:85/tensquare/eureka   v1             0147238f31a1   37 minutes ago   150MB
eureka                                v1             0147238f31a1   37 minutes ago   150MB
openjdk                               8-jdk-alpine   a3562aa0b991   4 years ago      105MB

# 推送镜像
docker push 192.168.100.251:85/tensquare/eureka:v1

此时Harbor仓库有了上传的镜像
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

从Harbor下载镜像

需求:在192.168.100.252服务器(生产部署服务器)完成从192.168.100.251(Harbor镜像仓库)下载镜像

# 安装Docker,并启动Docker(已完成)

# 修改Docker配置添加对Harbor镜像仓库的信任
vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://k68iw3ol.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.100.251:85"]
}

systemctl daemon-reload && systemctl restart docker

# 先登录,再从Harbor下载镜像
docker login -u haibo -p LIUhaibo123 192.168.100.251:85
docker pull 192.168.100.251:85/tensquare/eureka:v1

docker images

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

微服务持续集成

项目代码上传到Gitlab

参考之前的步骤,上传后台微服务和前端web网站代码。

上传后端代码

创建tensquare项目组
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
将张三加入项目组,并赋予owner权限
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
创建项目
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
此时tensquare组里就有新建的两个项目
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
上传代码,通过IDEA操作

首先上传后端微服务代码
启用版本控制集成
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
新建一个仓库地址
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
提交代码到仓库
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
项目成功提交
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
上传前端代码

通过Tortoisegit上传
Git小乌龟的安装及使用

在代码目录下右键创建本地仓库
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
提交代码到本地仓库,右键提交–>master
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
管理远程地址
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
使用用户zhangsan执行代码推送
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
前往Gitlab代码仓库查看
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
至此,所有代码上传完毕!

从Gitlab拉取项目源码

Jenkins创建后端流水线项目
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
添加参数化构建
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
添加字符参数
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
配置从版本控制里抓取pipeline脚本
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
使用流水线语法生成流水线脚本
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

// 定义变量以及引用变量,这样维护性好一点
// 引用凭证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"

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

上传Jenkinsfile文件至仓库,以便Jenkins项目能够获取脚本文件执行项目构建
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
进入代码仓库查看
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
开始构建项目,默认使用master分支
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

提交到SonarQube代码审查

进入tensquare_back项目,添加两个参数
在参数化构建过程添加(Choice Parameter)
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
添加需要选择审查的项目名称
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
点击构建查看效果
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
项目的根目录下添加sonar-project.properties
首先在eureka_server根目录创建

# must be unique in a given SonarQube instance
sonar.projectKey=tensquare_eureka_server
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=tensquare_eureka_server
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

然后再相应的目录里添加不同的sonar-project.properties,注意:修改sonar.projectKeysonar.projectName
修改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"

node {
    stage('拉取代码') {
      checkout scmGit(branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
    }
    stage('代码审查') {
      // 定义当前Jenkins的SonarQubeScanner工具的环境,位于全局工具配置的SonarQube Scanner 的name定义为'sonar-scanner'
      def scannerHome = tool 'sonar-scanner'
      // 引用当前JenkinsSonarQube的环境,系统配置的SonarQube servers定义的name以及代码审查服务器位置
      withSonarQubeEnv('sonarqube') {
        sh """
          cd ${project_name}
          ${scannerHome}/bin/sonar-scanner
           """
      }
    }
}

由于修改了很多文件,统一提交至仓库
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
构建项目并测试代码审查能否完成
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
sonarqube后台查看审查结果
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
将其他三个项目也做代码审查
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

微服务打包构建

编译构建之前需要对一个公共子工程编译安装

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

node {
    stage('拉取代码') {
      checkout scmGit(branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
    }
    stage('代码审查') {
      // 定义当前Jenkins的SonarQubeScanner工具的环境,位于全局工具配置的SonarQube Scanner 的name定义为'sonar-scanner'
      def scannerHome = tool 'sonar-scanner'
      // 引用当前JenkinsSonarQube的环境,系统配置的SonarQube servers定义的name以及代码审查服务器位置
      withSonarQubeEnv('sonarqube') {
        sh """
          cd ${project_name}
          ${scannerHome}/bin/sonar-scanner
           """
      }
    }
   stage('编译安装公共子工程') {
      sh "mvn -f tensquare_common clean install"
    }
}

Jenkinsfile文件上传至代码仓库,再尝试构建
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
构建失败
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
如果编译构建失败,进入IDEA
tensquare_parent父工程里面的spring-boot-maven插件移到需要项目打包的项目里去

tensquare_common子工程不需要这个插件
只需要将插件加入tensquare_eureka_servertensquare_admin_servicetensquare_gatheringtensquare_zuul

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

<!-- 在project里添加 -->
</project>

调整好之后,上传至Gitlab代码服务器
再次尝试对公共子工程进行打包,此时可以看到公共子工程安装到了本地maven仓库
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
继续编写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"

node {
    stage('拉取代码') {
      checkout scmGit(branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
    }
    stage('代码审查') {
      // 定义当前Jenkins的SonarQubeScanner工具的环境,位于全局工具配置的SonarQube Scanner 的name定义为'sonar-scanner'
      def scannerHome = tool 'sonar-scanner'
      // 引用当前JenkinsSonarQube的环境,系统配置的SonarQube servers定义的name以及代码审查服务器位置
      withSonarQubeEnv('sonarqube') {
        sh """
          cd ${project_name}
          ${scannerHome}/bin/sonar-scanner
           """
      }
    }
   stage('编译安装公共子工程') {
      sh "mvn -f tensquare_common clean install"
    }
   stage('编译打包微服务工程') {
     // 项目参数传入的project_name 修改为变量
      sh "mvn -f ${project_name} clean package"
    }
}

首先对eureka服务器进行打包
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
来到Jenkins工作目录下查看一下
tensquare_eureka_server进行了打包并且target下有jar包
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
将其它三个微服务以同样方式打包

但打包tensquare_zuul报错
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
网关依赖父工程,但仓库里的父工程没有
因此需要按照父工程的目录结构将父工程pom.xml文件上传到Jenkins服务器的maven仓库,对应的maven仓库里去以便构建时网关服务找到父工程
那么这个动作需要手动完成

[root@jenkins ~]# cd repo/com/tensquare/
[root@jenkins tensquare]# ls
tensquare_common  tensquare_parent

rz

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
再次进行构建
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
将剩下两个微服务打包
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

使用Dockerfile编译生成镜像

利用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>

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
在每个微服务项目根目录下建立Dockerfile文件
注意:每个项目公开的端口不一样
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

# 构建eureka服务器的dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 10086
ENTRYPOINT ["java","-jar","/app.jar"]

修改Jenkins流水线脚本,添加dockerfile:build触发插件执行

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

node {
    stage('拉取代码') {
      checkout scmGit(branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
    }
    stage('代码审查') {
      // 定义当前Jenkins的SonarQubeScanner工具的环境,位于全局工具配置的SonarQube Scanner 的name定义为'sonar-scanner'
      def scannerHome = tool 'sonar-scanner'
      // 引用当前JenkinsSonarQube的环境,系统配置的SonarQube servers定义的name以及代码审查服务器位置
      withSonarQubeEnv('sonarqube') {
        sh """
          cd ${project_name}
          ${scannerHome}/bin/sonar-scanner
           """
      }
    }
   stage('编译安装公共子工程') {
      sh "mvn -f tensquare_common clean install"
    }
   stage('编译打包微服务工程') {
     // 项目参数传入的project_name 修改为变量
      sh "mvn -f ${project_name} clean package dockerfile:build"
    }
}

commit代码,然后对eureka_server进行构建
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
查看本地镜像,创建成功!
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
其他的服务也是如此,依然需要插件和dockerfile

# 编写dockerfile,注意端口号的区分,实际没多大区别

# 构建tensquare_zuul所需的dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 10020
ENTRYPOINT ["java","-jar","/app.jar"]

# 构建tensquare_admin_service所需的dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 9001
ENTRYPOINT ["java","-jar","/app.jar"]

# 构建tensquare_gathering所需的dockerfile
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 9002
ENTRYPOINT ["java","-jar","/app.jar"]

上传代码后进行构建
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

上传到Harbor镜像仓库

修改Jenkinsfile构建脚本

添加对镜像打tag配置

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

node {
    stage('拉取代码') {
      checkout scmGit(branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
    }
    stage('代码审查') {
      // 定义当前Jenkins的SonarQubeScanner工具的环境,位于全局工具配置的SonarQube Scanner 的name定义为'sonar-scanner'
      def scannerHome = tool 'sonar-scanner'
      // 引用当前JenkinsSonarQube的环境,系统配置的SonarQube servers定义的name以及代码审查服务器位置
      withSonarQubeEnv('sonarqube') {
        sh """
          cd ${project_name}
          ${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}"
    }
}

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
添加Harbor用户凭证
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
创建完成后再次进入凭证查看
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
将生成的id复制并保存
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

5785fbf3-a0f0-4234-8961-c866ca1e7046

进入流水线片段生成器
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
编写Jenkins流水线脚本,添加推送镜像至harbor仓库的配置

// 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 {
    stage('拉取代码') {
      checkout scmGit(branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
    }
    stage('代码审查') {
      // 定义当前Jenkins的SonarQubeScanner工具的环境,位于全局工具配置的SonarQube Scanner 的name定义为'sonar-scanner'
      def scannerHome = tool 'sonar-scanner'
      // 引用当前JenkinsSonarQube的环境,系统配置的SonarQube servers定义的name以及代码审查服务器位置
      withSonarQubeEnv('sonarqube') {
        sh """
          cd ${project_name}
          ${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 镜像上传成功"
        }
   }
}

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

拉取镜像和发布应用

安装Publish Over SSH插件

安装以下插件,可以实现远程发送Shell命令
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

配置远程部署服务器

# 将Jenkins服务器的公钥拷贝到远程pro生产部署服务器 
ssh-copy-id 192.168.100.252

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
在Jenkins进入系统配置,找到Publish over SSH
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Path to key文件指向持续集成服务器的私钥文件,写绝对路径
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
点击新增
新增Hostname设置远程生产环境部署项目的主机IP地址
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
修改Jenkinsfile构建脚本

生成远程调用模板代码
新版Jenkins需要安装完插件后重启生效
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
其他置空,生成流水线脚本,需要注意的是Exec command,这个是远程执行的命令
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

sshPublisher(publishers: [sshPublisherDesc(configName: 'master_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', 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,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

编写远程部署脚本

# 位于pro生产环境服务器上操作
mkdir /opt/jenkins_shell
vim /opt/jenkins_shell/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 haibo -p LIUhaibo123 $harbor_url

# 下载镜像
docker pull $imageName

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

echo "容器启动成功"


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

编写Jenkins流水线脚本

添加远程部署配置

// 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 {
    stage('拉取代码') {
      checkout scmGit(branches: [[name: "*/${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]])
    }
    stage('代码审查') {
      // 定义当前Jenkins的SonarQubeScanner工具的环境,位于全局工具配置的SonarQube Scanner 的name定义为'sonar-scanner'
      def scannerHome = tool 'sonar-scanner'
      // 引用当前JenkinsSonarQube的环境,系统配置的SonarQube servers定义的name以及代码审查服务器位置
      withSonarQubeEnv('sonarqube') {
        sh """
          cd ${project_name}
          ${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)])
   }
}

提交Jenkinsfile文件后尝试对项目进行构建
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
远程登录服务器并执行部署脚本
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
在生产环境部署服务器上查看容器和镜像
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

部署和测试所有微服务

更改微服务设置

eureka配置
修改ip地址为部署的生产环境服务器地址
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
zuul网关配置
修改eureka的ip地址,使其部署后在eureka服务器注册服务
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
admin_service权限中心
需要修改数据库相关信息(选择sonarqube服务器上的mysql作为后端数据库,此数据库在sonarqube代码审查服务器上)
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

# mysql授权root用户远程登录
grant all privileges on *.* to 'root'@'%' identified by 'Hahaha123@#';

# 重载数据库刷新用户权限
flush privileges;

使用SQLyog进行连接测试
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
gathering活动微服务
同样修改数据库和eurekaIP地址使其部署后可以注册服务
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
将所有更新的配置上传代码仓库
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
导入MySQL数据
依次导入用户表和活动表
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
更改了配置后重新部署微服务

需要注意的是端口的区别
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
查看容器运行状态
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
通过浏览器查看
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
此时所有微服务已经全部构建完毕!可以通过postman对微服务功能进行检测
由于程序连接数据库有部分问题,通过参考文章:https://blog.csdn.net/L_it123/article/details/106845391 修改部分代码

首先检查权限中心能否登录

http://192.168.100.252:10020/admin/admin/login

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

部署前端静态web网站

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
安装Nginx服务器

rpm -ivh nginx-1.20.0-1.el7.ngx.x86_64.rpm

# 修改端口
vim /etc/nginx/conf.d/default.conf
server {
    listen       9090;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

# 启动nginx
systemctl enable nginx --now

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

# 持续集成服务器安装nodejs环境
curl --silent --location https://rpm.nodesource.com/setup_10.x | bash -
yum install nodejs -y
npm install -g cnpm --registry=https://registry.npm.taobao.org

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
创建前端流水线项目
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
添加分支参数
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd

编写流水线脚本

//gitlab的凭证 
def git_auth = "a4d0066f-6c58-4ab0-b714-6a24b3f5bc90"

node {
  stage('拉取代码') {
    checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: "${branch}", url: 'git@192.168.100.240:tensquare_group/tensquare_front.git']])
  }
  stage('打包前端静态代码') {
    // 使用NodeJS的npm进行打包
    // sh 'npm cache clean --force'
    // sh 'rm -rf node_modules && rm -rf package-lock.json'  
    sh 'npm install'    
    sh 'npm run build'    
  }
  stage('部署网站') {	
  //=====以下为远程调用进行项目部署========
  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)])
  }
}

git_auth 凭据需要去Jenkins找
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
构建成功
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
使用浏览器访问
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
查询到了数据库的信息,因此证明前端页面和后端连接成功
Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
再次查看容器日志,可以看到有修改数据库内容,证明前后端连通成功

# 查看活动微服务容器日志
docker logs -f `docker ps| grep -i 'gathering'|awk '{print $1}'`

Jenkins+Docker+SpringCloud微服务持续集成,# Jenkins,jenkins,docker,spring cloud,ci/cd
至此Jenkins+Docker+SpringCloud微服务持续集成就搭建完成!剩余还需要对其优化!文章来源地址https://www.toymoban.com/news/detail-644504.html

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

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

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

相关文章

  • 基于Jenkins实现Docker应用的持续集成与部署

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

    2023年04月20日
    浏览(31)
  • SpringBoot+Docker+Git+Jenkins实现简易的持续集成和持续部署

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

    2024年02月21日
    浏览(31)
  • 基于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日
    浏览(32)
  • docker+k8s+jenkins+harbor持续集成自动化部署

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

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

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

    2024年01月18日
    浏览(56)
  • Jenkins K8S Docker 一键部署SpringCloud微服务

    一键部署springcloud微服务,需要用到 Jenkins K8S Docker等工具,若未安装,请参考《Centos 7 安装K8S》 本文使用jenkins部署,流程如下图 开发者将代码push到git 运维人员通过jenkins部署,自动到git上pull代码 通过maven构建代码 将maven构建后的jar打包成docker镜像 并 push docker镜像到docker

    2024年02月02日
    浏览(27)
  • Gitlab+Jenkins+Docker+Harbor+K8s集群搭建CICD平台(持续集成部署Hexo博客Demo)

    目录 涉及内容: 一、CICD服务器环境搭建 1、docker 环境安装 (1)、拉取镜像,启动并设置开机自启 (2)、配置docker加速器 2、安装并配置GitLab (1)、创建共享卷目录 (2)、创建 gitlab 容器 (3)、关闭容器修改配置文件 (4)、修改完配置文件之后。直接启动容器 (5)、相关

    2024年03月15日
    浏览(50)
  • .NET Core部署到linux(CentOS)最全解决方案,入魔篇(使用Docker+Jenkins实现持续集成、自动化部署)

    通过前面三篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus) 通过前面三篇文章的介绍,我们已经对.net core多方案部署到linux下有了非常全面的认识

    2024年02月02日
    浏览(35)
  • [Docker实现测试部署CI/CD----Jenkins集成相关服务器(3)]

             SonarScanner 是一种代码扫描工具,专门用来扫描和分析项目代码质量。扫描和分析完 成之后,会将结果写入到 SonarQube 服务器的数据库中,并在 SonarQube 平台显示这些数 据。         在 SonarQube 官网的帮助文档中可以下载 SonarScanner。这里下载一个 Linux 系统下使

    2024年02月14日
    浏览(30)
  • Vmware虚拟机搭建 K8S ingress Jenkins Gitlab Harbor Docker 一键部署SpringCloud微服务

    本文主要基于Kubernetes1.22.2和Linux操作系统Ubuntu 20.04.6。 操作系统 主机名 IP地址 进程 功能 Ubuntu 20.04.6 k8s-master 192.168.189.128 docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico 主节点 Ubuntu 20.04.6 k8s-node1 192.168.189.129 docker,kubelet,kube-proxy,c

    2024年02月03日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包