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

news2025/1/30 15:23:07

  • 服务容器化构建的环境配置
  • 构建前需要解决什么
  • 下面我们带着问题分析构建的过程:
    • 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 = username
    remote.identityFile = identity
    sshCommand 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}" ]]; then
    touch "$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.coloradmin.cn/o/2284732.html

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

相关文章

66-《虞美人》

虞美人 虞美人&#xff08;学名&#xff1a;Papaver rhoeas L.&#xff09;&#xff1a;一年生草本植物&#xff0c;全体被伸展的刚毛&#xff0c;稀无毛。茎直立&#xff0c;高25-90厘米&#xff0c;具分枝。叶片轮廓披针形或狭卵形&#xff0c;羽状分裂&#xff0c;裂片披针形…

obsidian插件——Metadata Hider

原本是要找导出图片时显示属性的插件&#xff0c;奈何还没找到&#xff0c;反而找到了可以隐藏属性的插件。唉&#xff0c;人生不如意&#xff0c;十之八九。 说一下功能&#xff1a; 这个插件可以把obsidian的文档属性放在右侧显示&#xff0c;或者决定只显示具体几项属性&a…

特种作业操作之低压电工考试真题

1.下面&#xff08; &#xff09;属于顺磁性材料。 A. 铜 B. 水 C. 空气 答案&#xff1a;C 2.事故照明一般采用&#xff08; &#xff09;。 A. 日光灯 B. 白炽灯 C. 压汞灯 答案&#xff1a;B 3.人体同时接触带电设备或线路中的两相导体时&#xff0c;电流从一相通过人体流…

[免费]基于Python的Django博客系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的Django博客系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展&#xff0c;信息的传播与…

进程池的制作(linux进程间通信,匿名管道... ...)

目录 一、进程间通信的理解 1.为什么进程间要通信 2.如何进行通信 二、匿名管道 1.管道的理解 2.匿名管道的使用 3.管道的五种特性 4.管道的四种通信情况 5.管道缓冲区容量 三、进程池 1.进程池的理解 2.进程池的制作 四、源码 1.ProcessPool.hpp 2.Task.hpp 3…

Gurobi 基础语法之 tupledict 和 tuplelist

Python中的字典&#xff1a;dict 我们先来介绍一下Python语法中的 dict 类型, 字典中可以通过任意键值来对数据进行映射&#xff0c;任何无法修改的python对象都可以当作键值来使用&#xff0c;这些无法修改的Python对象包括&#xff1a;整数(比如&#xff1a;1)&#xff0c;浮…

Flutter:搜索页,搜索bar封装

view 使用内置的Chip简化布局 import package:chenyanzhenxuan/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:tdesign_flutter/tdesign_flutter.dart;import i…

IoTDB 2025 春节值班与祝福

2025 春节快乐 瑞蛇迎吉庆&#xff0c;祥光映华年&#xff0c;2025 春节已近在眼前。社区祝福 IoTDB 的所有关注者、支持者、使用者 2025 新年快乐&#xff0c;“蛇”来运转&#xff01; IoTDB 团队的春节放假时间为 2025 年 1 月 27 日至 2 月 4 日&#xff0c;1 月 25 日、26…

刀客doc:禁令影响下,TikTok广告业务正在被对手截胡

一、 现如今&#xff0c;TikTok在美国的命运迎来了暂时的反转&#xff0c;根据Adage的报道&#xff0c;广告主的投放在恢复。但短暂的关闭带来的影响依然有余震&#xff0c;一些广告主在重新评估TikTok在自己广告预算中的地位&#xff0c;这些是竞争对手截胡的机会。 长期以…

中国电信AI大模型发布:评分超o1-preview,近屿智能带您探索AI技术新境界

近日&#xff0c;中国电信人工智能研究院宣布&#xff0c;其自主研发的复杂推理大模型TeleAI-t1-preview即将上线天翼AI开放平台。该模型采用强化学习训练方法&#xff0c;显著提升了逻辑推理和数学推导的准确性&#xff0c;展现了强大的复杂问题解决能力。 在权威评测中&#…

开发环境搭建-4:WSL 配置 docker 运行环境

