Jenkins:Docker+SpringCloud工程持续集成

提示:本篇文章描述的是一个微服务项目基于Jenkins持续集成的综合案例,关于其中涉及到的Jenkins基础知识,可参考《学习中间件,从这里开始》的Jenkins章节。

前面我们介绍的都是Jenkins中各个常用的功能,今天我们通过集成Docker来实现一个基于SpringCloud技术栈的微服务持续集成过程。其流程如下:

在这里插入图片描述

大致流程说明:

(1)开发人员每天把代码提交到Gitlab代码仓库。

(2)Jenkins从Gitlab中拉取项目源码,编译打包成jar包,然后构建Docker镜像,并将镜像上传到Harbor镜像仓库中。

(3)Jenkins发送SSH远程命令,让生产部署服务器到Harbor私有仓库拉取镜像到本地,然后创建并启动容器。

(4)容器启动成功之后,用户就可以使用服务了。

1. 环境准备

  • 服务列表
服务器名称IP地址软件
代码托管服务器192.168.1.19Gitlab
持续集成服务器192.168.1.20Jenkins、Maven、Docker、SonarQube、MySQL
Docker仓库服务器192.168.1.17Docker、Harbor
生成部署服务器192.168.1.21Docker
  • 微服务工程

项目地址:https://gitee.com/anbang713/mini-mall

项目文档:《MiniMall项目文档目录》

在这里插入图片描述

  • Docker环境

Docker安装可参考:《Docker:Docker入门,这里没有废话》

Harhor安装可参考:《Docker:Harbor镜像仓库安装及使用》

2. 开始集成

2.1 项目代码上传到Gitlab

在这里插入图片描述

2.2 从Gitlab拉取项目源码

(1)在项目根目录创建Jenkinsfile文件,内容如下:

def git_auth = "8a039ab1-9d39-49a2-888b-03dbe9ee60e1"
def git_url = "http://192.168.1.19:82/mini-mall-group/mini-mall.git"

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

(2)添加Jenkins流水线项目配置,如下:

在这里插入图片描述

2.3 提交到SonarQube代码审查

(1)创建项目,并添加两个参数project_namebranch

在这里插入图片描述

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

# must be unique in a given SonarQube instance
sonar.projectKey=mall-registry-server
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=mall-registry-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.java.binaries=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.source=1.8
sonar.java.target=1.8
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8

(3)修改Jenkinsfile构建脚本

def git_auth = "8a039ab1-9d39-49a2-888b-03dbe9ee60e1"
def git_url = "http://192.168.1.19:82/mini-mall-group/mini-mall.git"

