Jenkins 最佳实践

news2025/5/17 14:28:17

1. 在Jenkins中避免调度过载

过载Jenkins以同时运行多个作业可能导致资源竞争、构建速度变慢和系统性能问题。分配作业启动时间可以防止瓶颈,并确保更顺畅的执行。如何实现?

  1. 在Cron表达式中使用H:引入抖动(jitter),使用H来错开作业启动时间,避免同时执行多个作业。

       H/3 * * * * // 每隔3分钟运行

     2. 在cron表达式中正确使用时区。

   验证:

 Jenkins 还有一组别名,可以使使用常见的时间间隔更容易。

2. 使用环境变量来配置管道

硬编码像API密钥或部署URL这样的值会使管道的灵活性降低,并且更难维护。环境变量允许你将这些值外部化,使你的管道能够适应不同的环境(开发、测试、生产)。

如何实现?

在Jenkinsfile中定义环境变量:

environment {

    ENV_NAME = 'production'

    API_KEY = credentials('api-key-id')

}

这使得你的管道在不同环境中更加动态和易于管理。 

3. 设置构建保留策略以管理磁盘空间

随着Jenkins构建的积累,它们会占用大量的磁盘空间。设置保留策略可以帮助您丢弃旧的、不必要的构建,防止Jenkins变慢。

如何实施?

在每个作业的配置中,启用丢弃旧构建,并指定要保留的构建数量或构建的天数。这样可以确保Jenkins仅保留相关构建,减少存储开销。 

4.  参数化构建

有时,拥有多个“参数”的构建是有用的/必要的。考虑以下使用情况:

  • 您在Jenkins上设置了一个测试作业,它接受一个分发包作为参数并对其进行测试。您希望开发人员进行本地构建,并让他们提交构建以在Jenkins上执行测试。在这种情况下,您的参数是一个包含分发的zip文件。
  • 您的测试套件运行时间很长,以至于在正常执行中您无法承受运行整个测试周期的费用。因此,您希望控制要执行的测试部分。

在这种情况下,您的参数可能是一个字符串令牌,指示要运行的测试套件。这些参数可作为环境变量使用。因此,例如,shell($FOO,%FOO%)或Ant(${env.FOO})可以访问这些值。

定义参数:env和jdk_version: 

 在pipeline中使用该参数

验证:

5. 使用共享库来简化流水线

 创建共享库:要在Jenkins中创建共享库,请按照以下步骤操作:

1. 创建一个Git仓库:首先创建一个Git仓库来托管您的共享库代码。该仓库应具有Jenkins能理解的特定结构。

2. 创建‘vars’目录:在您的仓库中创建一个‘vars’目录。该目录将包含您的可重用函数。

3. 定义函数:在‘vars’目录中,将您的函数定义为Groovy文件。每个文件应包含一个函数,文件名将作为函数名。例如,如果您有一个名为‘sayHello’的函数,请创建一个名为`sayHello.groovy`的文件,其中包含该函数。

#!/usr/bin/env groovy

def call(String name = 'human') {
  echo "Hello, ${name}."
}

4. 提交并推送:将您的更改提交到Git仓库并推送到远程仓库。在Jenkins Pipeline中使用共享库:现在您已创建了一个共享库,可以在您的Jenkins Pipeline脚本中使用它。以下是一个示例:

@Library('pipeline-library-demo')_
 stage('Demo') {
     echo 'Hello world'
     sayHello 'Alex'
 }

 构建管道并检查控制台输出表明共享库正确加载并与用户输入交互。

在上面的例子中,我们使用 `@Library` 加载共享库,并导入我们想用的函数。然后,我们可以在我们的流水线脚本中调用这些函数。

现实世界示例:使用共享库进行 Kubernetes 部署假设你有一个简化 Kubernetes 部署的共享库。以下是你如何在 Jenkins 流水线中使用它的示例:

@Library('k8s-deploy-library') // Load the Kubernetes deployment library
import com.example.kubernetes.*

