Maven 限制在快照依赖项上触发哪些下游生成
我们有一个Jenkins服务器,每当(php或java)项目具有有效的pom.xml时,使用Jenkins build per branch从git同步。我们使用maven版本控制策略来管理我们的人工制品,并将git流作为分支策略/工具。我们还尽可能使用jenkins选项“每当构建快照依赖项时构建” 我们所面临的问题是,当构建一个快照人工制品时,所有的地狱都会被释放,所有想要构建的东西都会立刻被释放。(构建“开发”-快照导致所有下游“功能”和“开发”分支启动) 理想情况下,当jenkins启动下游工作时,我们希望找到一些方法,使功能和开发构建之间不交叉轮询Maven 限制在快照依赖项上触发哪些下游生成,maven,jenkins,git-flow,Maven,Jenkins,Git Flow,我们有一个Jenkins服务器,每当(php或java)项目具有有效的pom.xml时,使用Jenkins build per branch从git同步。我们使用maven版本控制策略来管理我们的人工制品,并将git流作为分支策略/工具。我们还尽可能使用jenkins选项“每当构建快照依赖项时构建” 我们所面临的问题是,当构建一个快照人工制品时,所有的地狱都会被释放,所有想要构建的东西都会立刻被释放。(构建“开发”-快照导致所有下游“功能”和“开发”分支启动) 理想情况下,当jenkins启动下
有人试过这个吗?是否需要条件+构建步骤+插件帮助 在我们Jenkin的工作中,我看不到类似于“构建上游依赖项时构建”这样的选项。这里称之为“构建快照依赖项时构建”(Jenkins v1.592及其最新插件)。这就是你的意思吗 在其内联帮助中还有最后一句话:“如果此行为有问题,请取消选中此选项。”:-) 我不知道条件BuildStep插件在这种情况下是否有帮助。我们使用它,但不是为了实现这样的目标 根据您的工作运行时间,我建议:
这是一个老生常谈的问题,但6年后它仍然是相关的。每当生成快照依赖项时,
生成上都有一个“阈值”字段,该字段提供了对触发哪些生成的一些控制
从:
基于Maven中达到的阈值
构建上游作业(打包、安装、部署)。默认情况下,只有
到达部署阶段的maven构建将在下游触发
建立
例如,在脚本化管道的with maven()
中,可以使用lifecycleThreshold:“deploy”
设置pipelineGraphPublisher
,例如:
withMaven(
maven: MAVEN_VERSION,
jdk: JAVA_VERSION,
mavenOpts: MAVEN_OPTS,
globalMavenSettingsConfig: globals.MAVEN_SETTINGS_ID,
options: [
pipelineGraphPublisher(
lifecycleThreshold: 'deploy',
includeSnapshotVersions: true
)
]) {
sh("mvn ${PHASE}")
}
然后,执行deploy
(例如package
或install
)以下生命周期阶段的任何快照生成都不会触发下游作业。请注意,deploy
已经是默认设置,因此此示例并不特别有用,但它显示了如何使用该设置,您可能希望将其设置为另一个阶段
这是第一部分完成的,但是现在您需要一种方法来有条件地执行不同的Maven生命周期阶段,用于您确实希望触发下游构建的构建和您不希望触发下游构建的构建。我们根据分支名称执行此操作,以便拉请求和发布分支不会触发上游包:
/**
* Return the correct Maven goal for the current branch
*
* Because the pipelineGraphPublisher's lifecycleThreshold in the withMaven() call above is set to 'deploy', pipelines
* that run the 'install' goal will not trigger downstream jobs; this helps us minimize superfluous Jenkins builds:
*
* https://github.com/jenkinsci/pipeline-maven-plugin/blob/master/README.adoc#trigger-downstream-pipeline-when-a-snapshot-is-built
*/
String getGoalForCurrentBranch() {
if ( env.BRANCH_NAME ==~ /(^PR-(\d+)$)|(^releases\/v.*)/ ) {
echo("Pull Request or release branch detected! Executing Maven 'install' goal rather than 'deploy' goal to avoid triggering downstream Jenkins jobs")
return 'install'
}
return 'deploy'
}
然后,您可以在执行mvn
的任何位置调用此getGoalForCurrentBranch()
方法,以确定执行哪个生命周期阶段:
withMaven(
...
sh("mvn ${getGoalForCurrentBranch()}")
)
大多数分支将执行mvn deploy
并触发下游Jenkins作业,但Pull-Request分支将执行mvn install
并不会触发下游作业
需要注意的是,您可能有其他依赖于特定生命周期阶段的东西。在上面的示例中,拉请求分支工件不会部署到工件存储库(例如Nexus)。在我们的例子中,这实际上是所需的行为,但您需要确定什么是可接受的,并相应调整阈值。是的,您是正确的,我的错误-我编辑了问题以显示正确的“每当生成快照依赖项时生成”文本。谢谢你指出这一点!一些好的方面,尽管它的问题不足以保证禁用它。它是有用的(我们可以使用POM来更新依赖关系管理,而不是对数百个作业进行手动配置),但由于我们有一个cloudbees Enterprise Jenkins许可证,其中包含数量有限的构建从属,这确实意味着我们有时会被不需要的作业阻塞,并且没有尽可能高效地使用资源。不过,您给了我一个想法,如果我们在开发中停止使用快照版本,这可能会缓解问题。我试着做几件事:-)我们面临着同样的问题。你解决过这个问题吗?