node {
    stage('拉取代码') {
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
    stage('代码审查') {
        def scannerHome = tool 'SonarQube-Scanner'
        withSonarQubeEnv('SonarQube7.4') {
            sh """
                cd ${product_name}
                ${scannerHome}/bin/sonar-scanner
            """
        }
    }
}

2.4 使用Dockerfile编译、生成镜像

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

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

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.10</version>
                <configuration>
                    <repository>${project.artifactId}</repository>
                    <buildArgs>
                        <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>
        </plugins>
</build>

(2)在每个微服务项目的根目录建立Dockerfile文件。

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

(3)修改Jenkinsfile构建脚本。

def git_auth = "8a039ab1-9d39-49a2-888b-03dbe9ee60e1"
def git_url = "http://192.168.1.19:82/mini-mall-group/mini-mall.git"
//构建版本的名称
def tag = "1.0-SNAPSHOT"

node {
    stage('拉取代码') {
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
    stage('代码审查') {
        def scannerHome = tool 'SonarQube-Scanner'
        withSonarQubeEnv('SonarQube7.4') {
            sh """
                cd ${product_name}
                ${scannerHome}/bin/sonar-scanner
            """
        }
    }
    stage('编译,构建镜像') {
        // 定义镜像名称
        def imageName = "${project_name}:${tag}"
        // 编译,构建本地镜像
        sh "mvn -f ${project_name} clean package dockerfile:build"
    }
}

2.5 上传到Harbor镜像仓库

(1)修改Jenkinsfile构建脚本。

def git_auth = "8a039ab1-9d39-49a2-888b-03dbe9ee60e1"
def git_url = "http://192.168.1.19:82/mini-mall-group/mini-mall.git"
def harbor_url = "192.168.1.17:85"
def harbor_auth = "287f6891-04dd-4861-861f-51ca64ba2de3"
def harbor_project_name = "mini-mall"
//构建版本的名称
def tag = "1.0-SNAPSHOT"

node {
    stage('拉取代码') {
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
    stage('代码审查') {
        def scannerHome = tool 'SonarQube-Scanner'
        withSonarQubeEnv('SonarQube7.4') {
            sh """
                cd ${product_name}
                ${scannerHome}/bin/sonar-scanner
            """
        }
    }
    stage('编译,构建镜像') {
        // 定义镜像名称
        def imageName = "${project_name}:${tag}"
        // 编译,构建本地镜像
        sh "mvn -f ${project_name} clean package dockerfile:build"
        // 给镜像打标签
        sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
        // 登录harbor,并上传镜像
        withCredentials([usernamePassword(credentialsId: "${harbor_auth}",passwordVariable: 'password', usernameVariable: 'username')]) {
      		//登录
      		sh "docker login -u ${username} -p ${password} ${harbor_url}"
      		//上传镜像
      		sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
        }
        // 删除本地镜像
        sh "docker rmi -f ${imageName}"
        sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
    }
}

(2)使用凭证管理的Harbor私服账号和密码。

2.6 拉取镜像和发布应用

注意:192.168.1.21服务器已经安装Docker并启动。

(1)安装Publish Over SSH插件。

在这里插入图片描述

(2)配置远程部署服务器。

  • 将192.168.1.17服务器的公钥拷贝到192.168.1.21服务器
ssh-copy-id 192.168.1.21
  • 系统配置->添加远程服务器

在这里插入图片描述

(3)修改Jenkinsfile构建脚本。

  • 添加一个port参数

在这里插入图片描述

  • Jenkinsfile文件
def git_auth = "8a039ab1-9d39-49a2-888b-03dbe9ee60e1"
def git_url = "http://192.168.1.19:82/mini-mall-group/mini-mall.git"
def harbor_url = "192.168.1.17:85"
def harbor_auth = "287f6891-04dd-4861-861f-51ca64ba2de3"
def harbor_project_name = "mini-mall"
//构建版本的名称
def tag = "latest"

node {
    stage('拉取代码') {
        checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
    }
    stage('代码审查') {
        def scannerHome = tool 'SonarQube-Scanner'
        withSonarQubeEnv('SonarQube7.4') {
            sh """
                cd ${product_name}
                ${scannerHome}/bin/sonar-scanner
            """
        }
    }
    stage('编译,构建镜像') {
        // 定义镜像名称
        def imageName = "${project_name}:${tag}"
        // 编译,构建本地镜像
        sh "mvn -f ${project_name} clean package dockerfile:build"
        // 给镜像打标签
        sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
        // 登录harbor,并上传镜像
        withCredentials([usernamePassword(credentialsId: "${harbor_auth}",passwordVariable: 'password', usernameVariable: 'username')]) {
      //登录
      sh "docker login -u ${username} -p ${password} ${harbor_url}"
      //上传镜像
      sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
        }
        // 删除本地镜像
        sh "docker rmi -f ${imageName}"
        sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"

        // 远程调用
        sshPublisher(publishers: [sshPublisherDesc(configName: 'master_ssh_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_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)编写depoly.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 admin -p Harbor12345 $harbor_url
# 下载镜像
docker pull $imageName
# 启动容器
docker run -di -p $port:$port $imageName
echo "容器启动成功"

上传deploy.sh文件到192.168.1.21服务器的/opt/jenkins_shell目录下,且文件至少有执行权限!

chmod +x deploy.sh

3. 开始构建

(1)开始构建

在这里插入图片描述

(2)构建结果

在这里插入图片描述

(3)浏览器访问mall-registry-server服务

在这里插入图片描述

——End——
更多精彩分享,可扫码关注微信公众号哦。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值