pipeline {
    agent any

    environment {
        DOCKER_IMAGE = 'myapp:latest'
    }

    stages {
        stage('Build and Push Docker Image') {
            steps {
                script {
                    buildAndPushDockerImage(image: DOCKER_IMAGE)
                }
            }
        }
        stage('Deploy to Kubernetes') {
            steps {
                script {
                    // Deploy to Kubernetes using the shared library function
                    deployToKubernetes(deploymentName: 'myapp', image: DOCKER_IMAGE)
                }
            }
        }
    }
}

在这个例子中,我们使用共享库来构建并推送 Docker 镜像,然后将其部署到 Kubernetes 集群中。共享库抽象了这些任务的复杂性,使管道脚本更具可读性和可维护性。

6. 在流水线中执行安全扫描

将安全检查融入您的流水线可以尽早发现漏洞,确保在代码进入生产环境之前是更安全的。自动化的安全扫描将减少漏洞被引入代码库的风险。如何实施?

将安全工具,如SonarQube或OWASP依赖检查,集成到您的流水线中:

stage('SonarCloud') {
  environment {
    SCANNER_HOME = tool 'SonarQubeScanner'
    ORGANIZATION = "rock-github"
    PROJECT_NAME = "java_jenkins-pipeline-as-code"
  }
  steps {
    withSonarQubeEnv('SonarCloudOne') {
        sh '''$SCANNER_HOME/bin/sonar-scanner -Dsonar.organization=$ORGANIZATION \
        -Dsonar.java.binaries=build/classes/java/ \
        -Dsonar.projectKey=$PROJECT_NAME \
        -Dsonar.sources=.'''
    }
  }
}

7. 使用角色来管理用户的权限

企业有这样的需求,开发部门的员工不能访问生产环境的release pipeline。只能看到测试环境的CI pipeline,要实现这样的需求,需要用到基于角色的权限管理。

首先需要安装下面的plug-in。

创建用户,在系统管理-安全-管理用户 

 点击创建用户

然后创建角色,并指定权限,使用表达式来匹配jenkins-ci开头的job。

然后分配角色给用户

使用该用户登录后,发现只能看到jenkins-ci开头的pipeline。

7. 将您的流水线作为代码

建议使用该功能将Jenkinsfile存储在源代码管理(SCM)中,然后进行版本控制和测试。将您的流水线视为代码可以打开一系列新的功能和能力,如多分支、拉取请求检测以及对GitHub和BitBucket的组织扫描。使用Jenkinsfile调用流水线作为代码使用其默认名称Jenkinsfile调用流水线脚本,并开始遵循脚本头部。这有助于您的IDE、GitHub和其他工具将其识别为Groovy,并启用所需的代码高亮显示。 

8. 不要使用 Maven 作业类型

Jenkins 多年来一直提供 Maven 集成插件,允许用户通过 Jenkins 的“新建项目”菜单选择“Maven 项目”来创建 Maven 项目。虽然 Maven 作业类型提供了与 Maven 构建的更高水平集成,但有时由于这种深度集成,可能会引入不必要的复杂性。

考虑使用组织文件夹、多分支管道或管道作业,而不是 Maven 作业类型。这些替代方案在管理您的 Jenkins 作业和工作流程时提供了更多灵活性和简便性。

Jenkins 项目使用组织文件夹在 ci.jenkins.io 上构建 Jenkins 核心和 Jenkins 插件。Jenkins 管道可以轻松构建 Maven 项目,并为 Maven 用户提供更好的控制。 

9. 避免资源冲突

可锁定资源

这个插件允许定义可锁定的资源(例如打印机、电话、计算机等),这些资源可以被构建使用。如果一个构建需要一个已经被锁定的资源,它将等待该资源释放。

