jenkins+docker+springcloud微服务持续集成(中)(代码片段)

热爱编程的大忽悠 热爱编程的大忽悠     2022-12-01     697

关键词:

Jenkins+Docker+SpringCloud微服务持续集成(中)


微服务持续集成

  1. 准备一个简单的微服务项目
  2. 项目代码上传到对应的diam仓库中,如: gitee,github,gitlab等

这里大家可以选用我给出的SpringCloud小书项目进行学习和测试:
https://gitee.com/DaHuYuXiXi/spring-cloud-book

  1. 在Jenkins中新建和微服务同名的流水线项目
  2. 创建Jenkinsfile文件
    //定义git凭证ID
    def git_auth = 'cde7fe8a-f426-4f93-9f05-e96e60177952'
    //git的url地址
    def git_url = 'https://gitee.com/DaHuYuXiXi/spring-cloud-book.git'

    stages 
        stage('拉取代码') 
           checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: "$git_auth", url: "$git_url"]]])
        
    

脚本采用的是声明式脚本语法编写


提交到SonarQube代码审查

在Jenkins的项目中添加一个参数


在每个微服务的根目录中添加sonar-project.properties文件

  • eureka微服务的根目录添加sonar-project.properties文件,内容如下:
# must be unique in a given SonarQube instance
sonar.projectKey=eureka
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=SpringCloudBook-eureka 
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=11
sonar.java.target=11
# sonar.java.libraries=**/target/classes/**
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
  • rbac微服务的根目录添加sonar-project.properties文件,内容如下:
# must be unique in a given SonarQube instance
sonar.projectKey=rbac
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=SpringCloudBook-rbac
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=11
sonar.java.target=11
# sonar.java.libraries=**/target/classes/**
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8
  • sms微服务的根目录添加sonar-project.properties文件,内容如下:
# must be unique in a given SonarQube instance
sonar.projectKey=sms
# this is the name and version displayed in the SonarQube UI. Was mandatory prior to SonarQube 6.1.
sonar.projectName=SpringCloudBook-sms
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=11
sonar.java.target=11
# sonar.java.libraries=**/target/classes/**
# Encoding of the source code. Default is default system encoding
sonar.sourceEncoding=UTF-8


修改Jenkins构建脚本

//定义git凭证ID
def git_auth = 'cde7fe8a-f426-4f93-9f05-e96e60177952'
//git的url地址
def git_url = 'https://gitee.com/DaHuYuXiXi/spring-cloud-book.git'

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

       stage('代码审查') 
        //定义当前Jenkins的SonarQubeScanner工具的环境
        def scannerHome = tool 'sonarqube-scanner'
        //引用当前Jenkins的SonarQube环境
        withSonarQubeEnv('sonarqube-8.6.0') 
          sh """
               cd $project_name
               $scannerHome/bin/sonar-scanner
          """
         
       
       
       //公共子工程编译打包--如果有需要则添加
       //stage('编译,安装公共的子工程') 
         //  sh "mvn -f Code/common clean install"
         //  sh "mvn -f Code/dao clean install"
       //

如果有common公共子工程,那么需要将spring-boot-maven-plugin插件从总工程移动到各个微服务工程,否则common公共子工程继承了总工程之后,spring-boot-maven-plugin插件会报错,因为找不到启动类。


编译打包微服务工程

//定义git凭证ID
def git_auth = 'cde7fe8a-f426-4f93-9f05-e96e60177952'
//git的url地址
def git_url = 'https://gitee.com/DaHuYuXiXi/spring-cloud-book.git'

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

       stage('代码审查') 
        //定义当前Jenkins的SonarQubeScanner工具的环境
        def scannerHome = tool 'sonarqube-scanner'
        //引用当前Jenkins的SonarQube环境
        withSonarQubeEnv('sonarqube-8.6.0') 
          sh """
               cd $project_name
               $scannerHome/bin/sonar-scanner
          """
         
       
       
       //直接通过父项目编译打包所有的微服务模块
       stage('编译,打包微服务工程') 
           sh "mvn -f Code clean install"
       

需要将每个微服务工程都编译打包。


使用Docker编译、生成镜像并自动推送到harbor

前提说明

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

