当前位置: 首页 > 科技观察

您是否遵循了这些Jenkins最佳实践?_0

时间:2023-03-19 17:17:18 科技观察

【.com快译】随着编排工具的普及,我们可以通过持续集成(CI)和持续交付(CD)的形式实现开发和运维的无缝协作。在众多软件开发团队中,他们首选的DevOps自动化工具是Jenkins。下面,我将和大家一起探讨一下在使用Jenkins的过程中值得遵循的一些好的实践。1.时刻保持Jenkins的安全在默认配置下,Jenkins不执行任何安全检查。也就是说,除了一些简单的基本Jenkins配置、作业和构建之外,网站访问者几乎可以执行Jenkins主数据库中的任何随机代码。同时,Jenkins还允许在所有连接的代理上执行包括用户密码、证书和其他隐私数据在内的代码操作。具体实践为了保护Jenkins的安全,我们需要通过以下两个方面来配置“ConfigureGlobalSecurity”选项。安全领域:通常也称为“身份验证”。它告诉Jenkins基本环境以及从哪里拉取用户信息。如上图,从JenkinsV2.214和JenkinsLTSV2.222.1开始,默认使用“Jenkins自带用户数据库”作为安全选项。而对于两者之前的版本,我们应该选中“启用安全”复选框,以便用户可以使用他们的凭据登录以避免任何入侵。在配置了外部身份提供程序(如LDAP)的组织中,我们需要为Jenkins实例安装并启用LDAP插件,以将所有身份验证(包括用户和组)委托给配置的LDAP服务器。授权:告诉Jenkins环境哪些用户和/或组可以访问Jenkins的哪些方面,以及他们的权限。如上图所示,我们有五个授权选项:Anyonecandoanything:我们应该避免启用此设置,除了用于本地测试的Jenkins控制器。毕竟包括匿名用户在内的所有人都可以完全控制Jenkins,这是极其危险的。LegacyMode:我们也应该避免这种设置。只有具有“管理员”角色的用户才能被授予对系统的完全控制权;否则,他们将只有读取权限。登录用户可以做任何事情:这种模式强制每个用户在使用Jenkins之前登录。据此,匿名用户只能获得对Jenkins的读取权限,或者根本没有访问权限。同时,用户的任何操作也会被审计。基于矩阵的安全性:该解决方案可以准确控制哪些用户和组可以在Jenkins环境中执行哪些操作。基于项目的矩阵授权策略:该插件提供了基于矩阵的安全和基于项目的矩阵授权策略,因此需要在Jenkins上单独安装。同时,授权方案是基于矩阵的安全性的扩展,它允许在“项目配置”界面中为每个项目以及特定用户或组定义访问控制列表(ACL)。总的来说,这种类型的策略为许多Jenkins环境提供了出色的安全性和灵活性,因此是一种很好的做法。为了保护Jenkins用户免受其他威胁,我们还可以根据需要开启以下功能(默认关闭):跨站请求伪造(CSRF)保护:防止运行在防火墙内的Jenkins受到远程攻击。CSRF设置的路径是:“管理Jenkins”>“配置全局安全”>“部分:CSRF保护”。有关具体说明,请参阅--https://www.jenkins.io/doc/book/managing/security/#cross-site-request-forgery。当然,从Jenkins2.0开始,默认启用了CSRF保护。在主节点上运行构建的安全风险:在主节点上运行的构建可以读取或修改JENKINS_HOME中的任何文件。由于它可以读取凭据、创建管道和作业以及安装插件,因此它会影响Jenkins的整个构建过程。通常,为了配置master节点没有执行权限,我们要么只在buildagent上运行build,要么在buildagent中,区分管理Jenkins的人和配置人以及管理Jenkins的人的角色提交项目;或直接使用JobsRestrictionsPlugin来过滤哪些作业可以在主节点上运行。2.时刻备份JENKINS_HOME目录Jenkins的主目录包含作业配置、构建日志、插件配置等各种重要数据。我们可以通过Jenkins提供的插件配置需要备份的作业。具体做法1、精简备份(ThinBackup)插件这是所有提供自动定期备份的工具中最方便的插件之一。它通过以下方式启用:通过管理Jenkins安装插件>管理插件>单击“可用”选项卡>搜索“精简备份”。安装完成后,转到管理Jenkins>精简备份>设置。单击立即备份以测试备份的效果。2.如下图所示定期备份插件。配置完成后,插件将定期运行备份作业。详情请参考--https://plugins.jenkins.io/periodicbackup/。该插件定义了以下三个方面:文件管理器:定义了哪些文件需要包含在备份中,以及文件恢复策略。例如,ConfigOnly只会选择配置类XML文件。存储:指定存档和取消存档备份的方法。例如,“ZipStorage”会将备份文件压缩成ZIP存档。位置:指定备份的位置。例如“LocalDirectory”就是将备份文件存放在指定的路径中。3.配置定期备份作业创建新的Jenkins作业时选择“FreestyleProject”。将SCM标记为“无”。在“BuildTrigger”中选择“RegularBuild”,然后在“Schedule”中配置频率。根据配置文件,添加执行外壳(ExecuteShell)构建作业。4.将Jenkins配置备份到谷歌云存储空间如果你已经在谷歌云的Kubernetes集群上部署了Jenkins服务器配置,你可以使用上面的瘦备份插件配合谷歌云存储插件连接到云端。具体实现说明请参考--https://medium.com/faun/backing-up-jenkins-to-google-cloud-storage-4ba12e69ded2。3.为每个维护或开发分支设置不同的工作/项目。众所周知,使用持续集成工具的优势之一是它们可以在开发生命周期的早期阶段发现问题。而Jenkins只是提供了一种并行构建管道的方法。因此,为每个分支设置不同的工作/项目可以让我们在并行开发的同时及早发现问题,降低风险,提高开发人员的生产力。具体练习一下最新的ParallelTestExecutor插件(见--https://plugins.jenkins.io/parallel-test-executor/),它可以帮助我们执行并行测试。4.防止并行运行的作业引起的资源冲突当然,值得注意的是,当多个并发运行的作业创建服务或需要独占访问时,Jenkins管道可能会因冲突而失败。在实践中,我们可以并行构建不同的项目,分配不同的端口来避免冲突。比如对于数据库这种需要锁定持久化资源的需求场景,我们可以使用ThrottleConcurrentBuilds插件(见--https://wiki.jenkins.io/display/JENKINS/Throttle+Concurrent+Builds+Plugin)根据全局配置或为项目启用的节点数调整并行构建的数量。如上图所示,我们可以使用0并将并发构建设置为无限制。5、使用“文件指纹”管理依赖当我们在Jenkins上创建依赖时,往往容易造成版本之间的混淆。Jenkins支持的“文件指纹识别”功能正好可以简化这个过程。在实践中,我们需要配置所有相关项目,记录项目生成的jar文件和项目所有依赖项的jar文件指纹。具体配置可以进入:“项目”>“配置”>“构建后操作”>“记录指纹”。同时,您可以参考文档——https://wiki.jenkins.io/display/JENKINS//Fingerprint。六、避免在流水线中使用复杂的Groovy代码对于Jenkins流水线,Groovy代码往往会调用主服务器上的大量主要资源(如:内存和CPU)来执行。因此,我们需要减少管道中执行的Groovy代码量。具体做法1.JsonSlurper这个函数类似于XmlSlurper或者readFile,可以用来从磁盘读取文件,将文件中的数据解析成JSON对象,然后使用JsonSlurper().parseText(readFile(“$LOCAL_FILE”))命令将对象注入管道。由于该命令将本地文件两次加载到主服务器的内存中,如果文件过大或重复执行该命令,将消耗大量内存。解决方案:为了替换JsonSlurper,我们可以使用shell步骤的以下命令。defJsonReturn=shlabel:",returnStdout:true,script:'echo"$LOCAL_FILE"|jq"$PARSING_QUERY"'它将使用代理资源读取文件,其中$PARSING_QUERY将有助于将文件解析成小块。2.HttpRequest通常,这个命令可以用来从外部资源中获取数据,并存储在一个变量中,在这个过程中,由于请求直接来自于主服务器,如果主服务器没有加载证书,可能导致HTTPS请求的结果不一致,另外请求的response会重复存储两次,解决方法:使用shell步骤执行代理HTTP请求,比如我们可以适当使用curl或者wget等工具,在同时,如果result一定是在Jenkinspipeline的后端,那么我们在agent端要尽可能多的过滤掉结果,这样只有必要的信息才传输到Jenkins的主数据库。7.建立可扩展的Jenkins管道公司与一般程序库相比,共享库(SharedLibraries)提供版本控制的流水线代码。我们可以从源代码管理(SCM)存储和访问它。在实践中,我们需要在SCM中存储结构一致的源文件,然后使用SCM插件将库连接到Jenkins实例。具体操作步骤为:在“ManageJenkins”>“ConfigureSystem”>“GlobalPipelineLibrary”下启用全局共享库。当然,我们也可以通过Jenkinsfile中的库名来让管道访问共享库。8.管理declarativegrammar和declarativepipeline当涉及到企业级Jenkins的实现和pipeline资源的管理时,我们可以通过declarativepipeline配置来告诉系统如何运行,从而将复杂性转移给系统。同时,您可以参考通用的声明性步骤(参见--https://jenkins.io/doc/book/pipeline/getting-started/#directive-generator)来创建未开发的管道;或使用代码片段生成器(参见--https://www.jenkins.io/doc/book/pipeline/getting-started/#snippet-generator),将现有构建步骤转换为管道语法。另外,《管道入门指南》和《管道示例》是两个很好的社区参考资源。9.保持高测试代码覆盖率并将单元测试作为流水线的一部分显然,代码测试覆盖率越高,产品缺陷越少,用户验收测试(UAT)的通过率也越高。.因此,我们需要依靠更详细的单元测试和更高的测试覆盖率来确保开发人员在开发生命周期的早期阶段提高代码质量。具体实践1.JenkinsCobertura插件为了获取代码覆盖率相关报告,我们需要完成Cobertura插件的以下配置步骤:通过“ManageJenkins”>“ManagePlug-”安装Cobertura插件插件”。配置项目的构建脚本以生成CoberturaXML报告。启用“发布Cobertura覆盖率报告”。指定生成coverage.xml报告的目录。(可选)配置覆盖率的相关指标。您可以点击链接了解如何配置单个项目、项目层次结构和Maven。2、代码覆盖率API插件是一个统一的API插件,可以支持Cobertura等其他插件。其主要功能包括:根据用户的配置,查找覆盖范围的相关报告。使用适配器将报告转换为标准格式。聚合已解析的标准格式报告并在图表中显示已解析的结果。3.LambdaTestSeleniumGridCloud提供了广泛的浏览器及其版本库,因此您可以在执行自动化测试时使用Selenium测试套件来获得更高的测试覆盖率。通常,LambdaTestJenkins插件可以提供:为Jenkins作业配置LambdaTest凭据。设置Lambda隧道并放置二进制文件以在本地托管的Web应用程序上进行自动跨浏览器测试。将所有测试结果,包括视频日志、网络日志、LambdaTest执行步骤的相关截图,嵌入到Jenkins作业结果中。完成LambdaTestJenkins插件的安装后,我们通过将JenkinsCI实例连接到LambdaTest网格来自动化Selenium自动化测试脚本。您还可以通过链接参考Jenkins集成的支持文档。10.监控CI/CD流水线我们需要监控了解云服务、网络、测试服务等外部依赖如何影响CI/CD流水线,以便及时采取行动。在这里,我们可以使用JenkinsSlack插件将错误通知发送到由值班工程师监控的频道。该插件不仅可以提供诸如构建通过率、平均构建时间和特定阶段的错误计数等信息;它还可以帮助我们确定构建过程中潜在的低效区域和改进区域。总结总的来说,Jenkins的优秀实践包括:让Jenkins运行在自己的用户数据库上,采用基于权限和用户矩阵的访问控制方式,自动运行相关配置的备份,鼓励应用团队使用Shell步骤来避免复杂性Groovy脚本,共享库和Jenkinsfiles的所有权,通过使用自动化状态插件监控管道,定义声明式管道,提高代码测试覆盖率,并将代码覆盖率API与LambdaTestSeleniumGrid集成以实现无缺陷交付。原标题:AreYouFollowingTheseJenkinsBestPractices?,作者:KritikaMurari