Jenkins和Gradle-使用CI依赖关系的最新版本,生产专用版本构建项目

时间:2019-02-05 12:19:25

标签: jenkins gradle ivy

我正在使用Jenkins,Gradle和我们的Ivy存储库。

我们的构建脚本指定了用于构建的依赖关系的确切版本。这是生产的好习惯。

对于CI,如果项目构建使用我们自己的库的最新版本会很有趣,这样,我们不仅可以查看库更改是否“破坏了该库的构建”,而且还可以查看它们是否破坏了使用它们的项目。那似乎就是“整合”的重点!

我知道gradle将采用"1.+"而不是"1.2.3",因此我可以在CI服务器上修改该项目的build.gradle来实现这一目标。但是,也许有一种更整洁的方法(构建脚本将其识别为处于CI模式,并且使用最新版本而非特定版本,也许是通过在build.gradle上运行sed脚本来进行更改)。

我在詹金斯或gradle中缺少什么吗?是否有实现此目标的gradle插件,或用于实现此目标的替代方法?

4 个答案:

答案 0 :(得分:1)

如果您想拥有最新版本,可以只使用latest,或者更容易使用[1.0,)之类的东西来匹配大于或等于1.0的所有版本(假设1.0是您的“最小版本”永远”)在here中查找其他匹配模式,也可以将其与statuses结合使用。

另一种方法是仅在jenkins从属服务器上具有本地文件系统ivy存储库,该库具有所有最新版本的库,其要点是,该存储库无法从开发人员工作站/笔记本电脑/ VM进行访问。然后您只需以某种方式在gradle设置中使用它(例如,仅在jenkins从属服务器上定义一个环境变量)。这意味着您无需更改build.gradle

答案 1 :(得分:1)

类似的东西可能适用于詹金斯:

if(System.getenv("BUILD_EXPERIMENTAL") == null) {

    // known to be stable versions       
    apply from: "dependencies.gradle"

} else {

    // bleeding edge versions 
    apply from: "experimental.gradle"

}

这只需要将同一个项目设置两次,一次有无环境变量BUILD_EXPERIMENTAL,用于控制应用哪个dependencies块。

如果您希望通常将其应用,则在使用Jenkins构建项目时,只需将BUILD_EXPERIMENTAL替换为BUILD_NUMBER(默认情况下,该环境中已设置)。

答案 2 :(得分:1)

我建议利用Gradle dependency locking实现这一目标。

  • 在构建中,您将dynamic versions用于依赖项,并锁定为众所周知的状态。
  • 开发人员和生产版本将解决这些锁定的版本。
  • 在CI上,您可以运行一个(一组)专用作业,并且一次updates the lock state可以运行一个或多个模块。根据这些反馈,您甚至可以提交此依赖项升级,或者至少为其打开一个拉取请求。

答案 3 :(得分:0)

这是我自己的答案,灵感来自@Martin Zeitler的答案。

我们有一个通用的构建脚本,该脚本已应用于所有项目build.gradle,用于设置通用选项,设置和任务。我们想添加此逻辑,但使其成为可选的并且不破坏现有的构建脚本。

该逻辑将由project.ext.buildJenkinsWithLatesttrue属性false激活和控制。

当逻辑处于活动状态时,将使用项目文件dependencies-production.gradledependencies-jenkins.gradle的依赖关系。仅当属性为true且通过BUILD_NUMBER环境变量检测到CI环境时,才会使用Jenkins依赖项。

通用构建脚本包含以下内容:

if (project.ext.has('buildJenkinsWithLatest')) {
    println "Using conditional dependency management..."
    //BUILD_NUMBER is not null if this is a Jenkins build
    if(project.ext.buildJenkinsWithLatest == true && System.getenv("BUILD_NUMBER") != null) {
        println "--- Using alternative dependencies..."
        apply from: "dependencies-jenkins.gradle"
    }
    else {
        println "--- Using production dependencies..."
        apply from: "dependencies-production.gradle"
    }
}
else {
    println "Conditional dependency management is not active"
}

现在,任何已应用此脚本的项目build.gradle都将在运行时打印此内容:

Conditional dependency management is not active

要使用该功能,我们需要对项目进行以下操作:

  1. 为我们要动态选择版本的库创建一个包含dependencies-jenkins.gradle子句的dependencies {}
  2. 创建一个dependencies-production.gradle,其中包含这些库的dependencies {}子句,但提供了特定的版本。
  3. 从项目dependencies {}中剩余的任何build.gradle中删除库。
  4. 将属性project.ext.buildJenkinsWithLatest设置为truefalse
  5. 应用通用构建脚本(设置属性后!)。

例如,在dependencies-jenkins.gradle中使用最新的2.x.x版本:

dependencies {
    compile 'example:my-library:2+'
}

有关如何以动态方式指定版本的信息,请参见@CantSleepNow的答案。

dependencies-production.gradle中使用特定版本:

dependencies {
    compile 'example:my-library:2.3.4'
}

然后在build.gradle中设置属性并应用通用构建脚本:

...

project.ext.buildJenkinsWithLatest = true;
apply from: '../bxgradle/bx-std.gradle'

...

现在,当在Jenkins上运行构建时,将使用替代依赖项。如果要在具有生产依赖关系的Jenkins上构建它,则将project.ext.buildJenkinsWithLatest设置为false