詹金斯工作中的工作继承

时间:2011-06-30 21:13:41

标签: build jenkins continuous-integration quickbuild

如何处理Jenkins作业到构建过程的映射,是否能够在继承中构建级联配置?

对于任何给定的构建,我将至少有三个作业(标准持续集成/夜间,安全扫描,覆盖),然后是一些下游集成测试作业。配置切片器插件处理交叉作业的某些方面,但每个作业仍然是它自己的单独实体,与其组中的其他作业没有任何关系。

我最近看到了QuickBuild并且它具有作业继承,其中父作业可以定义一组标准步骤,其子代可以覆盖和专门化。有詹金斯,我有工作的副本,这是好的,直到我需要改变一些东西。使用QuickBuild,作业之间的关系可以让我轻松地传播我的更改。

我一直试图弄清楚如何在Jenkins中处理这个问题。我可以使用参数化构建触发器插件来允许作业调用其他人并覆盖方面。然后,我将从被调用的作业中获取数据到其调用者。我怀疑我会遇到一些问题,其中有些方面我无法覆盖,这将迫使我在我自己的脚本中实现Jenkins功能,从而使Jenkins不那么有用。

如何处理Jenkins构建作业的复杂性?您是否听说过QuickBuild存在任何严重问题?

6 个答案:

答案 0 :(得分:13)

我想向您指出我的团队开发并且最近才在开源下发布的插件的发布。 它实现了完整的“作业之间的继承”。

这里有更多可能对您有帮助的链接:

答案 1 :(得分:2)

我有同样的问题。我们有一组需要为我们的主干以及至少两个分支运行的作业。分支代表我们的版本,每隔几个月就会创建一个新的分支。手动创建新工作并不是解决方案,所以我检查了一些可能性。

一种可能性是使用template plugin。这使您可以创建一种类型的作业层次结构。它为构建器,发布者和SCM设置提供继承。对某些人来说可能有用,对我来说这还不够。

我检查的第二件事是克隆作业的Ant Script和他的兄弟Bash Script。这些真的很棒。我们的想法是让脚本创建一个新作业,从模板作业复制所有设置,根据需要进行更改。由于这是一个脚本,它非常灵活,你可以做很多事情。唯一的缺点是,这不会导致真正的层次结构,因此模板作业的更改不会反映已经克隆的作业,而只会反映将在未来创建的作业。

考虑到这两种解决方案的缺点和优点,两者的结合可能效果最好。您创建一个模板项目,其中包含一些适用于所有作业的基本设置,然后使用bash或ant脚本根据该模板创建作业。

希望有所帮助。

答案 2 :(得分:1)

我被问到这个问题的最终解决方案是什么......经过几个月与我们的采购系统的斗争,我们在Quickbuild上花了大约4000美元。在大约2-3个月的时间里,我们建立了一个模板化的构建系统,并对它非常满意。在我离开公司之前,我们在系统中有几个产品组,并且还在自动化发布过程。

Quickbuild是一款出色的产品。它应该在4万美元的级别,但它的价格要低得多。虽然我确信Jenkins可以做到这一点,但它会有点像kludge而Quickbuild已经融入了这个功能。我之前已经在产品之上实现了复杂的行为(例如SVN 1.0中的合并跟踪)并且后悔了。 Quickbuild的价格合理,为我们的构建和测试系统提供了坚实的基础。

目前,我正在使用Bamboo的公司,并希望其新功能分支功能将提供Quickbuild可以做的大部分工作

答案 3 :(得分:1)

EZ Templates插件允许您将任何作业用作其他作业的模板。真的很棒您所需要做的就是将基础作业设置为模板:

enter image description here

*通常,您还会禁用基本作业(例如“抽象类”)。

然后创建一个新作业,将其设置为使用基本作业模板,然后保存: enter image description here

现在编辑新作业-它将包含所有内容! (并且您可以覆盖现有配置)。

注意: 还有另一个Template Project插件,用于配置模板,但该插件最近未更新(最后一次提交于2016年)。

答案 4 :(得分:0)

我们使用quickbuild,它似乎对大多数事情都很有用。我甚至可以使用他们的API编写自定义插件。缺乏快速建筑的一个领域是声纳整合。声纳团队有一个Jenkins插件而不是一个用于quickbuild的插件。

答案 5 :(得分:0)

鉴于目标是DRY(不要重复自己),我目前赞成这种方法:

  • jenkins shared libraryjenkins pipeline unit结合使用以支持TDD
  • 使用groovy / python或任何您喜欢的语言来使用docker映像来执行需要api等的复杂操作
  • 保持实际的工作流程非常精简(基本上只是为了拉出构建参数并将它们传递给共享库中的函数,这些共享库可能使用docker映像来完成工作。

这非常有效,并且消除了围绕复杂构建作业的DRY问题。

共享管道Docker代码示例-vars / releasePipeline.groovy

/**
 * Run image
 * @param closure to run within image
 * @return result from execution
 */
def runRelengPipelineEphemeralDocker(closure) {

    def result

    artifactory.withArtifactoryEnvAuth {
        docker.withRegistry("https://${getDockerRegistry()}", 'docker-creds-id') {
            docker.image(getReleasePipelineImage()).inside {
                result = closure()
            }
        }
    }
    return result
}

用法示例

图书馆“ my-shared-jenkins-library”

releasePipeline.runRelengPipelineEphemeralDocker {
    println "Running ${pythonScript}"
    def command = "${pythonInterpreter} -u ${pythonScript} --cluster=${options.clusterName}"
    sh command
}