所以我正在考虑这个设置,但我甚至不确定它是否可行。我在一个更大的组织工作,我们想对各种项目进行静态代码分析和单元测试。这些项目都是遵循相同模式的模块,因此,为了简单起见,我说有30个项目都可以使用相同的Jenkinsfile
构建。 Jenkinsfile
的唯一区别是结帐阶段的存储库。
现在我在想是否有可能拥有一个包含Jenkinsfile
的存储库,并让其他30个存储库使用该存储库(使用“来自SCM的管道脚本”)来获取Jenkinsfile
。然后,我会在url
- git
命令中使用参数(或其他)设置Checkout
- 属性。
现在我的问题:
Jenkinsfile
放在与您要构建的存储库不同的存储库中。Jenkinsfile
的一个存储库(这显然不是我想要的。)任何答案,想法或建议都将受到高度赞赏。
答案 0 :(得分:3)
问:这样的设置是否可能? (将Jenkinsfile放在与您要构建的存储库不同的存储库中)。
答:是的。您可以指定Jenkins根据需要输入尽可能多的存储库。
问:如何使用轮询? Jenkins是否仍会轮询正确的存储库以进行更改(30个不同的存储库中的一个),或者它只会轮询包含Jenkins文件的一个存储库(这显然不是我想要的)。
答:它会轮询拥有Jenkinsfile的scm。如果您向Jenkinsfile添加更改,这一点很重要。为了解决这个问题(因为你指定这是你不想要的行为),你可以在你的仓库中添加提交钩子或令牌,如果仓库发生变化或其他情况发生时,它将基本上启动Jenkins工作(根据回购的不同而不同)您正在使用的托管工具,即Github vs gitlab vs bitbucket等)。否则你也可以手动启动,但自动化的方式听起来就像你想要的那样。
至于实施
这可以通过多分支管道完成。有一个存储库用于jenkins文件的所有变体,每个分支都有你提到的定义git scm <repo>
。这样你也可以在每个中都有令牌/钩子,这样如果在仓库中发生任何事情,相应的工作将自动启动。回到这一点的一个小问题是你可能在Jenkinsfile存储库中有30多个分支(或者多少取决于你拥有的存储库的数量)
您也可以按照上面提到的那样做,让Jenkinsfile作业为它将使用的repo取一个参数。我的团队有这样的工作,您指定git_url
和git_treeish
(分支),以便您可以将其指向主人或您的个人分叉进行测试。需要注意的是,每个构建都可能有不同的结果或工件,并且您必须在每个构建的基础上检查构建参数,以便知道如果存储库产生类似的工件或结果,您正在查看的内容。 (例如:如果您正在运行测试,则您的测试结果聚合可能不清楚,因为一个构建具有Project / Repo A的结果,而另一个构建具有来自Project / Repo B等的结果)。如果您将工件/结果转发给另一个作业,这不会是一个太大的问题,您可以将后期构建过程建立在最初提供的repo参数上。
如果您对更多详细信息发表评论,我可以为您提供一些代码段,或者如果您需要,可以发布带有示例的要点。
答案 1 :(得分:2)
这应该使用共享库来完成。这使得一切工作变得简单,包括轮询,但集中了代码。您仍然必须能够触摸每个项目以在每个仓库中放置Jenkins文件,但Jenkinsfile可以是对共享库的最小调用。
这是一个优雅的解决方案,因为每个repo都可以根据需要设置一些项目特定的变量,然后进行调用。如果你能够在每个仓库中放置一个Jenkins文件,这就是这样做的方法。