maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程d ...

打印 上一主题 下一主题

主题 984|帖子 984|积分 2952

一.背景

        在《maven项目容器化运行之1》中,我们开启了1Panel环境中docker构建服务给到了局域网。在《maven项目容器化运行之2》中,我们基本实现了maven工程创建、远程调用docker构建镜像、在1Panel选择镜像运行容器三大步骤。
       但是,存在一个题目,就是我们当地每次install的时候,都会去构建镜像。期望开发职员在当地开发打包构建时,用于当地测试或者联调,不去构建镜像。而专业测试职员一般是面对测试环境进行测试,这时就必要发布到测试环境,可以或许快速构建测试职员的测试环境就行。
      因为构建镜像、运行容器是部署阶段的变乱,并不是开发阶段的变乱。所以,我期望继续改进,实现更优雅的开发与部署(测试或正式部署)。
二.整体思路

     1.调整maven的docker插件设置

      期望通过设置dockerfile-maven-plugin插件,实现每次mvn install等,不要去构建镜像。但又要找到一个maven的命令,可以单独实验镜像构建的任务。我开始的思路是这样,行不行还得慢慢摸索学习。
     2.借助Jenkins创建自动构建镜像到1Panel

      这一步,我开始心里就有底。不外乎就是从git拉代码,实验一个命令,就实现了自动构建进行到1Panel。因为,在《maven项目容器化运行之2》中,我们本机实验maven工程的install就已经实现了远程调用docker的构建服务了。这里的“到1Panel”中,没有我们必要做的。应该是1Panel自己集成或者想了办法,可以识别到其本机docker的images。我们只要调用了1Panel所在服务器的docker构建服务并天生了image文件(默认就在docker所在的服务器上),它自己就能识别到。
三.尝试过程

    1.调整maven的docker插件设置     

  1.         <build>
  2.                 <finalName>${project.artifactId}</finalName>
  3.                 <plugins>
  4.                         <plugin>
  5.                                 <groupId>org.springframework.boot</groupId>
  6.                                 <artifactId>spring-boot-maven-plugin</artifactId>
  7.                                 <version>2.6.6</version>
  8.                                 <executions>
  9.                                         <execution>
  10.                                                 <goals>
  11.                                                         <goal>repackage</goal>
  12.                                                 </goals>
  13.                                         </execution>
  14.                                 </executions>
  15.                         </plugin>
  16.                         <plugin>
  17.                                 <groupId>com.spotify</groupId>
  18.                                 <artifactId>dockerfile-maven-plugin</artifactId>
  19.                                 <version>${version.dockerPlugin}</version>
  20.                                 <executions>
  21.                                         <execution>
  22.                                                 <id>default</id>
  23.                                                 <goals>
  24. <!--                                                        <goal>build</goal>-->
  25. <!--                                                        <goal>push</goal>-->
  26.                                                 </goals>
  27.                                         </execution>
  28.                                 </executions>
  29.                                 <configuration>
  30.                                         <repository>${project.groupId}/${project.artifactId}</repository>
  31.                                         <tag>${project.version}</tag>
  32.                                         <buildArgs>
  33.                                                 <JAR_FILE>${project.build.finalName}</JAR_FILE>
  34.                                         </buildArgs>
  35.                                         <dockerfile>Dockerfile</dockerfile>
  36.                                 </configuration>
  37.                         </plugin>
  38.                 </plugins>
  39.         </build>
复制代码
       我就屏蔽了<goals>中的2个<goal>。这个<goal>是干什么的呢?我的明白是Maven生命周期(对应标准命令)实验哪个docker的动作(就是构建、推送等)。我一个都不设置呢,意思就是在maven构建时,不要去直接实验docker的动作。这样就实现了开发职员在当地实验maven的标准命令时,不会去实验docker干系的变乱。
      那要想实验docker干系的动作呢?maven的命令又该怎么办?输入类似如下命令即可:
  1. mvn clean install dockerfile:build
复制代码
     末了一段命令“dockerfile:build”就是明白指定实验docker的动作。这个命令开发职员一般不会去实验,如果添加到Jenkins任务中。这样就实现了“开发不管、自动构建”的目的了。
     2.借助Jenkins创建自动构建镜像到1Panel

     前提:在这之前,已经安装了Jenkins和干系必要的插件,代码也已经提交到了代码库中(我们是局域网gitlab)。
     1)新建一个Jenkins任务

            

       在弹窗中输入任务名称,选择maven项目。

         2)进行Jenkins任务配置

           输入任务描述

    选择git的地址、git登录凭据、代码分支(默认是master,肯定要留意这里)

     构建勾选一个,并设置构建周期。这里的H/2 * * * *是2分钟构建一次,准确说是2分钟实验一次任务,从gitlab获代替码,有更新才实验构建。没有更新就不会构建。这个刚刚是我们想要的。比如:开发职员在当地测试可能会有多次修改,没有题目后将代码提交到代码库。提交到代码库的一般都是实现了新功能或者完成了bug、功能修改,这个时候自动构建到1Panel环境,是符合我们优雅的期望。

