我正在使用Jenkins,Gradle和我们的Ivy存储库。
我们的构建脚本指定了用于构建的依赖关系的确切版本。这是生产的好习惯。
对于CI,如果项目构建使用我们自己的库的最新版本会很有趣,这样,我们不仅可以查看库更改是否“破坏了该库的构建”,而且还可以查看它们是否破坏了使用它们的项目。那似乎就是“整合”的重点!
我知道gradle将采用"1.+"
而不是"1.2.3"
,因此我可以在CI服务器上修改该项目的build.gradle来实现这一目标。但是,也许有一种更整洁的方法(构建脚本将其识别为处于CI模式,并且使用最新版本而非特定版本,也许是通过在build.gradle
上运行sed脚本来进行更改)。
我在詹金斯或gradle中缺少什么吗?是否有实现此目标的gradle插件,或用于实现此目标的替代方法?
答案 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实现这一目标。
答案 3 :(得分:0)
这是我自己的答案,灵感来自@Martin Zeitler的答案。
我们有一个通用的构建脚本,该脚本已应用于所有项目build.gradle
,用于设置通用选项,设置和任务。我们想添加此逻辑,但使其成为可选的并且不破坏现有的构建脚本。
该逻辑将由project.ext.buildJenkinsWithLatest
或true
属性false
激活和控制。
当逻辑处于活动状态时,将使用项目文件dependencies-production.gradle
或dependencies-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
要使用该功能,我们需要对项目进行以下操作:
dependencies-jenkins.gradle
子句的dependencies {}
。dependencies-production.gradle
,其中包含这些库的dependencies {}
子句,但提供了特定的版本。dependencies {}
中剩余的任何build.gradle
中删除库。project.ext.buildJenkinsWithLatest
设置为true
或false
。例如,在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
。