在多个流水线之间共享 Jenkinsfile(来自不同源代码仓库)

88次阅读
没有评论

问题描述

想要编写一个共享于多个流水线(约50个)之间的 Jenkinsfile,每个流水线负责从特定源代码(git)仓库创建一个库。目前,用户有一个使用 SCons 和构建参数的作业,用于指定/计算要构建的仓库,但这涉及每次克隆大约50个仓库,而且会导致一些功能(如git提交注释)无法正常工作(进行构建的仓库不是包含构建器代码的仓库,通常只显示”无更改”)。用户想知道是否有更好的方法来处理这种情况。用户在这个问题中看到了共享库是建议的解决方案,但尽管共享库可以简化 N 个 Jenkinsfile,但在用户看来并没有减少其数量。用户希望尽可能避免在源代码仓库中放置任何 Jenkinsfile(也许可以在作业配置中包含信息,总结为”从另一个仓库中检出并运行此 Jenkinsfile,就像它在本仓库中一样”)。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

共享库中的基本 Jenkinsfile

在处理多个流水线共享 Jenkinsfile 的情况下,你可以使用 Jenkins 的共享库(Shared Library)。共享库允许你将 Pipeline 代码集中管理,但实际的 Jenkinsfile 仍然需要加载/执行共享库代码。以下是一种处理方法:

  1. 创建一个共享库,其中包含你的基本 Jenkinsfile 代码。这个 Jenkinsfile 只负责加载和执行共享库中的代码。
  2. 在你的各个流水线的 Jenkinsfile 中,只需调用共享库中的 Jenkinsfile。这样,你就可以在不同的流水线中共享相同的基础 Pipeline 逻辑,而不必在每个仓库中都复制相同的 Jenkinsfile。

你可以参考 Jenkins 官方文档中的相关主题:https://www.jenkins.io/doc/book/pipeline/shared-libraries/#defining-declarative-pipelines,了解如何创建和使用共享库中的 Jenkinsfile。

外部工具用于确保 Jenkinsfile 存在

如果你想要确保每个仓库都包含一个 Jenkinsfile,可以使用外部工具来实现。以下是一个可能的处理方法:

  1. 使用外部工具,例如 Terraform,来创建仓库模板。在模板中包含一个简单的 Jenkinsfile,其中只需加载和执行共享库代码。
  2. 使用类似 Thor 这样的工具,将一些文件(包括 Jenkinsfile 在内)同步到仓库中,以保持与中央仓库的副本一致性。这样,无论是创建新仓库还是对现有仓库进行更改,都可以确保简单的 Jenkinsfile 存在于仓库中。

这种方法可以帮助你确保每个仓库都有一个基本的 Jenkinsfile,而这个 Jenkinsfile 只需要负责加载和执行共享库中的代码。

总结

在处理共享 Jenkinsfile 时,你可以使用 Jenkins 的共享库来管理 Pipeline 代码,同时使用外部工具来确保每个仓库都包含一个简单的 Jenkinsfile,从而实现基本的共享逻辑。

请注意,具体的实施细节可能会因你的项目和环境而有所不同,你可以根据实际情况进行调整和优化。

正文完