● 因为我用的是JDK11,而JDK9以上就移除了javax.activation.activation的jar包,所以需要在每个微服务工程都加上依赖:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

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

  • 父项目写一个模板
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>dockerfile-maven-plugin</artifactId>
                    <version>1.4.13</version>
                   <!--      构建时机     -->
                    <executions>
                        <execution>
                            <id>my-hub</id>
                           <!--    执行mvn package时,自动触发docker build和docker push     -->
                            <phase>package</phase>
                            <goals>
                                <goal>build</goal>
                                <goal>push</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                     <!--  harbor是私有仓库需要登录的话   -->
                        <username>dhy</username>
                        <password>126433zdh</password>
                         <!--           dockerfile当前项目根路径下              -->
                        <contextDirectory>$project.basedir</contextDirectory>
                        <!--  要上传的远程镜像仓库地址   -->
                        <repository>$docker.repostory/$docker.registry.name/$project.artifactId</repository>
                       <!--     要构建的jar包地址配置   -->
                        <buildArgs>
                            <JAR_FILE>target/$project.build.finalName.jar</JAR_FILE>
                        </buildArgs>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
  • 子项目只需要覆盖其中部分实现即可
    <properties>
        <!--Docker镜像的标签,也就是版本-->
        <docker.image.tag>v1.0.0</docker.image.tag>
    </properties>

    <build>
        <!--  设置生成的jar包名       -->
        <finalName>sms</finalName>
        <plugins>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.13</version>
                <configuration>
                    <tag>$docker.image.tag</tag>
                </configuration>
            </plugin>
        </plugins>
    </build>

在每个微服务根目录下新建Dockerfile文件

FROM openjdk:8 
ARG JAR_FILE
COPY $JAR_FILE app.jar 
# 注意每个项目公开的端口不一样
EXPOSE 9000
ENTRYPOINT ["java","-jar","/app.jar"]

修改Jenkinsfile

//定义git凭证ID
def git_auth = 'cde7fe8a-f426-4f93-9f05-e96e60177952'
//git的url地址
def git_url = 'https://gitee.com/DaHuYuXiXi/spring-cloud-book.git'

node 
       stage('拉取代码') 
           checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: "$git_auth", url: "$git_url"]]])
        
       
       stage('编译,打包微服务工程') 
          // docker:build 可以触发插件的执行
          //因为是直接构建父模块来构建所有子模块,所以这里不能直接加docker:build命令
          // sh "mvn -f Code clean install docker:build"
          //每个子模块的pom文件已经指定了对应docker插件的触发时机
          sh "mvn -f Code clean install"
       

如果到这里编译打包没报错,并且镜像正常上传到harbor私有仓库,则说明没有问题,否则可以尝试下面的方式。


手动上传镜像到Harbor镜像仓库

  • 准备命令文件,放在项目根路径下
#!/bin/bash

#登录docker
docker login -u dhy -p xxx xxx

#进入项目根目录下
cd /var/lib/jenkins/workspace/SpringCloudBook/Code

#通过命令文件启动项目
cd sms
# docker push xxx/springcloudbook/REPOSITORY[:TAG]
docker rm -f xxx/springcloudbook/sms:1.0
docker build -t xxx/springcloudbook/sms:1.0 .
docker push xxx/springcloudbook/sms:1.0
cd ..

cd rbac
# docker push xxx/springcloudbook/REPOSITORY[:TAG]
docker rm -f xxx/springcloudbook/rbac:1.0
docker build -t xxx/springcloudbook/rbac:1.0 .
docker push xxx/springcloudbook/rbac:1.0
cd ..

cd eureka
# docker push xxx/springcloudbook/REPOSITORY[:TAG]
docker rm -f xxx/springcloudbook/eureka:1.0
docker build -t xxx/springcloudbook/eureka:1.0 .
docker push xxx/springcloudbook/eureka:1.0
cd ..


  • 修改jenkinsfile文件
//定义git凭证ID
def git_auth = 'cde7fe8a-f426-4f93-9f05-e96e60177952'
//git的url地址
def git_url = 'https://gitee.com/DaHuYuXiXi/spring-cloud-book.git'
//定义tag
def tag = "1.0"
// 定义Harbor的URL地址
def harbor_url = "xxx"
// 镜像库项目名称
def harbor_project = "springcloudbook"
// Harbor的登录凭证id
def harbor_auth = "767a60c2-c423-4737-a455-228a7e38ead7"

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

       stage('编译,打包微服务工程') 
           // 修改部分
          // dockerfile:build 可以触发插件的执行
           sh "mvn -f Code clean install"
       


       stage('上传镜像') 
           sh 'chmod +x /var/lib/jenkins/workspace/SpringCloudBook/Code/start.bash'
           sh '/var/lib/jenkins/workspace/SpringCloudBook/Code/start.bash'
       



拉取镜像和发布应用


当jenkins所在服务器完成了镜像上传后,下一步就是通过 Publish Over SSH插件,发送命令给生产部署服务器,让他去拉取harbo镜像仓库的最新镜像,然后创建容器。

配置远程部署服务器

  • 在192.168.18.101中配置远程部署服务器(192.168.18.103):

