在本文中,我们将讨论在软件 SDLC 过程中使用 Jenkins 的重要方面,特别关注 Jenkins 面试问题。本文将从持续集成和持续部署简介以及 Jenkins 在 SDLC 过程中作为自动化工具所扮演的角色开始,对 Jenkins 的能力和操作方法进行一些深入讨论,更多地关注 Jenkins 的面试问题- 基础、中级和高级级别。
随着软件开发生命周期 (SDLC) 过程的持续集成和持续部署领域的最新进展,可以比使用传统方法更快地将开发的软件交付给最终用户。尽管有很多工具可以让开发团队快速且持续地交付软件,但可用于实现这一目标的开源工具集将有其优势。
在这个 Dev-Ops 时代,能够实现持续和快节奏软件开发的一个这样优秀的开源工具是 - Jenkins - 一种开源软件,可满足软件团队的需求 - 开发、构建、测试、部署和监控 -软件。
Jenkins 可用于在本地或云端运行的大量基于软件的自动化。与其他可用的自动化软件相比,它有几个优点,其中最好的是 Jenkins 是完全开源的,并且基于插件的架构具有高度可扩展性。
Jenkins是——
- 易于安装。
- 易于配置。
- 可插入自定义插件,因此具有高度可扩展性。
- 最重要的是,Jenkins 本质上是分布式的,因此可以通过跨节点和代理分布工作负载来支持任何规模。
基础的Jenkins常见面试题和答案合集
1. 什么是Jenkins?
Jenkins 是一个独立的开源自动化服务器,可用于自动化与构建、测试、交付或部署软件相关的各种任务。Jenkins 可以通过本机系统包、Docker 安装,甚至可以由任何安装了 Java 运行时环境 (JRE) 的机器独立运行。
2. Jenkins常见面试题有哪些:谈谈持续集成、持续交付和持续部署?
持续集成:一种软件开发过程,其中对软件所做的更改在补丁准备就绪时集成到主代码中,以便软件始终准备好 - 构建、测试、部署、监控 - 持续。
持续交付:这是一个软件开发过程,在所有质量检查成功后,持续集成 (CI) 更改将被测试并持续部署到特定环境中,通常通过手动发布过程
持续部署:一种软件开发实践,在所有质量检查成功后,持续集成 (CI) 更改会自动部署到目标环境中
基于自动化程度,上述三种范式可以更好地表示如下——
3. Jenkins 的常见用例有哪些?
Jenkins面试题解析:Jenkins 作为开源自动化可用于任何类型的基于软件的自动化。一些常见的用例包括但不限于 -
- 软件构建工作
- 健全性/烟雾/CI/回归测试作业
- 网络/数据抓取相关工作
- 代码覆盖率测量工作
- 通用自动化
- 逆向工程职位
- 关键解码工作和许多其他适用软件自动化的工作。
4、Jenkins的安装方式有哪些?
Jenkins可以安装使用 -
- 本机系统包管理器,如 - apt (Linux)、brew (Mac) 等。
- Docker(适用于 Jenkins 的流行 Docker 映像可用于 Docker 注册表中的 Unix/Mac/Windows 等不同平台)
- Kubernetes(作为 Helm Chart 提供,可以安装在我们的 Kubernetes 集群上)
- 独立(在任何安装了 Java 运行时环境的机器上)
更详细的安装说明参考官方文档
5. 什么是Jenkins工作?
作业/项目是使用 Jenkins 自动化服务器和其他所需插件、配置和基础设施的逻辑工作(如软件构建、自动化任务、测试执行等)的基本单元。
作业可以是不同的类型,例如 - 自由式项目、多配置项目、管道项目、多分支项目等。
6. 什么是 Jenkins 流水线?
管道是一种特殊类型的 Jenkins 作业 - 只是由定义的逻辑控制的一系列步骤 - 协调可以跨越多个构建代理的长时间运行的活动。它适用于构建管道(以前称为工作流)和/或组织使用自由式作业无法轻松实现的复杂活动。
了解如何在此处创建你的第一个管道
7. Jenkins 流水线有哪些类型?
Jenkins 管道可以是 - 声明式管道或脚本式管道。声明式管道利用大量通用的预定义构建步骤/阶段(即代码片段)根据我们的构建/自动化需求构建我们的工作,而使用脚本化管道,可以使用 groovy 自定义和使用这些步骤/阶段语法提供更好的控制和微调的执行级别。
8. 解释 Jenkins 多分支流水线?
它是一个管道作业,可以配置为根据在一个 SCM 存储库中检测到的分支创建一组管道项目。这可用于为单个存储库的所有分支配置管道,例如,如果我们为不同的配置(如区域设置、货币、国家/地区等)维护不同的分支(即生产代码分支)。
9. 你如何安全地在 Jenkins 中存储凭证?
凭证可以使用凭证插件安全地存储在 Jenkins 中,该插件存储不同类型的凭证,例如 - 带密码的用户名、带私钥的 SSH 用户名、AWS 凭证、Jenkins 构建令牌、秘密文件/文本、X509 和其他证书、Vault在需要时通过适当的加密和解密安全地保存相关凭据。
10. 怎样才能让定时作业暂时停止执行?
从作业详细信息页面禁用作业以暂时停止触发作业的所有计划执行和其他因素/事件,并使其恢复以恢复作业计划/触发器。如果一个职位不是永久需要的,我们可以从职位列表查看页面中删除该职位。
中级Jenkins常见面试题和答案合集
11. Jenkins Job/Pipeline 的触发方式有哪些?
我们可以通过多种方式在 Jenkins 中触发工作。一些常见的方法如下 -
- 使用所需数据触发对目标作业 URL 的 API (POST) 请求。
- 从 Jenkins Web 应用程序手动触发它。
- 使用 Jenkins CLI 从主/从节点触发它。
- 基于时间的计划触发器,如 cron 作业。
- 基于事件的触发器,如 SCM 操作(Git Commit、Pull Requests)、WebHooks 等。
- 其他 Jenkins 作业的上游/下游触发器。
12. 什么是 Jenkins Build 原因?
Build Cause 是一个文本属性,表示触发作业构建的原因,比如它可能是 Jenkins 用户(来自 UI)、计划作业的计时器、上游作业触发的作业的上游作业等。这是主要用于识别构建的性质 - 无论是夜间、手动、自动等。
13. Jenkins 如何知道何时执行计划作业/管道以及它是如何触发的?
Jenkins master 将根据计划作业的配置为作业设置 cron 条目。当特定作业的时间到来时,它会命令代理(基于作业的配置)以所需的配置执行作业。
14. Jenkins 支持的凭证类型有哪些?
在 Jenkins 中,凭证是一组用于通过内部/外部服务进行身份验证以完成操作的信息。Jenkins 凭证由一个名为 - Credentials Binding - 插件的内置插件提供和管理。Jenkins可以处理不同的凭据如下 -
- 秘密文本 - 令牌,例如 API 令牌、JSON 令牌等。
- 用户名和密码 - 基本身份验证也可以存储为凭据。
- 秘密文件 - 用于验证某些安全数据服务和安全握手的秘密文件。
- 带有私钥的 SSH 用户名 - 用于机器到机器身份验证的 SSH 公钥/私钥对。
- 证书 - PKCS#12 证书文件和可选密码。
- Docker 主机证书身份验证凭据。
正如我们所猜测的,这可以使用常用插件扩展到其他几种可扩展的凭证类型,例如 AWS 凭证、Azure 机密等。
15. Jenkins 凭证的范围是什么?
Jenkins 凭证可以是两个范围之一 - 全局和系统
全局 -凭证可用于 Jenkins 实例中配置的所有作业(即所有作业)。这更适合用户作业(即用于自由式、管道或其他作业)向目标服务/基础设施进行身份验证以完成作业的目的)
系统 -这是一个特殊的范围,它将允许 Jenkins 本身(即核心 Jenkins 功能和一些已安装的插件)向外部服务/基础设施验证自己以执行一些定义的任务。例如发送电子邮件等。
16. Jenkins常见面试题有哪些:什么是 Jenkins 共享库,它有什么用处?
随着组织开始使用越来越多的管道作业,每个管道作业中都有可能复制越来越多的代码,因为大多数作业的构建/自动化过程的一部分将是相同的。在这种情况下,每个其他即将到来的新工作也应该复制同一段代码。为了避免重复,Jenkins 项目引入了共享库的概念,以编码 - DRY - 不要重复自己。
共享库是一组代码,可以对多个管道作业通用,并且可以单独维护。这些库改进了管道代码的维护、模块化和可读性。它还加快了新工作的自动化。
17. 如何以编程方式触发/停止/控制 Jenkins 作业?
Jenkins 远程访问 API 可用于执行以下操作:
- 从 Jenkins 检索有关作业、视图、节点、构建等的信息以用于程序化消费。
- 触发构建(参数化和非参数化)、停止/中止构建、启用/禁用作业、将作业分组到视图中/从视图中删除等。
- 创建/复制/修改/删除作业。
以及许多其他特定于编程语言的功能。它具有主要编程语言的包装器,如 Python、Ruby 和 Java。它可以通过 CURL 触发,如下所示 -
没有参数的作业
只是 JENKINS_URL/job/JOBNAME/build 上的一个 HTTP POST。
带参数的作业
简单示例 - 发送“字符串参数”:
curl JENKINS_URL/job/JOB_NAME/buildWithParameters --user USER:TOKEN --data id=123 --data verbosity=high
18.如何在Jobs/Pipelines或master以外的节点中以编程方式获取Jenkins版本?
要检查 Jenkins 的版本,请加载顶级页面或任何顶级远程访问 API 路径,如“.../api/*”页面,然后检查“X-Jenkins”响应标头。
这包含 Jenkins 的版本号,如“1.404”。这也是检查 URL 是否为 Jenkins URL 的好方法。
19. 当 Jenkins 代理离线时会发生什么,这种情况下的最佳实践是什么?
Jenkins面试题解析:当作业绑定到特定节点上的特定代理时,该作业只能在该代理上运行,其他代理无法完成作业请求。如果目标节点离线或该特定节点上的所有代理都忙于构建其他作业,则触发作业必须等到该节点上线或该节点的代理变得可用于执行触发构建请求。
因此,触发的作业有时可能会在不知道目标节点离线的情况下无限期地等待。因此,将作业与一组节点和代理相关联始终是最佳实践,这些节点和代理用“标签”表示。一旦作业绑定到标签,而不是特定的节点/代理,当作业被触发时,属于标签的任何节点/代理都可以满足构建请求。通过这种方式,我们可以减少构建的整体周转时间。
即使作业等待节点/代理的更多时间,也是时候考虑添加更多节点/代理。
20. 什么是Blue Ocean?
Blue Ocean 是 Jenkins 重新定义的用户体验。专为 Jenkins Pipeline 重新设计,它仍然兼容自由式作业,Blue Ocean 减少了混乱并提高了清晰度。Blue Ocean 的主要功能包括 -
- 持续交付 (CD) 管道的复杂可视化,允许快速直观地了解管道的状态。
- 管道编辑器 - 通过引导用户通过直观和可视化的过程来创建管道,使管道的创建变得平易近人。
- 个性化以适应团队每个成员基于角色的需求。
- 在需要干预和/或出现问题时精确定位。Blue Ocean 显示了管道中需要注意的地方,促进异常处理并提高生产力。
- 分支和拉取请求的本机集成,在与 GitHub、Bitbucket 等中的其他人协作编写代码时,可最大限度地提高开发人员的生产力。
常规 UI - 作业详细信息页面
21. 什么是 Jenkins 用户内容服务?
Jenkins 有一种称为“用户内容”的机制,管理员可以将文件放在$JENKINS_HOME/userContent文件夹中,这些文件从 yourhost/jenkins/userContent 提供。
这可以被认为是一个迷你 HTTP 服务器,用于提供图像、样式表和其他静态资源,你可以从 Jenkins 内的各种描述字段中使用这些资源。
高级Jenkins常见面试题和答案合集
22. 使用Jenkins如何实现持续集成?
持续集成是一个过程,其中开发人员的代码更改不断集成到主代码中,并且会自动测试,测试结果将决定更改是否准备好部署。在这个过程中——
- 开发人员在功能/开发分支中进行更改 - commit/pull_request
- 源代码控制管理系统生成适当的事件
- SCM 特定的 Jenkins 插件(如 Git/SVN)将从配置的存储库中检测这些事件,这些事件将用于在 Jenkins 上触发 - 构建/依赖/测试 - 作业
- 测试/依赖作业完成后,将根据测试作业的状态标记更改/补丁
- 基于状态(即更改与主分支合并的准备情况),持续交付或持续部署策略/工具将推进它。
23. 什么是工件归档以及如何在流水线中进行归档?
工件是特定作业构建的可导出/可存储/可存档结果。这可以使用名为 - Copy artifact Plugin 的插件进行配置。根据配置的模式,匹配配置模式的文件/目录将被归档用于 Jenkins 构建,以供将来参考。在管道中,它可以配置如下——
存档工件工件:'输出/**/*'
24. 如何在 Artifacts Archival 中配置包含和排除?
工件存档采用匹配目标文件的模式。同样,它还采用一种模式(用于匹配文件的 ANT 构建系统模式)进行排除,在选择要存档的文件时将忽略该模式。
例如,
archiveArtifacts 工件:'output/*.txt',排除:'output/specific_file.txt'
上述命令将存档输出文件夹中除 specific_file.txt 之外的所有文本文件
25. 我们如何在 Jenkins Job 的不同构建步骤或阶段之间共享信息?
每个构建步骤或阶段都将在其过程中运行,因此在两个不同的构建步骤之间共享信息并不是那么直接。我们可以使用文件、数据库条目、环境变量等来共享从一个构建步骤到另一个构建步骤或构建后操作的信息。
26. 如何在 CI 环境中使用 Jenkins 测量/跟踪代码覆盖率?
使用特定于语言的代码覆盖率插件(如 JaCoCo、CodeCov 等)或通用工具/插件(如 Sonarqube)将代码覆盖率数据添加到构建中,并在代码中进行一些小调整,并且可以在 Jenkins 中将其显示为图形。
27. Jenkins 的默认环境变量 & 如何引入自定义环境变量?
Jenkins 默认提供了几个环境变量,如 - BRANCH_NAME、BUILD_NUMBER、BUILD_TAG、WORKSPACE 等。
28. 如何将作业配置重置为较早的版本/状态?
从作业详细信息页面,我们可以使用作业配置历史记录 - 查看差异、查看和从我们对特定作业所做更改的历史记录中恢复作业配置。当某人错误地错误配置作业时,这将非常有用,它可以被审查并轻松恢复到任何早期状态。
29.Jenkins常见面试题有哪些:如何在Jenkins中进行全局工具配置?
Global Tools 是需要安装在 Jenkins 环境之外的工具,需要在 Jenkins 环境内部进行控制。因此它也需要相应的 Jenkins 插件。使用全局工具的步骤通常包括 -
- 将工具插件安装到 Jenkins 实例中,将全局工具包含到 Jenkins 使用的全局工具列表中。
- 在 Jenkins 实例中安装该工具或在运行时提供(可能是下载和)安装该工具的命令。
- 转到管理 Jenkins -> 全局工具配置并滚动工具列表并配置全局工具特定的配置。
- 在你的作业/管道中使用已安装的全局工具。
30. 如何在 Jenkins 中创建和使用共享库?
在流水线代码中使用 Jenkins 共享库的基本要求是 -
- SCM 中带有管道共享库代码的存储库。
- Jenkins 实例的适当 SCM 插件配置。
- 全局共享库应该在 Jenkins 全局配置中进行配置。
- 在流水线代码中包含共享库并使用 Jenkins 共享库中定义的方法。
例如
#!/urs/bin/env groovy
@Library('fs_jenkins_shared_library@v2.0.7')_
31. 如何安装自定义 Jenkins 插件或 Jenkins 更新中心不可用的插件版本?
Jenkins面试题解析:通常,最佳做法是使用最新版本的插件。但是有一些方法可以安装自定义插件或已发布插件的过时版本。Jenkins 插件使用 .hpi 文件导出,并且可以通过多种方式安装 -
使用 Jenkins CLI
java -jar jenkins-cli.jar -s http://localhost:8080/ install-plugin SOURCE ... [-deploy] [-name VAL] [-restart]
上面的命令从文件、URL 或更新中心安装插件。
- SOURCE:如果这指向本地文件,则将安装该文件。如果这是一个 URL,Jenkins 会下载该 URL 并将其作为插件安装。否则,该名称被假定为现有更新中心中插件的短名称(如“findbugs”),插件将从更新中心安装。
- -deploy:立即部署插件,而不会将它们推迟到重新启动。
- -name VAL:如果指定,插件将以此短名称安装(而通常名称是自动从源名称推断出来的)。
- -restart:安装成功后重启Jenkins。
高级安装 - 通过 - Web UI
假设已经下载了 .hpi 文件,登录的 Jenkins 管理员可以从 Web UI 中上传文件:
- 导航到 Web UI 中的管理 Jenkins > 管理插件页面。
- 单击高级选项卡。
- 选择 Upload Plugin 部分下的 .hpi 文件。
- 上传插件文件。
- 重启 Jenkins 实例
高级安装 - 通过 - 在 master 上
假设系统管理员已明确下载 .hpi 文件,管理员可以手动将 .hpi 文件放置在文件系统上的特定位置。
将下载的 .hpi 文件复制到 Jenkins 控制器上的 JENKINS_HOME/plugins 目录中(例如,在 Debian 系统上,JENKINS_HOME 通常是 /var/lib/jenkins)。
在加载插件并在 Jenkins 环境中可用之前,需要重新启动 master。
32. 如何以编程方式下载特定 Jenkins 构建的控制台日志?
使用 Jenkins CLI - 控制台 - 命令
java -jar jenkins-cli.jar 控制台作业 [BUILD] [-f] [-n N]
将特定构建的控制台输出生成到标准输出,就像你在执行“cat build.log”一样
- 工作:工作名称
- BUILD:内部版本号或指向内部版本的永久链接。默认为最后一次构建
- -f:如果构建正在进行中,则附加控制台输出,如 tail -f
- -n N:显示最后 N 行。
例如
ssh -l <ssh_username> -p <port_no> <Jenkins_URL> 控制台 <JOB_NAME>
33. 什么是 Jenkins 远程访问 API?
Jenkins 为其大部分功能提供远程访问 API(尽管某些功能依赖于编程语言)。目前,它有三种口味——
- XML
- 支持 JSONP 的 JSON
- Python
远程访问 API 以类似 REST 的风格提供。也就是说,所有功能都没有单一的入口点,而是在“.../api/” URL 下可用,其中“...”部分是它所作用的数据。
例如,如果你的 Jenkins 安装位于 Interviewbit.com,访问 /api/ 将仅显示可用的顶级 API 功能 - 主要是此 Jenkins 实例的已配置作业列表。
或者,如果我们想访问有关特定构建的信息,例如 https://ci.jenkins.io/job/Infra/job/jenkins.io/job/master/lastSuccessfulBuild/,然后转到 https://ci.jenkins .io/job/Infra/job/jenkins.io/job/master/lastSuccessfulBuild/api/,你将看到该构建的功能列表。
34. 什么是进程内脚本审批及其工作原理?
Jenkins 和几个插件允许用户在 Jenkins 中执行 Groovy 脚本。为了保护 Jenkins 免受恶意脚本的执行,这些插件在 Groovy 沙箱中执行用户提供的脚本,以限制可访问的内部 API。
这种保护由脚本安全插件提供。一旦在任何脚本中使用了不安全的方法,“进程内脚本批准”操作应出现在“管理 Jenkins”中,以允许管理员决定哪些不安全方法(如果有)应在Jenkins环境。
这种进程内脚本批准本质上提高了整个 Jenkins 生态系统的安全性。
35. Jenkins常见面试题有哪些:我们可以使用常见的可观察性工具来监控 Jenkins 吗?
常见的监控平台,如DataDog、Prometheus、JavaMelody和其他一些平台——有相应的 Jenkins 插件,配置后,将指标发送到相应的监控平台,然后可以使用最新的工具和技术进行观察。同样可以配置警报和通知,以便在出现问题时立即引起注意。
36. 什么是 Jenkins 中的 Ping 线程以及它是如何工作的?
Jenkins面试题解析:Jenkins 会在每个远程连接上安装“ping 线程”,例如 Controller/Agent 连接,而不管其传输机制(例如 SSH、JNLP 等)。Jenkins Remoting Protocol 的下层是一个面向消息的协议,一个 ping 线程周期性地发送一个 ping 消息,接收端会回复。ping 线程测量回复到达所需的时间,如果花费的时间过长(当前为 4 分钟且可配置),则它假定连接丢失并启动正式关闭。
这是为了避免无限挂起,因为否则无法检测到网络中的某些故障模式。超时也设置为足够长的值,以便负载的临时激增或长时间的垃圾收集暂停不会导致关闭。
控制器和代理上都安装了 Ping 线程;每一方都互相 ping 对方,并试图从他们的方面检测问题。
ping 线程超时通过 java.util.logging 报告。此外,控制器还会在代理启动日志中报告此异常。请注意,某些代理启动程序,尤其是 SSH 代理,会将代理 JVM 的所有 stdout/stderr 输出写入同一个日志文件中,因此你需要小心。
Jenkins常见面试题和答案合集结论
虽然这些并不是 Jenkins 的全部可能性,但我们试图涵盖一些关于 Jenkins 核心的常见面试问题。我们还需要了解 Jenkins 更新中心丰富了数千个有用的插件,这些插件增强了 Jenkins 支持的功能。
在参加面试之前,请确保在任何受支持的平台上安装 Jenkins 服务器 - 无论是在本地还是在云上,安装最常用的插件(由 Jenkins 本身和其他常用插件建议)。尝试使用 Git 或任何其他 SCM 集成插件创建和构建一个普通的自由式项目,并尝试从连接的 Git 存储库执行一些代码。
此外,尝试使用 JenkinsFile 和全局共享 Jenkins 库创建管道项目并成功构建作业。这将帮助我们了解 Jenkins 如何实际处理一些实际问题。