ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用 Groovy 脚本批量删除 Jenkins Job:从名称匹配到安全执行(devops-exercises 实战解析)

用 Groovy 脚本批量删除 Jenkins Job:从名称匹配到安全执行(devops-exercises 实战解析) 文档教程DevOps运维【免费下载链接】devops-exercisesLinux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions项目地址https://gitcode.com/GitHub_Trending/de/devops-exercises点击查看免费下载本文围绕 devops-exercises 仓库中的 remove_jobs.md 练习展开讲解如何编写 Jenkins Groovy 脚本按名称模式例如包含test字符串批量定位并删除 Jenkins Job。读完本文你将掌握 Jenkins 脚本控制台Script Console下的对象模型操作、正则匹配筛选、先预览后删除的安全执行流程并能将其推广到按天清理历史构建、借助 REST API 与 Job DSL 管理大规模 Job 等同类运维场景。练习背景目标与原始指令该练习位于仓库 topics/cicd/ 目录下的 Jenkins 脚本系列中其核心目标Objective与操作指令Instructions如下Objective学会编写 Jenkins 脚本删除 Jenkins Job。Instructions创建三个 Job分别命名为test-job、test2-job和prod-job编写脚本删除所有名称中包含字符串test的 Job。从命名规则可以直观看出test-job与test2-job命中过滤条件prod-job不命中应被保留。这是一个典型的按命名模式做批量清理场景——在实际生产环境里临时分支构建、测试套件 Job、一次性实验 Job 常以相同前缀/关键字命名积累到一定数量后需要按模式批量回收逐一手工删除既不现实也易出错。该练习与仓库中的另一个 Jenkins 脚本练习 remove_builds.md按时间删除旧构建共同构成了 Jenkins 日常运维中清理作业Job与清理构建产物Build两个维度的训练两者在 CI/CD 主题总览 中被归为同一系列Jenkins - Remove Jobs与Jenkins - Remove Builds。环境准备在哪里运行这段脚本删除 Job 属于 Jenkins 服务端的管理操作推荐在Jenkins Script Console脚本控制台中运行登录 Jenkins进入Manage Jenkins系统管理打开Script Console脚本控制台在输入框中粘贴 Groovy 脚本点击运行。脚本控制台直接运行在 Jenkins 主进程的 JVM 内因此可以直接访问 Jenkins 的核心对象模型Jenkins.instance是当前 Jenkins 实例的入口对象Jenkins.instance.items则暴露了实例下直接挂载的所有项目顶层 Job列表。这也是 remove_jobs_solution.groovy 的脚本逻辑起点。核心脚本逐行拆解答案是如何工作的仓库给出的官方解答位于 remove_jobs_solution.groovy全文如下def jobs Jenkins.instance.items.findAll { job - job.name ~ /test/ } jobs.each { job - println job.name //job.delete() }这段脚本只有三行却完整演示了筛选—遍历—执行的经典三步流程筛选Jenkins.instance.items.findAll { job - job.name ~ /test/ }Jenkins.instance.items返回当前 Jenkins 实例下的 Job 集合findAll是 Groovy 集合的标准方法保留所有满足闭包条件的元素闭包内job.name ~ /test/使用 Groovy 的~运算符对 Job 名称执行正则匹配凡是名称中含有test字样的 Job 都会被选中值得注意的细节正则/test/中包含了双引号字符。若你的 Job 名称本身不含双引号绝大多数情况如此建议改写为job.name ~ /test/否则该表达式实际匹配的是带引号的 test文本会导致筛选结果为空——这也提醒我们从模板复用的脚本务必结合自己的命名实际校准正则。遍历jobs.each { job - ... }each对筛选出的每一个 Job 执行闭包内的操作闭包参数job代表当前遍历到的 Job 对象可调用其.name、.delete()等属性和方法。执行与安全护栏println job.name 注释掉的job.delete()解答刻意将真正具有破坏性的job.delete()以注释形式保留只通过println job.name输出命中名单这是一种非常实用的先预览、后删除防御策略第一轮先运行预览版确认筛选条件无误再取消注释执行真实删除避免因正则写错而误删生产 Job。从 Jenkins 对象模型看Jenkins.instance.items只覆盖顶层Job。若 Job 位于文件夹Folder内需要改用Jenkins.instance.getAllItems()或递归遍历 Folder 的items才能找到它们。对于练习要求的三个平铺 Job 来说items已足够但生产环境按文件夹组织 Job 时务必注意这一差异。动手实操完整复现练习按原始指令完整实操流程如下第一步创建三个 Job在 Jenkins 主页面点击New Item新建任务依次创建test-job例如选择 Freestyle projecttest2-jobprod-job创建与否、Job 类型Freestyle、Pipeline 等并不影响删除脚本的运行逻辑Jenkins.instance.items会把不同类型的 Job 统一纳入集合。第二步先运行预览脚本打开 Script Console粘贴def jobs Jenkins.instance.items.findAll { job - job.name ~ /test/ } println Matched ${jobs.size()} job(s): jobs.each { job - println job.name }预期输出Matched 2 job(s): test-job test2-jobprod-job因名称不含test而被正确排除同时脚本打印了命中数量方便在 Job 较多时快速核对。第三步确认无误后执行删除def jobs Jenkins.instance.items.findAll { job - job.name ~ /test/ } jobs.each { job - println Deleting ${job.name} job.delete() } println Remaining jobs: Jenkins.instance.items.collect { it.name }执行后再次枚举剩余 Job应只剩prod-job。.delete()返回是否删除成功生产脚本中可据此收集失败项并打印错误信息。深入理解从删 Job到删 Build的同类问题删除 Job 与删除 Build 是 Jenkins 清理工作中的两个互补维度仓库将二者设计为相邻练习remove_jobs.md按名称模式删除 Job本文主题remove_builds.md按时间阈值删除 Build例如只删除 3 天前的构建。后者的官方解答 remove_builds_solution.groovy 展示了另一条实现路径——不依赖 Jenkins 对象模型而是直接操作文件系统def removeOldBuilds(buildDirectory, days 14) { def wp new File(${buildDirectory}) def currentTime new Date() def backTime currentTime - days wp.list().each { fileName - folder new File(${buildDirectory}/${fileName}) if (folder.isDirectory()) { def timeStamp new Date(folder.lastModified()) if (timeStamp.before(backTime)) { folder.delete() } } } }该脚本通过new File(...)打开 Job 构建目录用lastModified()读取每个构建文件夹的时间戳与当前时间减去 N 天得到的阈值比较before(backTime)为真即删除。它把按时间清理翻译成了按文件修改时间清理说明 Jenkins 的 Job/Build 数据在磁盘上有清晰的目录映射运维脚本既可以用 API 也可以走文件层。两个练习合在一起覆盖了名称维度与时间维度两种清理策略适合作为 Jenkins 管理员面试或日常运维的成套演练。安全执行与最佳实践删除是不可逆操作结合练习与生产经验建议遵循以下原则先打印后删除如官方解答所示先运行println job.name的预览版本确认命中名单后再执行job.delete()缩小匹配范围正则应尽量精确例如^test-锚定前缀避免过于宽泛的模式误伤生产 Job必要时先统计jobs.size()用停用代替删除拿不准的 Job 可以先job.disable()停用观察一段时间确认无依赖后再删除注意权限Script Console 拥有 Jenkins 主进程的高权限任何在控制台执行的脚本都等同管理员操作生产环境应限制控制台访问定期清理将预览—人工确认—删除固化为脚本 审批流程避免 Job 数量无节制膨胀。从脚本到规模化管理成百上千个 JobCI/CD 主题总览 的自测部分给出了与本题直接相关的追问如果你管理着几十个 Job 可以用 UI但每周/每月要创建删除成百上千个 Job 时怎么办其列举的规模化手段正好是本题脚本思路的延伸Job 模板用统一模板定义 Job 结构批量生成同名/同构 JobJob DSL用 Groovy 编写 DSL 声明式定义 Job由 Jenkins 执行生成器 Job 批量创建或清理Jenkins REST API通过 HTTP 接口如POST /job/name/doDelete以脚本或 curl 方式批量操作配置管理工具用 Ansible、Terraform 等工具管理 Jenkins 配置与 Job 定义把增删改纳入基础设施即代码IaC流程。本题的Jenkins.instance.items.findAll { ... }本质上就是这些规模化方案的脚本原型——先用对象模型筛选再批量执行动作只是题目限定在 Script Console 的单机场景。相关仓库资源练习原文remove_jobs.md官方解答remove_jobs_solution.groovy同类练习remove_builds.md 与 remove_builds_solution.groovy主题总览含 Jenkins 概念自测与规模化思路topics/cicd/README.md声明式 Pipeline 参考展示 Jenkins 脚本的另一种形态deploy_to_kubernetes 的 Jenkinsfile掌握本题后你便拥有了 Jenkins 管理脚本的基础能力定位对象、条件筛选、批量操作、安全预览。将它与其他脚本练习按时间删构建、Pipeline 编排组合即可覆盖日常 Jenkins 运维中最常见的自动化清理需求。赞分享文档教程DevOps运维【免费下载链接】devops-exercisesLinux, Jenkins, AWS, SRE, Prometheus, Docker, Python, Ansible, Git, Kubernetes, Terraform, OpenStack, SQL, NoSQL, Azure, GCP, DNS, Elastic, Network, Virtualization. DevOps Interview Questions项目地址https://gitcode.com/GitHub_Trending/de/devops-exercises点击查看免费下载相关推荐BMad Method 的 bmad-build 实施工作流以最少人机交互完成可验收的代码变更BMad Method 的 bmad build 实施工作流以最少人机交互完成可验收的代码变更 bmad build 是 BMad MethodBMM中所文档教程DevOps运维devops-exercises 实战使用 ArgoCD CLI 与 UI 创建、同步并删除 Applicationdevops exercises 实战使用 ArgoCD CLI 与 UI 创建、同步并删除 Application 本文基于 devops exercise文档教程DevOps运维CAS 属性释放策略之外部 Groovy 脚本External Groovy从服务定义到脚本执行的完整实战指南CAS 属性释放策略之外部 Groovy 脚本External Groovy从服务定义到脚本执行的完整实战指南 本文以 Apereo CAS 中基于外部后端认证鉴权单点登录创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表