因为我将所有服务器的防火墙关闭,但是在实际生产环境下,需要通过ssh公钥和私钥来匹配使用,前面已经生成过公钥和私钥,将公钥发给部署服务器。操作步骤如下:

  • 进入/root/.ssh目录:
  • 将公钥发给部署服务器:
  • 在配置远程部署服务器的Path to key中配置私钥的路径:
cd /root/.ssh
ssh-copy-id 192.168.18.103
/root/.ssh/id_rsa

在远程部署服务器创建部署的脚本

  • 进入/usr/local目录:
cd /usr/local
  • 编写deploy.sh脚本:
vim 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 xudaxian -p Xudaxian12345678 $harbor_url

# 下载镜像
docker pull $imageName

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

echo "容器启动成功"
  • 设置权限:
chmod +x deploy.sh

在Jenkins中设置参数

  • 将端口作为外部的参数,在Jenkins中配置。

修改Jenkinsfile文件添加拉取镜像和发布应用的部署

  • Jenkinfile:
//定义git凭证ID
def git_auth = "7d5c4945-2533-41e2-bd47-5dd97eb37f38"
//git的url地址
def git_url = "git@192.168.18.100:develop_group/jenkinscloud.git"
//定义tag
def tag = "1.0"
// 定义Harbor的URL地址
def harbor_url = "192.168.18.102:85"
// 镜像库项目名称
def harbor_project = "xudaxian-mall"
// Harbor的登录凭证id
def harbor_auth = "b6cf3cb5-8a33-457d-93da-65c46f0135b2"
// 定义远程执行命令
def execCommand = "/usr/local/deploy.sh $harbor_url $harbor_project $project_name $tag $port"
node 
    stage('拉取代码') 
        checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "$git_auth", url: "$git_url"]]])
    
    stage('代码审查') 
        //定义当前Jenkins的SonarQubeScanner工具的环境
        def scannerHome = tool 'sonarqube-scanner'
        //引用当前Jenkins的SonarQube环境
        withSonarQubeEnv('sonarqube-8.6.0') 
          sh """
               cd $project_name
               $scannerHome/bin/sonar-scanner
          """
        
    
    //如果有公共子工程
//     stage('编译,安装公共的子工程') 
//        sh "mvn -f jenkinscloud-common clean install"
//     
    stage('编译,打包微服务工程') 
       // dockerfile:build 可以触发插件的执行
       sh "mvn -f $project_name clean install dockerfile:build "
    

    stage('上传镜像') 

docker启动jenkins(代码片段)

1.拉取jenkins镜像dockerpulljenkins/jenkins:lts#docker拉取Jenkins镜像2.启动jenkinsmkdir-p/mydata/jenkins_docker#创建数据卷映射文件夹chown-R1000/mydata/jenkins_docker/#给文件夹增加权限dockerrun-di--name=jenkins-p49001:8080-v/m 查看详情

Jenkins:使用 Jenkins 文件的管道 Docker 作业 - Docker groovy 语法

】Jenkins:使用Jenkins文件的管道Docker作业-Dockergroovy语法【英文标题】:Jenkins:PipelineDockerJobwithJenkinsfile-Dockergroovysyntax【发布时间】:2017-11-1118:23:42【问题描述】:我很难找到有关如何通过jenkinsfile为管道作业构建、注册和运行docke... 查看详情

云原生之docker实战使用docker部署jenkins持续集成工具

【云原生之Docker实战】使用Docker部署jenkins持续集成工具一、jenkins介绍1.jenkins简介2.jenkins功能3.jenkins基本工作图二、检查本地系统版本三、检查本地docker状态1.检查docker版本2.检查docker状态四、安装docker-compose1.下载docker-compose二进... 查看详情

使用docker部署jenkins

由于Docker的普及,刚好目前团队需要Jenkins自动发布环境,于是决定把使用Docker来运行Jenkins服务。环境:Centos7安装Docker:systemctl install docker运行Dockersystemctl start docker拉镜像:docker pull docker.io/jenkinsci/j 查看详情

docker部署jenkins,以及在jenkins中使用宿主机的docker/docker-compose命令

