A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战

  • 服务容器化构建的环境配置
  • 构建前需要解决什么
  • 下面我们带着问题分析构建的过程:
    • 1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?
    • 2. 构建之前动态修改项目的环境变量
    • 3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服务器磁盘暴满,导致资源浪费。此时我们在构建之前也要执行不可用的镜像清除操作;
    • 4. 本地LLama大模型服务地址,如何以容器部署时作为参数传入?
    • 5. 单工程服务和多工程服务如何合并成一个构建方案?
    • 6. 服务构建重复性校验
    • 7. 构建本次服务的镜像
    • 8. 缓存签名信息
  • 构建服务的完整脚本(build.sh)
  • 介绍了脚本构建的执行过程,下面jenkins端是如何进行配置的
  • 构建成功会在harbor仓库中显示相应的产物
  • 总结

下面我们接着上一篇文章《A6.Springboot-LLama3.2服务自动化构建(三)——编写Pipeline构建仓库初始化脚本》继续往下分析,编写Pipeline构建脚本。

服务容器化构建的环境配置

  1. 准备平台
    • 容器私有仓库Harbor的账号与密码,Harbor的安装与部署请参考我前面的文章《Harbor容器镜像私有仓库部署(For Liunx)》
  2. 构建主机
    • 安装xmlstarlet、jq工具;
      #主要用于项目的pom.xml文件解析
      apt install xmlstarlet
      #主要用于harbor仓库检测镜像时返回json数据的解析
      apt install jq
      
    • Docker容器管理工具安装,这个可以参考我前面的文章《Liunx安装Docker容器化管理工具(记录篇)》
  3. 部署主机
    • Docker容器管理工具安装,这个可以参考我前面的文章《Liunx安装Docker容器化管理工具(记录篇)》

构建前需要解决什么

  • 本地LLama大模型服务地址,如何以容器部署时作为参数传入?
  • 单工程服务和多工程服务如何合并成一个构建方案?
  • 如何解决jenkins执行环境与shell脚本执行环境不一致问题?
  • 构建成功后如何将容器上传到harbor镜像仓库中?

下面我们带着问题分析构建的过程:

1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?

在jenkins构建过程中由于平台用户环境与sh脚本执行环境不是同一个权限,为了解决这个问题网上有些解决方案说将当前用户添加到Admin Group当中,还有些通过安装SSH plugin登录到远程主机来执行来解决脚本调度过程中的权限问题。这里我们通过在Pipeline使用证书远程登录到相应的主机再执行相应逻辑:

def remote = [:]
remote.name = "${BUILD_HOST}"
remote.host = "${BUILD_HOST}"
remote.port = Integer.parseInt("${BUILD_PORT}")
remote.allowAnyHosts = true
withCredentials([sshUserPrivateKey(credentialsId: "${DEPLOY_HOST_CREDENTIALS_ID}", keyFileVariable: 'identity', usernameVariable: 'username')]) {remote.user = usernameremote.identityFile = identitysshCommand remote: remote, command: "/bin/bash 这里执行你的远程脚本"
}

2. 构建之前动态修改项目的环境变量

利用xmlstarlet动态修改项目pom.xml中的环境变量配置

