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.mzph.cn/pingmian/68408.shtml

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

相关文章

浅谈文献阅读(reference)对留学论文写作的重要性

很多留学生在写作留学论文时&#xff0c;拿到题目后就急于求成立马动笔写作。可是写着写着就会陷入非常迷惘的境地&#xff0c;不知道如何继续。当然这其中有很多原因&#xff0c;但其中最重要的一条&#xff0c;就是在写作英语论文之前&#xff0c;没有进行足够的知识积累&…

提升企业内部协作的在线知识库架构与实施策略

内容概要 在当前快速变化的商业环境中&#xff0c;企业对于提升内部协作效率的需求愈显迫切。在线知识库作为信息存储与共享的平台&#xff0c;成为了推动企业数字化转型的重要工具。本文将深入探讨如何有效打造与实施在线知识库&#xff0c;强调架构设计、知识资产分类管理及…

网络工程师 (3)指令系统基础

一、寻址方式 &#xff08;一&#xff09;指令寻址 顺序寻址&#xff1a;通过程序计数器&#xff08;PC&#xff09;加1&#xff0c;自动形成下一条指令的地址。这是计算机中最基本、最常用的寻址方式。 跳跃寻址&#xff1a;通过转移类指令直接或间接给出下一条指令的地址。跳…

【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参

目录 1. 第一版代码 2. 第二版代码 3. 第三版代码 前文已介绍无头单向不循环链表的实现&#xff0c;详见下文&#xff1a; 【数据结构】_不带头非循环单向链表-CSDN博客 但对于部分方法如尾插、头插、任意位置前插入、任意位置前删除的相关实现&#xff0c;其形参均采用了…

【Samba】Ubuntu20.04 Windows 共享文件夹

【Samba】Ubuntu20.04 Windows 共享文件夹 前言整体思路检查 Ubuntu 端 和 Windows 网络通信是否正常创建共享文件夹安装并配置 Samba 服务器安装 Samba 服务器创建 Samba 用户编辑 Samba 配置文件重启 Samba 服务器 在 Windows 端 访问 Ubuntu 的共享文件夹 前言 本文基于 Ub…

Linux初识——基本指令(2)

本文将继续从上篇末尾讲起&#xff0c;讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move&#xff08;移动&#xff09;的缩写&#xff0c;其功能为&#xff1a;1.剪切文件、目录。2.重命名 先演示下重命名&#xff0c;假设我想把当前目录下的di34改成dir5 那…

Android - 通过Logcat Manager简单获取Android手机的Log

由于工作需要&#xff0c;经常需要获取Android手机的Log。 平常都是通过adb命令来获取&#xff0c;每次都要写命令。 偶然的一个机会&#xff0c;我从外网发现了一个工具 Logcat Manager&#xff0c;只需要通过简单的双击即可获取Android的Log&#xff0c;这里也分享一下。 目…

c++学习第十三天

创作过程中难免有不足&#xff0c;若您发现本文内容有误&#xff0c;恳请不吝赐教。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、vector 1.介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空…

「数学::质数」分解质因子 / LeetCode 2521(C++)

概述 由算数基本定理&#xff0c;我们知道任意一个大于1的自然数可以表示为一些质数的乘积&#xff1a; LeetCode 2521&#xff1a; 给你一个正整数数组 nums &#xff0c;对 nums 所有元素求积之后&#xff0c;找出并返回乘积中 不同质因数 的数目。 注意&#xff1a; 质数 是…

docker-compose Zookeeper 集群搭建

文章目录 前言docker-compose Zookeeper 集群搭建1. Zookeeper下载2. 制作Dockerfile文件3. 构建镜像4. docker-compose 管理5. docker-compose构建/启动6. 验证6.1 docker ps6.2 使用 zkCli.sh 连接并验证集群 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0…

WIN11 UEFI漏洞被发现, 可以绕过安全启动机制

近日&#xff0c;一个新的UEFI漏洞被发现&#xff0c;可通过多个系统恢复工具传播&#xff0c;微软已经正式将该漏洞标记为追踪编号“CVE-2024-7344”。根据报告的说明&#xff0c;该漏洞能让攻击者绕过安全启动机制&#xff0c;并部署对操作系统隐形的引导工具包。 据TomsH…

R语言学习笔记之高效数据操作

一、概要 数据操作是R语言的一大优势&#xff0c;用户可以利用基本包或者拓展包在R语言中进行复杂的数据操作&#xff0c;包括排序、更新、分组汇总等。R数据操作包&#xff1a;data.table和tidyfst两个扩展包。 data.table是当前R中处理数据最快的工具&#xff0c;可以实现快…

【数据结构】 并查集 + 路径压缩与按秩合并 python

目录 前言模板朴素实现路径压缩按秩合并按树高为秩按节点数为秩 总结 前言 并查集的基本实现通常使用森林来表示不同的集合&#xff0c;每个集合用一棵树表示&#xff0c;树的每个节点有一个指向其父节点的指针。 如果一个节点是它自己的父节点&#xff0c;那么它就是该集合的代…

低代码系统-产品架构案例介绍、得帆云(八)

产品名称 得帆云DeCode低代码平台-私有化 得帆云DeMDM主数据管理平台 得帆云DeCode低代码平台-公有云 得帆云DePortal企业门户 得帆云DeFusion融合集成平台 得帆云DeHoop数据中台 名词 概念 云原生 指自己搭建的运维平台&#xff0c;区别于阿里云、腾讯云 Dehoop 指…

【PyTorch】5.张量索引操作

目录 1. 简单行、列索引 2. 列表索引 3. 范围索引 4. 布尔索引 5. 多维索引 个人主页&#xff1a;Icomi 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为…

基于微信小程序高校课堂教学管理系统 课堂管理系统微信小程序(源码+文档)

目录 一.研究目的 二.需求分析 三.数据库设计 四.系统页面展示 五.免费源码获取 一.研究目的 困扰管理层的许多问题当中,高校课堂教学管理也是不敢忽视的一块。但是管理好高校课堂教学又面临很多麻烦需要解决,如何在工作琐碎,记录繁多的情况下将高校课堂教学的当前情况反…

论文阅读笔记:VMamba: Visual State Space Model

论文阅读笔记&#xff1a;VMamba: Visual State Space Model 1 背景2 创新点3 方法4 模块4.1 2D选择性扫描模块&#xff08;SS2D&#xff09;4.2 加速VMamba 5 效果5.1 和SOTA方法对比5.2 SS2D和自注意力5.3 有效感受野5.4 扫描模式 论文&#xff1a;https://arxiv.org/pdf/240…

【文星索引】搜索引擎项目测试报告

目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…

DBO-高斯回归预测matlab

蜣螂优化算法(Dung Beetle Optimizer, DBO)是一种新型的群智能优化算法&#xff0c;在2022年底提出&#xff0c;主要是受蜣螂的的滚球、跳舞、觅食、偷窃和繁殖行为的启发。 本次研究使用的是 Excel 格式的股票预测数据。数据集按照 8&#xff1a;1&#xff1a;1 的比例&#x…

java后端之事务管理

Transactional注解&#xff1a;作用于业务层的方法、类、接口上&#xff0c;将当前方法交给spring进行事务管理&#xff0c;执行前开启事务&#xff0c;成功执行则提交事务&#xff0c;执行异常回滚事务 spring事务管理日志&#xff1a; 默认情况下&#xff0c;只有出现Runti…