maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程docker构建服务并在1Panel中运行

一.背景

        在《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插件设置     

	<build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.6.6</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin><plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>${version.dockerPlugin}</version><executions><execution><id>default</id><goals>
<!--							<goal>build</goal>-->
<!--							<goal>push</goal>--></goals></execution></executions><configuration><repository>${project.groupId}/${project.artifactId}</repository><tag>${project.version}</tag><buildArgs><JAR_FILE>${project.build.finalName}</JAR_FILE></buildArgs><dockerfile>Dockerfile</dockerfile></configuration></plugin></plugins></build>

       我就屏蔽了<goals>中的2个<goal>。这个<goal>是干什么的呢?我的理解是Maven生命周期(对应标准命令)执行哪个docker的动作(就是构建、推送等)。我一个都不设置呢,意思就是在maven构建时,不要去直接执行docker的动作。这样就实现了开发人员在本地执行maven的标准命令时,不会去执行docker相关的事情。

      那要想执行docker相关的动作呢?maven的命令又该怎么办?输入类似如下命令即可:

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个图片,实现了设置。

    执行就不报错了。关键内容如下:    

[INFO] Step 1/6 : FROM docker.io/majiajue/jdk1.8
[INFO] 
[INFO] Pulling from majiajue/jdk1.8
[INFO] Digest: sha256:fc684fe12c95aac86ef506f5a2bc2ec8fa411cdf7f34165f51a0275076dedcb4
[INFO] Status: Image is up to date for majiajue/jdk1.8:latest
[INFO]  ---> 2be3cc30c33f
[INFO] Step 2/6 : ENV ENV LC_ALL zh_CN.UTF-8
[INFO] 
[INFO]  ---> Using cache
[INFO]  ---> 30161b4581a1
[INFO] Step 3/6 : ENV BASE_PATH=/usr/local/app/
[INFO] 
[INFO]  ---> Using cache
[INFO]  ---> be747d0679df
[INFO] Step 4/6 : RUN mkdir -p ${BASE_PATH}
[INFO] 
[INFO]  ---> Using cache
[INFO]  ---> 7b513e464747
[INFO] Step 5/6 : COPY target/elegant-docker.jar ${BASE_PATH}/hello-docker.jar
[INFO] 
[INFO]  ---> 3e45fa23fd89
[INFO] Step 6/6 : ENTRYPOINT java -Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 -jar ${BASE_PATH}/hello-docker.jar
[INFO] 
[INFO]  ---> Running in 466a556c8aeb
[INFO]  ---> Removed intermediate container 466a556c8aeb
[INFO]  ---> 4fca4234ccf2
[INFO] [Warning] One or more build-args [JAR_FILE] were not consumed
[INFO] Successfully built 4fca4234ccf2
[INFO] Successfully tagged cn.scantt/elegant-docker:0.0.1-SNAPSHOT
[INFO] 
[INFO] Detected build of image with id 4fca4234ccf2
[INFO] Building jar: C:\Users\Administrator\.jenkins\workspace\elegant-docker\target\elegant-docker-docker-info.jar
[INFO] Successfully built cn.scantt/elegant-docker:0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

四.总结

    思路清晰,实现了我们的目标。过程虽然遇到了问题,但都轻松的解决了。展开学习的就太多了,大家努力吧。比如Jenkins的安装及插件安装、gitlab环境搭建、git与开发工具的结合使用、maven生命周期与插件关系。希望能帮助到初学者!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/49872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第23天 | CycleGAN图像风格迁移互换

昇思25天学习打卡营第23天 | CycleGAN图像风格迁移互换 文章目录 昇思25天学习打卡营第23天 | CycleGAN图像风格迁移互换CycleGAN模型模型结构循环一致损失函数 数据集数据下载创建数据集 网络构建生成器判别器损失函数和优化器前向计算梯度计算与反向传播 总结打卡 CycleGAN模…

【办公软件】Office 2019以上版本PPT 做平滑切换

Office2019以上版本可以在切页面时做平滑切换&#xff0c;做到一些简单的动画效果。如下在快捷菜单栏中的切换里选择平滑。 比如&#xff0c;在两页PPT中&#xff0c;使用同一个形状对象&#xff0c;修改了大小和颜色。 选择切换为平滑后&#xff0c;可以完成如下的动画显示。 …

java-poi实现excel自定义注解生成数据并导出

因为项目很多地方需要使用导出数据excel的功能&#xff0c;所以开发了一个简易的统一生成导出方法。 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version…

数学基础 -- 分段函数的导数

分段函数的导数 分段函数的导数是指分段函数在每一段上的导数情况&#xff0c;以及在分段点上的导数情况。具体可以通过以下步骤进行计算&#xff1a; 确定分段函数的定义&#xff1a;首先明确分段函数的每一段的表达式和对应的区间。 逐段求导&#xff1a;在每个区间内&…

【TortoiseGit】合并单个commit(提交)到指定分支上

0、前言 当我们用Git的时候经常用到多个分支&#xff0c;会经常有如下情况&#xff1a;一个dev分支下面会有多个test分支&#xff0c;而每个test分支由不同的开发者。而我们会有这样的需求&#xff1a; 当某个test分支完成了相应功能验证&#xff0c;就要把成功验证的功能代码…

智能卡芯片载带条带AOI外观检测设备及系统