当多个作业同时运行时,特别是当它们需要对某些资源或设置服务进行独占访问时,可能会发生冲突。为了防止干扰并确保顺利执行,有效管理资源访问至关重要。对于涉及数据库或网络服务的构建,实施防止冲突的措施是至关重要的。可锁定资源插件为Jenkins作业提供了细粒度的资源锁定功能。通过使用此插件,您可以确保在任何时候只有一个作业能够访问特定资源,从而避免冲突并确保正确的同步。在可锁定资源插件的资源锁定不足以解决问题的情况下,您可以使用限制并发构建插件进一步控制并发构建。该插件允许您限制可以同时运行的构建数量,提供额外的控制并防止对共享资源的过载。

通过利用这些插件,您可以有效管理资源冲突和并发性,确保Jenkins作业的顺利和可靠执行。 

 下面是一个使用资源锁的pipeline 

echo 'Starting'
lock('SH_Printer_ColorA3_2342') {
  echo 'Do something here that requires unique access to the resource'
  // any other build will wait until the one locking the resource leaves this block
}
echo 'Finish'

 10. 报告构建结果

图表和图形为项目状态和进展提供了有价值的见解,展示了趋势和模式。自动化测试结果,包括单元测试、集成测试和端到端测试,可以揭示脆弱性或不稳定性。覆盖率报告帮助识别没有执行自动化测试的领域。编译器警告消息通常是问题的第一指示。静态分析工具在报告有风险的代码或潜在安全风险的代码方面非常有效。性能测试结果帮助识别延迟或关注区域。

下一代警告插件提供了方便访问许多报告的途径,包括:

  • 编译器警告和错误(如gcc、clang、javac或golang)
  • 静态分析警告和错误(如spotbugs、checkstyle、pmd、lint、cpd或Simian)
  • 代码覆盖报告

 

 

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

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

相关文章

天能股份SAP系统整合实战:如何用8个月实现零业务中断的集团化管理升级

目录 天能股份SAP系统整合案例:技术驱动集团化管理的破局之路 一、企业背景:新能源巨头的数字化挑战 二、项目难点:制造业的特殊攻坚战 1. 生产连续性刚性需求 2. 数据整合三重障碍 3. 资源限制下的技术突围 三、解决方案:S…

uniapp-商城-59-后台 新增商品(属性的选中,进行过滤展示,filter,some,every和map)

前面讲了属性的添加,添加完成后,数据库中已经存在数据了,这时再继续商品的添加时,就可以进行属性的选择了。 在商品添加过程中,属性选择是一个关键步骤。首先,界面需要展示嵌套的属性数据,用户通…

B2C 商城转型指南:传统企业如何用 ZKmall模板商城实现电商化

在数字化浪潮席卷全球的当下,传统企业向电商转型已不再是选择题,而是关乎生存与发展的必答题。然而,缺乏技术积累、开发成本高、运营经验不足等问题,成为传统企业转型路上的 “拦路虎”。ZKmall模板商城以其低门槛、高灵活、强适配…

生成树协议 - STP

目录 BPDU STP选举机制 STP端口状态 STP计时器 STP拓扑变更机制 生成树协议(Spanning Tree Protocol),简写为STP。 STP是二层网络中用于消除环路的协议,通过阻塞冗余链路,使可用链路在拓扑上呈现出无环的树结构&…

计算机指令分类和具体的表示的方式

1.关于计算机的指令系统 下面的这个就是我们的一个简单的计算机里面涉及到的指令: m就是我们的存储器里面的地址,可以理解为memory这个意思,r可以理解为rom这样的单词的首字母,帮助我们去进行这个相关的指令的记忆,不…

mvc-service引入

什么是业务层 1)Model1(JSP)和Model2(模糊的mvc): MVC:Model(模型),View(视图),Controller(控制器) 视图层:用于数据展示以及用户交互的界…

基于微信小程序的城市特色旅游推荐应用的设计与实现

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

【暗光图像增强】【基于CNN的方法】2020-AAAI-EEMEFN

EEMEFN:Low-Light Image Enhancement via Edge-Enhanced Multi-Exposure Fusion Network EEMEFN:基于边缘增强多重曝光融合网络的低光照图像增强 AAAI 2020 论文链接 0.论文摘要 本研究专注于极低光照条件下的图像增强技术,旨在提升图像亮度…