<properties><!--dev:开发环境;test:测试环境;pre:预发环境;prod:正式环境;--><project.env.tag>dev</project.env.tag>
</properties>
#其中project_dir为项目根目录,jenkins脚本配置中传入
$(xmlstarlet ed --inplace -N ns=http://maven.apache.org/POM/4.0.0 -u "/ns:project/ns:properties/ns:project.env.tag" -v "$env" "$project_dir/pom.xml")

只要替换pom.xml中配置的值,在application.yml我们就可以通过@project.env.tag@方式来获取;

spring:profiles:active: @project.env.tag@

3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服务器磁盘暴满,导致资源浪费。此时我们在构建之前也要执行不可用的镜像清除操作;

docker image prune -a --force

4. 本地LLama大模型服务地址,如何以容器部署时作为参数传入?

有时我们在部署某些docker容器时直接传入一些环境变量来达到相应参数的赋值。那么在我们开发的服务当中,如果打包成docker镜像也实现两样的效果应该怎么去配置呢,继续往下看阐述具体的步骤。

在Springboot服务配置文件application.yml中添加自定义配置(这里以llama主机地址为例)

llama:service:host: ${LLAMA_HOST:@llama.host@}

在这里插入图片描述
根据结构原理分析打包镜像后,我们只要在docker run之后添加-e LLAMA_HOST=xxx变量即可实现将参数值赋值到程序内部对应的配置中。

5. 单工程服务和多工程服务如何合并成一个构建方案?

配置jenkins服务构建时,我们希望无论是单工程形式还是多工程模块服务形式,脚本构建的过程是同一段打包逻辑。基于这一点考虑,是否只要将要打包的服务名放入一个数组中,然后循环依次构建对应的服务,这样无论是父工程方式还是单工程方式就不受影响了。

在项目中新建servers.sh来定义要构建的服务集合

#!/bin/bash
declare -a service_array
service_array=("ey-gateway" "ey-device")

在脚本中偏历service_array依次构建服务

#导入项目定义的数组,project_dir为项目根目录
source "${project_dir}/servers.sh"
for service in "${service_array[@]}"; do#移除每个服务对应的前缀作为构建服务名last_element=$(echo "$service" | cut -d'-' -f2-)#这里处理每个服务的构建逻辑
done

6. 服务构建重复性校验

当项目在迭代的过程开发人员每提交一个小版本以及测试工程师需要功能测试、单元测试和集成测试等,每个小间段都需要进行打包,构建次数会非常频繁。大部分情况测试人员需要构建项目时,往往是项目配置或代码逻辑没做任何改动的,难道jenkins在构建服务镜像时每次都需要重新构建会不会显得资源有点浪费(或者说是无意义构建)。那么有没有办法解决呢,即开发人员提交更改后执行打包才重新构建,如果没有做任何更改或项目版本号没有发生任务变量执行打包不重新构建延用原有的镜像。下面我们来看一下具体的实现部分:

首先需要创建校验签名文件,用于记录上一次构建的镜像签名值、版本号、镜像服务名等信息;在下次构建时作为比较的相关维度

#在上一步for循环前定义签名文件存储路径,以便之后的信息写入
#organization:组织机构名称,主要在harbor镜像仓库中用于区分不同公司或不同项目构建的服务,该参数值由jenkins平台端传入
build_sign_file=".${organization}_build_sign_config.ini"
for service in "${service_array[@]}"; do#这里处理每个服务的构建逻辑
done

取出当前服务的md5与上一次签名进行比较是否一致,如果不一致则进行构建动作,否则进行下一个条件判断

#通过服务的几个指标,计算出服务md5值:服务根目录下所有文件、服务iml后缀文件、如果存在HELP.md如果发生改变、如果存在mvn后缀文件且有发生改变、如果存在mvnw文件且有发生改变,根据这些指标重新计算md5值并写入到md5sums.txt文件中
find "$service" -type f -print0 | grep -vFz "$project_dir/$service/$service.iml" | grep -vFz "$project_dir/$service/HELP.md" | grep -vFz "$project_dir/$service/.mvn" | grep -vFz "$project_dir/$service/mvnw" | xargs -0 md5sum >md5sums.txt#取出md5sums.txt文件中的md5值
current_md5=$(awk '{print $1}' md5sums.txt | sort | md5sum)#将md5去掉连接符,作为当前要构建的服务签名值
current_environment_md5=$(tr -d ' -' <<<"$current_md5")#当前我们得到签名值后,将md5sums.txt临时文件移除
rm -rf md5sums.txt#如果首次执行或本地签名缓存文件不存在需要创建它
if [[ ! -f "$user_dir/${build_sign_file}" ]]; thentouch "$user_dir/${build_sign_file}"
fi#从签名文件中取出上一次构建对应服务的签名值,其中JENKINS_DEPLOY_HOME为环境变量值,即脚本根目录
#$user_dir/${build_sign_file}:表示将签名文件存储在用户目录下
#${service}_${env}_md5:以服务名称+环境+md5作为key存储
#其中kvs.py为python实现的操作本地文件的key=value类型的文件数据
old_environment_md5=$(python3 "${JENKINS_DEPLOY_HOME}/kvs.py" "take" "$user_dir/${build_sign_file}" "${service}_${env}_md5")

根据服务从harbor镜像仓库中查找一下看是否存在,如果不存在则进行构建动作,否则进行下一个条件判断

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

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

相关文章

一个简单的自适应html5导航模板

一个简单的 HTML 导航模板示例&#xff0c;它包含基本的导航栏结构&#xff0c;同时使用了 CSS 进行样式美化&#xff0c;让导航栏看起来更美观。另外&#xff0c;还添加了一些 JavaScript 代码&#xff0c;用于在移动端实现导航菜单的展开和收起功能。 PHP <!DOCTYPE htm…

Winform如何取消叉号,减号和放大(两种)

方法一: 找到窗体属性 MaximizeBoxFalse; MinimizeBoxFalse; ControlBoxFALSE; 方法二: 点击Form 在From里面找到Form-Closing 这个事件 写入 if(e.CloseReasonCloseReason.UserClosing) { MessageBox.Show("对不起,你不能关闭") e.Cancel true; }

OpenCV:开运算

目录 1. 简述 2. 用腐蚀和膨胀实现开运算 2.1 代码示例 2.2 运行结果 3. 开运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 开运算应用场景 5. 注意事项 6. 总结 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 OpenCV&#xff1a;闭运算-CSDN博客 …

MIMIC-IV数据部署(博主较忙,缓慢更新)

1. 用到的数据准备 在下面的网站&#xff0c;注册、申请、推荐人从邮箱里帮忙确认。 通过后&#xff0c;拉到页面的最下面。把那个将近10个G的文件给下载下来。 可以在晚上睡觉的时候下载&#xff0c;第二天早上起来“收数据”。 MIMIC-IV v3.1 2. 用到的软件准备 7-zip …

二叉树-堆(补充)

二叉树-堆 1.二叉树的基本特性2.堆2.1.堆的基本概念2.2.堆的实现2.2.1.基本结构2.2.2.堆的初始化2.2.3.堆的销毁2.2.4.堆的插入2.2.5.取出堆顶的数据2.2.6.堆的删除2.2.7.堆的判空2.2.8.堆的数据个数2.2.9.交换2.2.10.打印堆数据2.2.11.堆的创建2.2.12.堆排序2.2.13.完整代码 3…

省市区三级联动

引言 在网页中&#xff0c;经常会遇到需要用户选择地区的场景&#xff0c;如注册表单、地址填写等。为了提供更好的用户体验&#xff0c;我们可以实现一个三级联动的地区选择器&#xff0c;让用户依次选择省份、城市和地区。 效果展示&#xff1a; 只有先选择省份后才可以选择…

【数据结构】动态内存管理函数

动态内存管理 为什么存在动态内存管理动态内存函数的介绍&#x1f38a;malloc补充&#xff1a;perror函数&#x1f38a;free&#x1f38a;calloc&#x1f38a;realloc 常见动态内存错误对空指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一…

【xcode 16.2】升级xcode后mac端flutter版的sentry报错

sentry_flutter 7.11.0 报错 3 errors in SentryCrashMonitor_CPPException with the errors No type named terminate_handler in namespace std (line 60) and No member named set_terminate in namespace std 替换sentry_flutter版本为&#xff1a; 8.3.0 从而保证oc的…

Julius AI 人工智能数据分析工具介绍

Julius AI 是一款由 Casera Labs 开发的人工智能数据分析工具&#xff0c;旨在通过自然语言交互和强大的算法能力&#xff0c;帮助用户快速分析和可视化复杂数据。这款工具特别适合没有数据科学背景的用户&#xff0c;使数据分析变得简单高效。 核心功能 自然语言交互&#x…

智慧园区系统集成解决方案构建智能管理新模式与发展蓝图

内容概要 在当今快速发展的科技环境中&#xff0c;智慧园区系统集成解决方案为园区的管理和运营提供了一种全新的思路。这种解决方案通过集合先进的核心技术&#xff0c;帮助各种园区实现智能化管理&#xff0c;从而提高运营效率。对于工业园、产业园、物流园、写字楼乃至公寓…

AI软件外包需要注意什么 外包开发AI软件的关键因素是什么 如何选择AI外包开发语言

1. 定义目标与需求 首先&#xff0c;要明确你希望AI智能体做什么。是自动化任务、数据分析、自然语言处理&#xff0c;还是其他功能&#xff1f;明确目标可以帮助你选择合适的技术和方法。 2. 选择开发平台与工具 开发AI智能体的软件时&#xff0c;你需要选择适合的编程语言、…

设计模式面试题

一、工厂方法模式: 1.简单工厂模式: (1).抽象产品:定义了产品的规范&#xff0c;描述了产品的主要特性和功能 (2).具体产品:实现或继承抽象产品的子类 (3).具体工厂:提供了创建产品的方法&#xff0c;调用者通过该方法来获取产品 所有产品都共有一个工厂&#xff0c;如果新…

【ESP32】ESP-IDF开发 | WiFi开发 | UDP用户数据报协议 + UDP客户端和服务器例程

1. 简介 UDP协议&#xff08;User Datagram Protocol&#xff09;&#xff0c;全称用户数据报协议&#xff0c;它是一种面向非连接的协议&#xff0c;面向非连接指的是在正式通信前不必与对方先建立连接&#xff0c; 不管对方状态就直接发送。至于对方是否可以接收到这些数据内…

react native在windows环境搭建并使用脚手架新建工程

截止到2024-1-11&#xff0c;使用的主要软件的版本如下&#xff1a; 软件实体版本react-native0.77.0react18.3.1react-native-community/cli15.0.1Android Studio2022.3.1 Patch3Android SDKAndroid SDK Platform 34 35Android SDKAndroid SDK Tools 34 35Android SDKIntel x…

浅析百度AOI数据与高德AOI数据的差异性

目录 前言 一、AOI属性数据 1、百度AOI数据 2、高德AOI数据 二、AOI矢量边界 1、百度AOI空间范围 2、高德AOI空间范围 三、数据获取频次和难易程度 1、接口限制 2、数据转换成本 四、总结 前言 在当今数字化时代&#xff0c;地理信息数据的精准性和丰富性对于城市规划…

window中80端口被占用问题

1&#xff0c;查看报错信息 可以看到在启动项目的时候&#xff0c;8081端口被占用了&#xff0c;导致项目无法启动。 2&#xff0c;查看被占用端口的pid #语法 netstat -aon|findstr :被占用端口#示例 netstat -aon|findstr :8080 3&#xff0c;杀死进程 #语法 taikkill /pid…

DeepSeek--通向通用人工智能的深度探索者

一、词源与全称 “DeepSeek"由"Deep”&#xff08;深度&#xff09;与"Seek"&#xff08;探索&#xff09;组合而成&#xff0c;中文译名为"深度求索"。其全称为"深度求索人工智能基础技术研究有限公司"&#xff0c;英文对应"De…

【学习笔记】计算机网络(二)

第2章 物理层 文章目录 第2章 物理层2.1物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.2 有关信道的几个基本概念2.2.3 信道的极限容量 2.3物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 2.4 信道复用技术2.4.1 频分复用、时分复用和…

RK3588平台开发系列讲解(ARM篇)ARM64底层中断处理

文章目录 一、异常级别二、异常分类2.1、同步异常2.2、异步异常三、中断向量表沉淀、分享、成长,让自己和他人都能有所收获!😄 一、异常级别 ARM64处理器确实定义了4个异常级别(Exception Levels, EL),分别是EL0到EL3。这些级别用于管理处理器的特权级别和权限,级别越高…

BOM对象location与数组操作结合——查询串提取案例

BOM对象location与数组操作结合——查询串提取案例 前置知识 1. Location 对象 Location 对象是 JavaScript 提供的内置对象之一&#xff0c;它表示当前窗口或框架的 URL&#xff0c;并允许你通过它操作或获取 URL 的信息。可以通过 window.location 访问。 主要属性&#…