智能卡及其芯片载带简介 我国智能卡产业的发展始于1993年的“金卡工程”&#xff0c;它是一项把货币电子化&#xff0c;运用芯片技术来搭载电子货币应用&#xff0c;运用互联网技术建立从发行到受理的电子货币系统&#xff0c;以提高社会运作效率&#xff0c;方便人们工作生活为…

多角度解析高防CDN防御DDOS及CC攻击

网络攻击的形式也日益多样化&#xff0c;其中DDoS&#xff08;分布式拒绝服务&#xff09;和CC&#xff08;Challenge Collapsar&#xff09;攻击尤为突出&#xff0c;给网站和企业带来了巨大的安全威胁。高防CDN&#xff08;Content Delivery Network&#xff09;作为一种专业…

Mac m1安装 MongoDB 7.0.12

一、下载MongoDB MongoDB 社区版官网下载 二、安装配置MongoDB 1.解压下载的压缩包文件&#xff0c;文件夹重命名为mongodb; 2.将重命名为mongodb的文件夹&#xff0c;放在/usr/local 目录下 3.在/usr/local/mongodb 目录下&#xff0c;新建data 和 log这两个文件夹&#…

09-optee内核-线程处理

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】TEE从入门到精通-[目录] 👈👈👈线程处理 OP-TEE内核使用几个线程来支持在 并行(未完全启用!有用于不同目的的处理程序。在thread.c中,您将找到一个名为…

Flutter开发Dart 中的 mixin、extends 和 implements

目录 ​​​​​​​前言 1.extends 2.implements 3.mixin 前言 在 Dart 中&#xff0c;mixin、extends 和 implements 是面向对象编程中常用的关键字&#xff0c;它们分别用于不同的继承和实现方式。理解它们的用法和区别对于编写高质量、可维护的 Dart 代码至关重要。本文…

使用内网穿透工具 frp 发布内网 web 站点

使用内网穿透工具 frp 发布内网 web 站点 文章目录 使用内网穿透工具 frp 发布内网 web 站点一、基础环境二、适用场景三、过程和方法四、参考资料 版权声明&#xff1a;本文为CSDN博主「杨群」的原创文章&#xff0c;遵循 CC 4.0 BY-SA版权协议&#xff0c;于2024年7月20日首…

MySQL练手 --- 1251. 平均售价

题目链接&#xff1a;1251. 平均售价 思路&#xff1a; 由题意可知&#xff0c;Prices表和UnitsSold表&#xff0c;表的连接关系为一对一&#xff0c;连接字段&#xff08;匹配字段&#xff09;为product_id 要求&#xff1a;查找每种产品的平均售价。而Prices表含有价格还有…

【简历】吉林某一本大学:JAVA秋招简历指导,简历通过率比较低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份吉林某一本大学25届计算机专业同学的Java简历。因为学校是一本&#xff0c;所以求职目标以中厂为主。因为学校背景在中厂是正常…

MySQL查询优化:提升数据库性能的策略

在数据库管理和应用中&#xff0c;优化查询是提高MySQL数据库性能的关键环节。随着数据量的不断增长&#xff0c;如何高效地检索和处理数据成为了一个重要的挑战。本文将介绍一系列优化MySQL查询的策略&#xff0c;帮助开发者和管理员提升数据库的性能。 案例1: 使用索引优化查…

Oracle(21)什么是聚集索引和非聚集索引?

在数据库管理系统中&#xff0c;索引是一种用于加速数据检索的结构。主要有两种类型的索引&#xff1a;聚集索引&#xff08;Clustered Index&#xff09;和非聚集索引&#xff08;Non-Clustered Index&#xff09;。它们在数据存储和检索方面有不同的实现和用途。 聚集索引&a…

自学YOLO前置知识

YOLO前置知识 学习YOLO&#xff08;You Only Look Once&#xff09;之前&#xff0c;掌握一些前置知识会帮助你更好地理解和应用该技术。以下是一些推荐的前置知识领域&#xff1a; 计算机视觉基础&#xff1a; 图像处理&#xff1a;了解图像的基本处理技术&#xff0c;如滤波…

【Linux】gcc简介+编译过程

gcc是Linux系统下一款专门针对于C语言的代码编译软件。g则是Linux下针对于CPP语言的代码编译软件&#xff0c;实际上g底层也大量用了gcc代码。 目录 1.gcc基本认识与安装2.gcc编译过程2.1编译 和 链接2.2编译步骤形成的原因2.3编译器的自举2.4链接 1.gcc基本认识与安装 gcc是一…

Neuron协议网关的北向应用插件开发

目录 概述 指令处理层开发​ 应用层开发​ .open​ .close​ .init​ .uninit​ .start​ .stop​ .setting​ .request​ 插件设置文件​ 适配华为的思路 概述 最近研究了一段时间的Neuron协议网关&#xff0c;前面的博文也提到它虽然能够把数据发到华为的IoT平台上…

Adobe国际认证详解-从零开始学做视频剪辑

从零开始学做视频剪辑&#xff0c;是许多初学者面临的挑战。在这个数字媒体时代&#xff0c;视频剪辑已经成为一种重要的技能&#xff0c;无论是个人爱好还是职业发展&#xff0c;掌握视频剪辑技能都是非常有价值的。 视频剪辑&#xff0c;简称“剪辑”&#xff0c;是视频制作过…

高三了,无计算机基础能学计算机吗?

高三阶段学习计算机编程是完全可行的&#xff0c;即使你没有任何计算机基础。我收集制作一份C语言学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向&#xff0c;包括了编程教学&#xff0c;数据处理&#xff0c;通信处理&#xff0c;技…