【Linux】ssh命令 – 安全的远程连接服务

原创:厦门微思网络 SSH命令的概念 ssh命令的功能是安全地远程连接服务器主机系统,作为OpenSSH套件中的客户端连接工具,ssh命令可以让我们轻松地基于SSH加密协议进行远程主机访问,从而实现对远程服务器的管理工‍作。 语法 ssh 参…

AT9850B—单北斗导航定位芯片

AT9850B是一款高性能低功耗双频单北斗卫星导航接收机SOC单芯片。芯片集成射频前端和数字基带、多模式卫星信号处理引擎、电源管理功能,集成度高,外围应用电路简洁。 支持中国北斗B1I/B1C单频定位或B1I/B1C/B2a双频定位,支持北斗二号和三号&a…

工业4G路由器IR5000公交站台物联网应用解决方案

随着城市化进程的加速,公共交通是智慧城市的重要枢纽。城市公共交通由无数的公交站台作作为节点组合而成,其智能化升级成为提升城市出行效率与服务质量的关键。传统公交站台信息发布滞后、缺乏实时性,难以满足乘客对公交信息快速获取的需求&a…

idea中Lombok失效的解决方案

Lombok 是一个 Java 库,旨在通过注解简化 Java 代码的编写,减少样板代码,提高开发效率。它通过自动生成常见的代码(如 getter、setter、构造函数等)来减少开发者的手动编码工作。 一般Lombok失效有四步排查方案&#…

黑马k8s(九)

1.Pod-生命周期概述 2.Pod生命周期-创建和终止 3.Pod生命周期-初始化容器

【超分辨率专题】一种考量视频编码比特率优化能力的超分辨率基准

这是一个Benchmark,超分辨率视频编码(2024) 专题介绍一、研究背景二、相关工作2.1 SR的发展2.2 SR benchmark的发展 三、Benchmark细节3.1 数据集制作3.2 模型选择3.3 编解码器和压缩标准选择3.4 Benchmark pipeline3.5 质量评估和主观评价研…

vs2019及以后版本cmd指定编译环境文件的路径

1、找到文件路径 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build 2、使用方法,启动cmd,依次输入对应指令,即可切换到相应环境

一个完整的项目示例:taro开发微信小程序

前一周完成了一个项目,体测成绩转换的工具,没做记录,。这次计划开发一个地图应用小程序,记录一下。方便给使用的人。 一、申请微信小程序,填写相应的信息,取得开发者ID。这个要给腾讯地图使用的。 二、申…

龙虎榜——20250516

上证缩量收阴线,小盘股表现相对更好,上涨的个股大于下跌的,日线已到前期压力位附近,注意风险。 深证缩量收假阳线,临近日线周期上涨末端,注意风险。 2025年5月16日龙虎榜行业方向分析 跨境电商&#xff…

Python----神经网络(《Inverted Residuals and Linear Bottlenecks》论文概括和MobileNetV2网络)

一、论文 MobileNetV2 论文提出了一种新的移动架构,该架构提高了移动模型在多个任务和基准测试中的性能,以及在各种不同模型大小范围内的性能. 该架构基于倒残差结构,其中 shortcut 连接在 thin bottleneck 层之间. 中间的 expansion 层使用轻…

React Flow 简介:构建交互式流程图的最佳工具

本文为《React Agent:从零开始构建 AI 智能体》专栏系列文章。 专栏地址:https://blog.csdn.net/suiyingy/category_12933485.html。项目地址:https://gitee.com/fgai/react-agent(含完整代码示​例与实战源)。完整介绍…

Jupyter-AI Pandas-AI本地使用功能优化

引言 Jupyter-ai 和 Pandas-ai 的优化主要是个人工作遇到的需求,个人觉得是一个不错的体验优化,所以进行分享仅供参考,不喜勿喷,共同进步!Jupyter-AI优化主要包含以下方向(当前已实现): Jupyter-AI中 Chat 扩展和 NoteBook 的 Cell 工作去部分,使用的Language Model 和 …