java系列 如何使用jenkins+docker自动化部署spring-cloud项目

前言

本文章示例jenkins版本为 - 2.346.3 , springboot版本 - 2.1.6 RELEASE , cloud的version-Greenwich.SR1

服务器环境需求 :

需要有maven环境

需要有git环境

需要有java环境

需要安装jenkins服务 - jenkins安装可以看我这篇文章 : 安装jenkins的三种方法

关于jenkins的配置上一篇文章如何使用jenkins+docker自动化部署spring-boot项目那一片文章已经叙述过,这一章就把他复制过来不重复造轮子了,都是一样的唯独不一样的就是后续创建项目的时候,如果大家已经配置好jenkins可以直接跳到配置项目进行阅读!

配置jenkins

将jenkins用户加入docker用户组

查看是否有docker用户组

cat /etc/group

image

没有的话新建一个

sudo groupadd docker 

查看是否有jenkins用户,一般war包方式启动jenkins的需要自建一个jenkins

cat /etc/passwd

image

没有的话新建一个

adduser jenkins

添加jenkins用户到docker用户组

newgrp docker

查看jenkins所在的用户组

groups jenkins

image

重启jenkins

#yum安装的重启方式
systemctl restart jenkins
#war包的重启方式
ps aux |grep jenkins #找见jenkins的pid
kill -9 [jenkins的pid]
然后再启动jenkins

开启docker远程访问权限,修改docker.service配置文件

vim /usr/lib/systemd/system/docker.service

添加以下内容

ExecStart=  
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

image

重新读取配置

systemctl daemon-reload

重启docker

systemctl restart docker

如果开启的防火墙需要放行2375端口以及开启

iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 2375 -j ACCEPT

jenkins环境配置

进入jenkins首页点击侧边栏Manage Jenkins -> Global Tool Configuration

image

jenkins配置jdk环境

image

jenkins配置git环境

image

没有git服务,可以使用以下命令进行安装git

sudo yum install -y git
whereis git #查看git安装目录,一般默认是/usr/bin/git

jenkins配置maven环境

image

保存环境配置,然后进入插件管理中心

image

点击已安装,搜索maven看看maven插件是否安装,有的话就不需要重复安装了

image

没有的话,点击可选插件,然后搜索maven,进行安装maven插件

image

配置项目

因为我们是要将项目打包成docekr镜像然后发布启动,所以我们可以在项目的pom中使用dockerfile-maven-plugin插件让我们的项目在进行maven打包的同时生成docker镜像,具体操作就是首先需要在我们每一个微服务的根目录去编辑一个dockerFile

FROM registry.cn-hangzhou.aliyuncs.com/sangmuen/java:8 #基于java8创建镜像

MAINTAINER jy1997 4044092@qq.com #作者信息,随意填

ARG JAR_FILE #JAR_FILE会对应pom中maven打包哪里的一个变量,maven打完包会把包名赋到这个变量上

COPY ${JAR_FILE} /eureka.jar #同上,就是将打完的jar包复制到容器中并重命名为eureka.jar

CMD ["--server.port=6868"] #修改springboot启动端口为当前项目的端口号

EXPOSE 6868 #暴露该端口,要不会无权限访问

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone #修改docekr镜像时差

ENTRYPOINT ["java","-jar","/eureka.jar"] #启动docekr中的jar包 ,后面启动jar包名就是你copy到容器中的jar包

这是其中一个dockerfile , 其他微服务的docekrfile只需要将上面的端口号还有jar包名改一下就可以了,每一个可启动的微服务都需要有一个dockerfile在根目录

image

接下来就是需要在可启动的微服务的pom中声明在maven打包的时候生成docker镜像,具体就是在你的pom中新增以下片段,注意 : 只需要在可启动的微服务的pom中新增即可

    <build>
        <plugins>
            <plugin>
                <!-- maven打包 -->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!-- 入口函数不在根目录下进行如下配置,你入口函数的路径 -->
                <configuration>
                    <mainClass>com.amall.UserApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>org.springframework</groupId>
                        <artifactId>springloaded</artifactId>
                        <version>1.2.5.RELEASE</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.18.1</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>

            <!--docker 打包,这里就是声明在maven打包时会根据根目录的dockerfile进行docker镜像生成-->
            <plugin>

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

            </plugin>
        </plugins>

    </build>
  • ${project.build.finalName}.jar是jar包路径,这里使用了最终生成的jar包的文件名

我们项目中除了一些可启动的微服务以外,还有一些服务就是会存放一下公共的东西比如共用的pojo包或者工具类什么的,这些服务并不需要启动,而是会打成一个jar包供其他服务器调用即可,那这些微服务就不需要生成dockerfile文件,pom中也不需要声明docker打包片段,具体pom片段如下

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

编辑成功以后,我们在将项目提交到git上

image

jenkins创建项目

然后我们在登录jenkins进行项目创建 , 首页 -> 新建item -> 选择流水线 -> 输入项目名称然后点击确定

image

然后我们选择General中的This project is parameterize,然后点击添加参数

image

选择Choice Parameter参数添加,名称就随便填一下即可,要在下面的流水线脚本中引用该变量名,选项填你每一个可启动的微服务名称

image

然后最下面点击流水线语法

