将所有内容存储到文件系统中,是导致 Jenkins 无法实现 "Cloud Native" 模型中 HA、零停机时间或按使用付费等功能的主要原因。 尽管有很多插件实现了这一部分,但这对于用户配置来说会变得很麻烦,从可用性角度来看,甚至可以说是噩梦,正如 JEP-300 所指出的那样。 在有意义的情况下使用云服务模型,在云或容器化环境中运行 Jenkins 的整体复杂性大大降低。其他相关项目包括 Jenkins X 和 Jenkins Evergreen, 它们将从 Jenkins 的 Cloud Native 存储中受益匪浅。
有几个明确的领域需要改进,这些领域在此进行了总结,并将在以后的文档中详细介绍。 主要的症结是将本地磁盘用作通用存储,这会导致在容器化或分布式运行环境中有问题,需要高性能的文件系统,所有的配置都很痛苦,如初始大小调整和停机时间调整大小。 我们相信,通过使用云服务,可以提高整体可用性、性能和可扩展性,同时实现新的需求功能。
您可以在 此博客 中找到有关可插拔存储和优先级的更多信息。 云原生特别兴趣小组(Cloud Native SIG) 中提供了 Jenkins JEP 的完整列表。
以下是正在进行的活动及其现状的摘要:
类型 | 状态 | JEPs | 备注 |
---|---|---|---|
制品 |
可用 |
||
凭据 |
可用 |
N/A |
在 JEP 流程提出之前完成 |
构建日志 |
进行中 |
||
系统日志 |
可用 |
N/A |
Jenkins 支持使用 |
任务日志 |
未开始 |
存储系统日志和各种任务(例如代理连接或 SCM 轮询) |
|
配置 |
进行中 |
||
测试结果 |
进行中 |
即将到来 |
|
代码覆盖率结果 |
探索中 |
TBD |
|
运行 |
未开始 |
在外部数据库中存储完整运行记录 |
|
任务 |
未开始 |
在外部数据库中存储任务配置和特定的元数据。像 Jenkins Pipeline 和 JobDSL,通过在 SCM 中保存配置来解决这种情况。 |
|
指纹 |
未开始 |
提出作为 GSoC 2019 项目: Jenkins 的外部指纹存储 |
|
工作空间 |
未开始 |
提出作为 GSoC 2019 项目: 外部工作空间管理器插件的云特性 |
上面的列表并不完整。可以根据反馈考虑其他存储类型。 你可以在 此博客 中找到更多关于可插拔存储和优先级的信息。
许多现有的插件允许从外部存储上传和下载工件(例如 S3、Artifactory、通过 SFTP 发布等等),但是没有插件可以在不使用新步骤的情况下透明地完成这项工作。 在许多情况下,artifacts 也通过 master 上传,这会增加系统的负载。 如果在外部存储 artifacts 的步骤时有一层允许使用 Archive Artifacts 等,那就太好了。
Jenkins 2.118+ offers 提供了一个扩展的 jenkins.util.VirtualFile API,允许使用 ArtifactManagerFactory 扩展点实现外部工件管理器 。
实施示例:
实施示例:
日志磁盘使用导致前面提到的工件相同的问题。 此外,https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html[AWS CloudWatch Logs] 等外部集中日志存储允许所需的功能,如集中日志管理、日志保留策略、高级查询等。 已经有外部将日志发送到后端的选项,或者像 aws 那样执行此操作的插件 aws-cloudwatch-logs-publisher-plugin,但没有集成的方法来发送和显示来自外部日志存储的日志。 外部日志存储工作将作为问题进行跟踪:38313[]。
参考实施:
相关JEP:
虽然配置不是很大,但是将它们外部化是获得高可用性或一次性 Jenkins master 的关键任务。 在 Jenkins 中存储配置的方法有很多,但 95% 的情况由 XmlFile 层覆盖,该层将对象序列化到磁盘并使用 XStream 库读取它们。 外部化这些 XmlFile 将是向前迈出的一大步。
外部化配置有几个原型,例如在 DotCI 中。还有其他实现可以被更新为 Jenkins core。
相关JEP:
在 Credentials Plugin 1.15+ 中,有一个 CredentialsProvider 扩展点,允许引用和解析外部凭据。 此引擎允许为实现 Credentials API 的插件实现外部凭据。
实施示例:
Jenkins 中的其他凭据 API(如 jenkinsdoc:hudson.util.Secret)不受支持。
在常见的 CI/CD 用例中,测试报告正在消耗大量空间。JENKINS_HOME
指向该数据存储,当前存储格式在检索统计信息,尤其是趋势信息时需要巨大的开销。
为了显示趋势信息,必须加载每个报告,然后在内存中处理。
外部化测试结果的主要目的是通过从专用外部存储器(例如来自 Elasticsearch 等基于文档的数据库)查询所需数据来优化 Jenkins 逻辑。 根据当前的计划,JUnit 插件将被扩展,以便在其 API 中支持这种外部存储,这些 API 被测试报告插件广泛使用。
状态:
开始基础工作
本页仅总结了正在进行的工作的状态。我们在云原生特别兴趣小组(Cloud Native SIG)中考虑了其他可插入存储描述。有关更多详细信息和链接,请参见 SIG 页面。