在 WSL 环境中构建&#xff1a;WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 基本概念说明 容器技术 利用 Linux 系统的 文件系统&#xff08;UnionFS&#xff09;、命名空间&#xff08;namespace&#xff09;、权限管理&#xff08;cgroup&#xff09;&#xff0c;虚拟出一…

Git 如何将旧仓库迁移新仓库中,但不显示旧的提交记录

一、异常错误 场景&#xff1a;我想把旧仓库迁移新仓库中&#xff0c;放进去之后&#xff0c;新仓库会显示这个项目之前的所有提交&#xff0c;如何不显示这些旧的提交&#xff1f; 二、原因 我们需要将旧仓库迁移新仓库中&#xff0c;但是又不想在新仓库中显示旧的提交记录…

使用Python和Qt6创建GUI应用程序--关于Qt的一点介绍

关于Qt的一点介绍 Qt是一个免费的开源部件工具包&#xff0c;用于创建跨平台GUI应用程序&#xff0c;允许应用程序从Windows瞄准多个平台&#xff0c;macOS&#xff0c; Linux和Android的单一代码库。但是Qt不仅仅是一个Widget工具箱和功能内置支持多媒体&#xff0c;数据库&am…

4、PyTorch 第一个神经网络,手写神经网络的基本部分组成

假设有一个二维数据集&#xff0c;目标是根据点的位置将它们分类到两个类别中&#xff08;例如&#xff0c;红色和蓝色点&#xff09;。 以下实例展示了如何使用神经网络完成简单的二分类任务&#xff0c;为更复杂的任务奠定了基础&#xff0c;通过 PyTorch 的模块化接口&#…

挂载mount

文章目录 1.挂载的概念(1)挂载命令&#xff1a;mount -t nfs(2)-t 选项&#xff1a;指定要挂载的文件系统类型(3)-o选项 2.挂载的目的和作用(1)跨操作系统访问&#xff1a;将Windows系统内容挂载到Linux系统下(2)访问外部存储设备(3)整合不同的存储设备 3.文件系统挂载要做的事…

算法刷题Day30

题目链接 描述 解题思路 考点&#xff1a;动态规划 dp[i][j]表示当前坐标的最小路径和dp初始化状态转移&#xff1a; dp[i][j] matrix[i][j] min(dp[i-1][j],dp[i][j-1]) 比较正上方和正左方的路径和哪个小。取小的那条路 代码 import copy class Solution:def minPathS…

【R语言】数学运算

一、基础运算 R语言中能实现加、减、乘、除、求模、取整、取绝对值、指数、对数等运算。 x <- 2 y <- 10 # 求模 y %% x # 整除 y %/% x # 取绝对值 abs(-x) # 指数运算 y ^x y^1/x #对数运算 log(x) #log()函数默认情况下以 e 为底 双等号“”的作用等同于identical(…

DeepSeek助攻!VS Code+Continue 解放双手编程!

简介 要想在vscode中采用AI&#xff0c;那么就需要添加AI插件&#xff0c;通过API来访问不同的模型。 Continue 插件 一款常用的AI代码助手&#xff0c;可以通过vscode和jetbrains来自动补全&#xff0c;推演代码。还有聊天功能。 https://marketplace.visualstudio.com/item…

当高兴、尊重和优雅三位一体是什么情况吗?

英语单词 disgrace 表示“失脸&#xff0c;耻辱&#xff0c;不光彩&#xff0c;名誉扫地”一类的含义&#xff0c;可做名词或动词使用&#xff0c;含义基本一致&#xff0c;只是词性不同。 disgrace n.丢脸&#xff1b;耻辱&#xff1b;不光彩&#xff1b;令人感到羞耻的人(或…

JVM栈溢出线上环境排查

#查看当前Linux系统进程ID、线程ID、CPU占用率&#xff08;-eo后面跟想要展示的列&#xff09; ps H -eo pid,tid,%cpups H -eo pid,tid,%cpu |grep tid #使用java jstack 查看进程id下所有线程id的情况 jstack pid 案例2 通过jstack 排查死锁问题 #启动java代码 jstack 进…