如果不知道怎么写日程表,可以点击右边的问号,看看下面的解释就明白了。如果还看不懂,自己单独去学习Cron表达式。

构建环境,就选择第一个,在构建前删除构建空间。
    

build节点设置实验命令为  clean install dockfile:build。这里不必要输入mvn 开头哈,要留意

      3)遇到的错误

  报错如下:     Caused by: com.spotify.docker.client.shaded.org.apache.http.conn.HttpHostConnectException: Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: no further information     
a.连接不到docker的构建服务,在Jenkins构建任务PreSteps中设置不见效

     我是这样是设置的,但是并不见效。


    怎么明白呢?重要是这里的windows命令与后续maven构建实验并不在一个进程之中,所以设置无效。就像开了2个bat窗口,第一个设置的变量,第二个bat窗口并不能获取到。是隔离的。我之前在Jenkins中测试过实验2个windows command等类似的情况。
      b.连接不到docker的构建服务,在操作系统中环境变量设置也不见效

     我头大,怎么去连接当地的docker构建了呢?哦!我忘记设置了DOCKER_HOST。我连接到服务器设置了系统的变量回来,还是同样的错误。怎么明白呢?Jenkins启动在先,操作系统变量设置在后,Jenkins估计不具备实时读取操作系统环境变量的功能,所以这种情况下还是失败了。估计重启是好使的。但是我不行重启呢!
     c.连接不到docker的构建服务,在Jenkins中环境变量见效了

     按照下面3个图片,实现了设置。



    实验就不报错了。关键内容如下:    
  1. [INFO] Step 1/6 : FROM docker.io/majiajue/jdk1.8
  2. [INFO]
  3. [INFO] Pulling from majiajue/jdk1.8
  4. [INFO] Digest: sha256:fc684fe12c95aac86ef506f5a2bc2ec8fa411cdf7f34165f51a0275076dedcb4
  5. [INFO] Status: Image is up to date for majiajue/jdk1.8:latest
  6. [INFO]  ---> 2be3cc30c33f
  7. [INFO] Step 2/6 : ENV ENV LC_ALL zh_CN.UTF-8
  8. [INFO]
  9. [INFO]  ---> Using cache
  10. [INFO]  ---> 30161b4581a1
  11. [INFO] Step 3/6 : ENV BASE_PATH=/usr/local/app/
  12. [INFO]
  13. [INFO]  ---> Using cache
  14. [INFO]  ---> be747d0679df
  15. [INFO] Step 4/6 : RUN mkdir -p ${BASE_PATH}
  16. [INFO]
  17. [INFO]  ---> Using cache
  18. [INFO]  ---> 7b513e464747
  19. [INFO] Step 5/6 : COPY target/elegant-docker.jar ${BASE_PATH}/hello-docker.jar
  20. [INFO]
  21. [INFO]  ---> 3e45fa23fd89
  22. [INFO] Step 6/6 : ENTRYPOINT java -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -jar ${BASE_PATH}/hello-docker.jar
  23. [INFO]
  24. [INFO]  ---> Running in 466a556c8aeb
  25. [INFO]  ---> Removed intermediate container 466a556c8aeb
  26. [INFO]  ---> 4fca4234ccf2
  27. [INFO] [Warning] One or more build-args [JAR_FILE] were not consumed
  28. [INFO] Successfully built 4fca4234ccf2
  29. [INFO] Successfully tagged cn.scantt/elegant-docker:0.0.1-SNAPSHOT
  30. [INFO]
  31. [INFO] Detected build of image with id 4fca4234ccf2
  32. [INFO] Building jar: C:\Users\Administrator\.jenkins\workspace\elegant-docker\target\elegant-docker-docker-info.jar
  33. [INFO] Successfully built cn.scantt/elegant-docker:0.0.1-SNAPSHOT
  34. [INFO] ------------------------------------------------------------------------
  35. [INFO] BUILD SUCCESS
复制代码
四.总结

    思路清晰,实现了我们的目的。过程固然遇到了题目,但都轻松的办理了。展开学习的就太多了,各人积极吧。比如Jenkins的安装及插件安装、gitlab环境搭建、git与开发工具的联合使用、maven生命周期与插件关系。盼望能资助到初学者!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宝塔山

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表