使用最新的官方镜像jenkins/jenkins 第一次使用的docker部署jenkins的时候,出现了两个问题:1、因为用户权限问题挂载/home/jenkins/data到/var/jenkins_home挂载不了。后面通过修改data目录的所属用户可以解决,即在容器下查询用户id(10... 查看详情

docker-compose部署配置jenkins(代码片段)

docker-compose部署配置jenkins一、docker-compose文件version:‘3.1‘services:jenkins:image:jenkins/jenkins:ltsvolumes:-/data/jenkins/:/var/jenkins_home-/var/run/docker.sock:/var/run/docker.sock-/usr/bin/docker:/u 查看详情

在 Jenkins(在 docker 容器中)管道中构建 docker 映像

】在Jenkins(在docker容器中)管道中构建docker映像【英文标题】:BuilddockerimageinJenkins(indockercontainer)pipeline【发布时间】:2018-03-2708:22:09【问题描述】:我使用docker容器中的Jenkins。我想在Jenkins管道中构建docker映像,但docker在这个... 查看详情

docker容器-快速部署jenkins

...OS7,并安装docker容器2.在docker容器中执行  dockerpulljenkinsci/blueocean3.查看已经下载的Jenkins镜像dockerimages4.创建jenkins_home启动一个Jenkins容器创建一个jenkins目录mkdir/home/jenkins_home启动一个jenkins容器  查看详情

ubuntu中安装jenkins,基于docker运行jenkins(代码片段)

   本文是在ubuntu环境下安装jenkins,jenkins运行在docker容器中,至于docker如何安装,本文不再描述,大家可以上网查询下,如何安装docker,下面先放上一个使用jenkins自动部署原理图片(图片是网上找的,感谢原创分享)  下面... 查看详情

docker_快速部署jenkins

开门见山,如何在利用docker快速部署jenkins服务?下面详解1:docker的基本按照与部署,前文已经详述,这里不多说。2:pull一个jenkins镜像dockerpulljenkins3:查看已经安装的jenkins镜像dockerimages4:创建一个jenkins目录 mkdir/home/jenkins_ho... 查看详情

jenkins容器中使用docker

参考技术A在项目中要使用jenkins实现自动化CI/CD功能,jenkins以docker容器方式运行,其中项目编译完要以docker方式构建image,上传到harbor私有仓库中。那jenkins容器中就要有docker运行环境以实现dockerbuildimages。我使用的官方的镜像文... 查看详情

docker安装jenkins(代码片段)

docker安装Jenkinsdockersearchjenkinsdockerpulljenkins/jenkins:ltsmkdir/opt/apps/jenkins-pchmod777/opt/apps/jenkinsll/opt/apps/dockerrun-it--namewk-jenkins-v/opt/apps/jenkins:/var/jenkins_home-p8080:8080 查看详情

docker使用jenkins(代码片段)

...公司有一台测试机器, 上面装了docker, 就想着用docker部署jenkins, 然后将编译好的代码在宿主机上运行docker的安装就不说了jenkins的镜像用的是jenkins/jenkinsdockerpulljenkins/jenkins然后创建容器, 我挂载了宿主机目录到容器目录, 防止删... 查看详情

jenkins+docker实现应用发布和更新

Jenkins+docker实现应用发布Jenkins:centos6.5ip:192.168.83.84Docker:centos7.2ip:192.168.83.60 一、安装Jenkins最新版:sudowget-O/etc/yum.repos.d/jenkins.repohttp://pkg.jenkins-ci.org/redhat/jenkins.reposudorpm--i 查看详情

docker运行jenkins及vue项目与springboot项目(四.docker运行nginx)

docker运行jenkins及vue项目与springboot项目:一.安装docker二.docker运行jenkins为自动打包运行做准备三.jenkins的使用及自动打包vue项目四.docker运行nginx五.jenkins打包springboot服务且在docker中运行准备配置创建/home/jenkins/docker/nginx/nginx.conf文件... 查看详情

在 docker 容器中运行 jenkins 代理,jenkins 管道和 /var/run/docker.socket 出现问题

】在docker容器中运行jenkins代理,jenkins管道和/var/run/docker.socket出现问题【英文标题】:Runjenkinsagentindockercontainer,issuewithjenkinspipelineand/var/run/docker.socket【发布时间】:2018-03-1320:18:39【问题描述】:我创建了用于詹金斯代理奴隶的... 查看详情

docker运行jenkins及vue项目与springboot项目(五.jenkins打包springboot服务且在docker中运行)

docker运行jenkins及vue项目与springboot项目:一.安装docker二.docker运行jenkins为自动打包运行做准备三.jenkins的使用及自动打包vue项目四.docker运行nginx五.jenkins打包springboot服务且在docker中运行1.立即构建输入任务名称:service_blog选择maven项... 查看详情

持续集成:docker下使用jenkins容器构建docker镜像

最近又重新部署了jenkins持续集成系统,看到之前整理的文章不够详细,于是重新整理了docker下使用jenkins的容器进行持续集成的相关文章,拿来分享下docker环境registry镜像:registry:2.6.1docker:17.05.0-ceregistry宿主... 查看详情