20

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

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

我最近看到了 QuickBuild,它具有作业继承,其中父作业可以定义一组标准步骤,其子作业可以覆盖和专门化。使用 Jenkins,我有工作副本,这很好,直到我需要更改某些内容。使用 QuickBuild,工作之间的关系让我可以毫不费力地传播我的更改。

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

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

4

6 回答 6

13

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

此处提供可能对您有所帮助的更多链接:

于 2013-07-24T14:10:33.793 回答
2

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

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

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

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

希望有帮助。

于 2011-11-16T07:51:52.250 回答
1

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

Quickbuild 是一个很棒的产品。它应该在 $40k 级别,但它的价格要低得多。虽然我确信 Jenkins 可以做到这一点,但它会有点笨拙,而 Quickbuild 已经内置了这个功能。我之前已经在产品之上实现了复杂的行为(例如 SVN 1.0 中的合并跟踪)并且后悔了。Quickbuild 价格合理,为我们的构建和测试系统提供了坚实的基础。

目前,我在一家使用 Bamboo 的公司,希望它的新特性分支特性能够提供 Quickbuild 可以做的大部分事情

于 2012-07-18T13:37:42.630 回答
1

EZ Templates插件允许您将任何作业用作其他作业的模板。真是太棒了。您只需将基本作业设置为模板:

在此处输入图像描述

* 通常你也会禁用基础作业(比如“抽象类”)。

然后创建一个新作业,将其设置为使用基本作业模板,然后保存: 在此处输入图像描述

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

注意:还有另一个用于配置模板的插件模板项目,但最近没有更新(最后一次提交于 2016 年)。

于 2020-11-15T15:18:04.563 回答
0

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

于 2013-02-08T15:45:54.470 回答
0

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

  • 使用带有jenkins 管道单元的jenkins 共享库来支持 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
}

使用示例

图书馆“我的共享詹金斯图书馆”

releasePipeline.runRelengPipelineEphemeralDocker {
    println "Running ${pythonScript}"
    def command = "${pythonInterpreter} -u ${pythonScript} --cluster=${options.clusterName}"
    sh command
}
于 2019-12-25T15:56:49.853 回答