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

Jenkins Pipeline Script Mark

1. Jenkins Pipeline 中,判断字符串是否为空,请永远使用以下逻辑

在 Jenkins Pipeline 中,字符串“看着是空的”但判断出来“不是空的”,99% 的情况是因为字符串中包含了不可见的控制字符(如换行符 \n、回车符 \r、制表符 \t 或空格)。

// 既能处理 null,也能处理空字符串,还能处理全是空格/换行的字符串if(myStr?.trim()){echo"字符串有内容"}else{echo"字符串为空"}

注:myStr?.trim() 利用了 Groovy 的安全导航操作符 ?.,如果 myStr 是 null,它会直接返回 null,从而使 if 条件为 false,避免了 NullPointerException。

2. Jenkins Pipeline 中检查 Git 子模块(Submodules)的状态(如 Commit ID 或 Branch)

在 Jenkins Pipeline 中检查 Git 子模块(Submodules)的状态(如 Commit ID 或 Branch)通常有两种场景:一种是验证当前工作区的状态,另一种是在构建前预检

由于 Jenkins 的checkout步骤或git插件在处理子模块时,有时会因为配置问题导致子模块处于 “Detached HEAD” 状态或指向了错误的 Commit,我们可以通过以下几种方式进行校验。

方法一:使用sh脚本结合正则校验(最常用)

这是最灵活的方法。通过git submodule status命令获取子模块信息,然后用 Groovy 进行解析。

git submodule status的输出格式通常为:
<commit_id> <path> (<branch/tag>)
例如:7a1b2c3d path/to/mysubmodule (v1.0.1)

script{// 1. 获取子模块状态// --recursive 确保检查嵌套子模块defstatus=sh(script:"git submodule status --recursive",returnStdout:true).trim()echo"子模块当前状态:\n${status}"// 2. 定义你期望的校验规则// 假设要求子模块 'my-api-docs' 必须指向 commit '7a1b2c3'defexpectedSubmodule="my-api-docs"defexpectedCommitPrefix="7a1b2c3"// 3. 遍历输出行进行校验deflines=status.split('\n')deffound=falsefor(lineinlines){// 正则匹配:[空格/+-] [CommitID] [路径] [括号里的分支/标签]// 这里的正则匹配:开头可能是空格、+或-,接着是 commit id,然后是路径if(line.contains(expectedSubmodule)){found=true// 提取 Commit ID (前 7 位)defactualCommit=line.trim().split(' ')[0].replaceAll(/[+-]/,"")if(!actualCommit.startsWith(expectedCommitPrefix)){error"【校验失败】子模块${expectedSubmodule}的 Commit ID 为${actualCommit},不符合预期值${expectedCommitPrefix}"}echo"【校验通过】子模块${expectedSubmodule}匹配成功"}}if(!found){error"【校验失败】在项目中未找到子模块:${expectedSubmodule}"}}

方法二:检查子模块是否处于特定分支

如果你要求子模块必须检出(Checkout)到某个特定的本地分支,而不是处于“游离头指针(Detached HEAD)”状态:

script{defsubPath="lib/common-utils"// 子模块路径defexpectedBranch="develop"// 进入子模块目录执行命令dir(subPath){defcurrentBranch=sh(script:"git rev-parse --abbrev-ref HEAD",returnStdout:true).trim()if(currentBranch!=expectedBranch){// 如果处于 Detached HEAD,rev-parse 会返回 "HEAD"error"【分支错误】子模块${subPath}当前在${currentBranch},预期应在
http://www.jsqmd.com/news/539187/

相关文章:

  • 【大模型】-名词手册-扫盲
  • Baseweb路线图解析:未来版本功能预告与React组件库发展趋势
  • 自动驾驶入门:手把手教你实现Pure Pursuit路径跟踪算法(附Python代码)
  • vLLM-v0.11.0性能实测:PagedAttention技术到底有多省内存?
  • 深入剖析Lottie动画的JSON结构与渲染机制
  • MangoHud项目发布流程:版本管理完全指南
  • 订书钉规格
  • X射线单晶定向仪优质供应商与品牌推荐榜,售后与质量双保障! - 品牌推荐大师1
  • 手把手教你解决Realsense D455在ROS Noetic下IMU数据不输出的问题(附固件降级指南)
  • 自感痕迹论:贯通人工智能伦理与治理的元理论 ——基于AI元人文的体系性建构
  • 3步打造个人离线音频库:喜马拉雅VIP内容永久保存全攻略
  • AlphaGo核心技术解析:深度学习与强化学习的完美结合
  • Windows Terminal完全指南:5分钟打造你的高效命令行工作台
  • dotnet-webapi-starter-kit 单元测试与集成测试完整指南
  • HackTricks密码学与隐写术:CTF比赛中常用的加密技巧终极指南
  • flask框架
  • 用Python脚本批量生成AI短剧:速创Sora2 API角色创建接口实战(附完整代码)
  • 英雄联盟工具集League Akari:3个实用功能提升你的游戏体验
  • 告别Python版本混乱!Windows下用pyenv-win + virtualenvwrapper打造多项目开发环境(保姆级避坑指南)
  • Translumo屏幕实时翻译工具:游戏视频外文秒变中文的终极方案
  • Apache OpenWhisk核心架构深度解析:Controller、Invoker与调度机制
  • 大模型替代人工服务的现状与未来
  • Prim算法可视化:用C语言动态演示最小生成树构建过程
  • Kook Zimage真实幻想Turbo在创意设计中的应用:海报/头像/壁纸生成
  • GPT-SoVITS声音模型大全数据分享,包括音频数据27.4G
  • 从AMBA 5到ASIL D:深入解读ARM和Arteris的互连技术安全设计差异
  • 保姆级教程:用Python和PyTorch复现EEG Conformer模型(附完整代码)
  • 解决暗黑2三大痛点:d2s-editor的高效零门槛存档编辑方案
  • LabelMe标注精度挑战:如何达到像素级标注标准
  • Uvicorn与Linode Kubernetes Engine:简化K8s部署流程的完整指南