当前位置: 首页 > news >正文

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生命周期与插件关系。希望能帮助到初学者!

相关文章:

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

一.背景 在《maven项目容器化运行之1》中&#xff0c;我们开启了1Panel环境中docker构建服务给到了局域网。在《maven项目容器化运行之2》中&#xff0c;我们基本实现了maven工程创建、远程调用docker构建镜像、在1Panel选择镜像运行容器三大步骤。 但是&#xff0c;存在一个问…...

docker 打包orbbec

docker pull humble容器 sudo docker run -it osrf/ros:humble-desktop docker 启动容器 sudo docker run -u root --device/dev/bus/usb:/dev/bus/usb -it -v /home/wl:/share --name wl4 osrf/ros:humble-desktop /bin/bash新开一个终端 查看本地存在的容器&#xff1a;…...

无涯·问知财报解读,辅助更加明智的决策

财报解读就像是给公司做一次全面的体检&#xff0c;是理解公司内部运作机制和市场表现的一把钥匙&#xff0c;能够有效帮助投资者、分析师、管理层以及所有市场参与者判断一家公司的健康程度和发展潜力。 星环科技无涯问知的财经库内置了企业年报及财经类信息&#xff0c;并对…...

【Apache Doris】数据副本问题排查指南

【Apache Doris】数据副本问题排查指南 一、问题现象二、问题定位三、问题处理 本文主要分享Doris中数据副本异常的问题现象、问题定位以及如何处理此类问题。 一、问题现象 问题日志 查询报错 Failed to initialize storage reader, tablet{tablet_id}.xxx.xxx问题说明 查…...

【HarmonyOS】关于鸿蒙消息推送的心得体会(二)

【HarmonyOS】关于鸿蒙消息推送的心得体会&#xff08;二&#xff09; 前言 推送功能的开发与传统功能开发还是有很大区别。首先最大的区别点就在于需要多部门之间的协同&#xff0c;作为鸿蒙客户端开发&#xff0c;你需要和产品&#xff0c;运营&#xff0c;以及后台开发一起…...

零基础入门:创建一个简单的Python爬虫管理系统

摘要&#xff1a; 本文将手把手教你&#xff0c;从零开始构建一个简易的Python爬虫管理系统&#xff0c;无需编程基础&#xff0c;轻松掌握数据抓取技巧。通过实战演练&#xff0c;你将学会设置项目、编写基本爬虫代码、管理爬取任务与数据&#xff0c;为个人研究或企业需求奠…...

【Node.js基础04】node.js模块化

一&#xff1a;什么是模块化 在Node.js中&#xff0c;每个文件都可视为一个独立的模块。模块化提高了代码的复用性&#xff0c;按需加载&#xff0c;具有独立的作用域 二&#xff1a;如何实现多个文件间导入和导出 1 CommonJS标准&#xff08;默认&#xff09;-导入和导出 …...

数据库——单表查询

一、建立数据库mydb8_worker mysql> use mydb8_worker; 二、建立表 1.创建表 mysql> create table t_worker(department_id int(11) not null comment 部门号,-> worder_id int(11) primary key not null comment 职工号,-> worker_date date not null comment…...

dsa加训

refs: OI Wiki - OI Wiki (oi-wiki.org) 1. 枚举 POJ 2811 熄灯问题 refs : OpenJudge - 2811:熄灯问题 如果要枚举每个灯开或者不开的情况&#xff0c;总计2^30种情况&#xff0c;显然T。 不过我们可以发现&#xff1a;若第i行的某个灯亮了&#xff0c;那么有且仅有第i行和第…...

SpringBoot源码(1)ApplicationContext和BeanFactory

1、调用getBean方法 SpringBootApplication public class SpringBootDemoApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext SpringApplication.run(SpringBootDemoApplication.class, args);applicationContext.get…...

CANoe编程实例--TCP/IP通信

1、简介 本实例将使用目前常用的开发工具C#来开发服务器端&#xff0c;以CANoe端作为客户端。服务器端和客户端&#xff0c;通过TCP/IP连接&#xff0c;实现数据交换。 首先在服务器端建立一个监听Socket&#xff0c;自动创建一个监听线程&#xff0c;随时监听是否有客户端的连…...

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

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

【BUG】已解决:You are using pip version 10.0.1, however version 21.3.1 is available.

You are using pip version 10.0.1, however version 21.3.1 is available. 目录 You are using pip version 10.0.1, however version 21.3.1 is available. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…...

electron-builder打包vue2项目不显示element-ui图标

1、使用版本 vue ^2.6.14element-ui ^2.15.14vue-cli-plugin-electron-builder 2.1.1 2、解决办法 1&#xff09; 如果是简单的图标可以使用图片代替&#xff08;这种对于elementui组件的图标还是不会显示&#xff09; 2&#xff09;在vue.config.js配置 const { defineCon…...

controller层-请求格式为json-请求方法为get

前置条件 get请求映射&#xff0c;内容和PostMapping一致&#xff0c;需要请求参数更换为get数据 请求过程&#xff1a;用户请求--初始化DispatcherServlet及对接和分发用户请求--controller--service 用户请求&#xff1a;http://ip:port/user/getinfo 请求方法&#xff1a;ge…...

【Linux】网络通信基础:应用层协议、HTTP、序列化与会话管理

文章目录 前言1. 应用层自定义协议与序列化1.1 什么是应用层&#xff1f;1.2 再谈 "协议"1.3 序列化 和 反序列化 2. HTTP 协议3. 认识 URL(统一资源定位符)4. urlencode和urldecode5. HTTP 协议请求与响应格式5.1 HTTP 请求5.2 HTTP 响应 6. HTTP 的方法6.1 GET 方法…...

@NotNull、@NotEmpty 和 @NotBlank 区别

NotNull、NotEmpty 和 NotBlank 是 Java Bean Validation (JSR 380) 规范中定义的注解&#xff0c;通常用于验证对象的属性是否满足特定的条件。这些注解常用于后端验证&#xff0c;确保接收到的数据符合预期。 NotNull 用途&#xff1a;验证一个对象是否不为null。 注意&#…...

大模型应用—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…...

在 Qt 中获取 MouseMove 事件

在编写 Qt 程序时&#xff0c;我希望在鼠标移动时&#xff08;即使鼠标在另一个窗口上&#xff09;能够调用 mouseMoveEvent(QMouseEvent* event) 方法。目前&#xff0c;在我的 mainwindow.cpp 文件中&#xff0c;我有如下代码&#xff1a; void MainWindow::mouseMoveEvent(…...

自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍

自动驾驶系列—智能巡航辅助功能中的车道中央保持功能介绍 自动驾驶系列—智能巡航辅助功能中的车道变换功能介绍 自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍 自动驾驶系列—智能巡航辅助功能中的路口通行功能介绍 文章目录 2. 功能定义3. 功能原理4. 传感器架构5. 实…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...