image

选择片段生成器 - > check out

image

然后先添加凭证

image

然后输入自己git仓库的账号密码进行保存

image

然后再输入自己项目的git地址,下面凭证就选择自己刚才添加的凭证

image

然后点击生成流水线脚本

image

然后返回jenkins配置,在最下面的流水线哪里添加以下脚本

pipeline {
    agent any
    environment { 
        def imageName = "${service}"
        def tag="latest"
        def publish_server= "docker_client"
    }
    tools { 
        //这里对应着你jenkins中maven配置的别名
        maven "apache-maven-3.6.3" 
    }
    stages {
        stage('check out') {
            steps {
                //这里填刚才生成的流水线脚本
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '49bdadbc-c174-4943-ba74-dc645e87b42b', url: 'https://gitee.com/i-moon/cloud-demo.git']]])
            }
        }
        stage('building dependency') {
            steps {
                //这里根据父项目的pom进行打包,就是把父项目下的所有项目都打包生成jar包,防止微服务数据不一致,所有直接在每一次微服务发布都会进行一次全项目数据更新
                sh '''
                    mvn -f pom.xml  clean install -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true

                '''  
            }
        }
        stage('building selected project') {
            steps {
                sh '''

                    containerStr=`docker ps -a | grep -w ${imageName} | awk '{print $1}'`
                    imageStr=`docker images | grep -w $imageName  | awk '{print $3}'`
                    echo "container id:$containerStr"
                    echo "image id:$imageStr"

                    if [ "$imageStr" !=  "" ] ; then
                        if [ "$containerStr" !=  "" ] ; then
                            #停掉容器
                            docker stop `docker ps -a | grep -w ${imageName}  | awk '{print $1}'`

                            #删除容器
                            docker rm `docker ps -a | grep -w ${imageName}  | awk '{print $1}'`

                            #删除镜像
                            docker rmi --force ${imageName}
                        else
                             #删除镜像
                            docker rmi --force ${imageName}

                        fi
                    fi

                    # eureka , 以下就是根据选项进行maven打包并生成docker镜像到本地
                    if [ "$imageName" ==  'eureka' ] ; then
                    mvn -f cloud-demo/${service}  clean install dockerfile:build -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
                    fi

                    # goods
                    if [ "$imageName" ==  'goods' ] ; then
                    mvn -f cloud-demo/${service}  clean install dockerfile:build -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
                    fi

                    # order
                    if [ "$imageName" ==  'order' ] ; then
                    mvn -f cloud-demo/${service}  clean install dockerfile:build -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
                    fi

                    # user
                    if [ "$imageName" ==  'user' ] ; then
                    mvn -f cloud-demo/${service}  clean install dockerfile:build -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true
                    fi
                '''  
            }
        }

        stage('docker images start') {
            steps {
                sh '''
                    # eureka , 以下就是启动上一步生成的docker镜像
                    if [ "$imageName" ==  "eureka" ] ; then
                    docker run -d -p 6868:6868 -v /dockerVolume/mount/:/mount/ --net my_net --ip 192.168.200.200 --name ${imageName} ${imageName}
                    fi

                    # goods
                    if [ "$imageName" ==  "goods" ] ; then
                    docker run -d -p 10001:10001 -v /dockerVolume/mount/:/mount/ --net my_net  --name ${imageName} ${imageName}
                    fi

                    # order
                    if [ "$imageName" ==  "order" ] ; then
                    docker run -d -p 10002:10002 -v /dockerVolume/mount/:/mount/ --net my_net  --name ${imageName} ${imageName}
                    fi

                    # user
                    if [ "$imageName" ==  "user" ] ; then
                    docker run -d -p 10003:10003 -v /dockerVolume/mount/:/mount/ --net my_net  --name ${imageName} ${imageName}
                    fi

                '''  
            }
        }
    }
}

image

如果你git上第一级目录为单个目录没有pom文件那就是你提交了父项目文件夹,如果你第一级目录中有父项目的pom文件那就是你没有提交父项目文件夹,根据自身情况修改上述流水线脚本!

然后点击保存,然后点击Build with parameters 就可以看见你新增的微服务列表了

image

最后一步我们在生成一下以上脚本中声明的docker网络 my_net , 网关为 192.168.200.1,这一步是确保我们这个项目在docker容器中的网络隔离性

#创建docker网络
docker network create --driver bridge --subnet 192.168.200.0/24 --gateway 192.168.200.1 my_net
#查看docker网络
docker network ls

image

然后我们就可以去选择一个微服务进行构建了,第一次构建可能会很慢,因为要下载依赖,后续就会很快了

image

第一次失败是因为我git上提交的项目,把父项目文件夹给提交上去了,到时mvn打包找不见pom文件,大家可以忽略,后续就都打包成功了,那后续我们只需要将代码更新到git上,然后根据情况去进行微服务构建即可

测试

查看docker容器

docker ps

image

测试接口

image

小结

如何使用docker + jenkins一键式部署springcloud项目教程就到这里完成了,毕竟每个人的服务器环境都不一样,或多或少会有一个坑,如果大家有问题或者需要帮助的可以加我qq或者评论区留言.网上关于这jenkins集成微服务的教程还是很少的,大多数都是集成springboot.

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