我们有一个Jenkins服务器,只要(php或java)项目有一个有效的pom.xml,就可以使用jenkins-build-per-branch从git同步。我们使用maven版本控制策略来管理我们的人工制品,并使用git-flow作为分支策略/工具。我们还尽可能使用jenkins选项“构建SNAPSHOT依赖关系时构建”。
我们遇到的问题是建造一个-SNAPSHOT人工制品 - 所有地狱都破裂了,一切都想立刻建造。 (构建'develop'-SNAPSHOT会导致所有下游'feature'和'develop'分支开始)
理想情况下,我们希望找到一些方法,当jenkins启动下游工作时,我们不会在功能和开发构建之间交叉花粉。
有人试过吗?像条件+ BuildStep +插件这样的东西有帮助吗? https://wiki.jenkins-ci.org/display/JENKINS/Conditional+BuildStep+Plugin
答案 0 :(得分:0)
这是一个老问题,但它在 6 年后仍然相关。 Build whenever a SNAPSHOT dependency is built
设置中有一个“阈值”字段,可以对触发哪些构建进行一些控制
来自pipeline-maven-plugin README:
<块引用>基于 Maven 中达到的 Maven lifecycle phase 的阈值 上游作业的构建(打包、安装、部署)。默认情况下,只有 到达部署阶段的 Maven 构建将触发下游 构建。
例如,在脚本化管道的 withMaven()
中,您可以使用 pipelineGraphPublisher
设置 lifecycleThreshold: 'deploy'
,例如:
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 生命周期阶段,以触发下游构建与那些构建您不想触发下游构建。我们根据分支名称执行此操作,以便 Pull Request 和 Release 分支不会触发上游包:
/**
* 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'
}
然后,您可以在执行 getGoalForCurrentBranch()
的任何地方调用此 mvn
方法以确定执行哪个生命周期阶段:
withMaven(
...
sh("mvn ${getGoalForCurrentBranch()}")
)
大多数分支将执行 mvn deploy
并且将触发下游 Jenkins 作业,但拉取请求分支将执行 mvn install
并且不会触发下游作业。
对此的警告是,您可能还有其他依赖于某些生命周期阶段的东西。在上面的示例中,Pull Request 分支工件不会部署到您的工件存储库(例如 Nexus)。在我们的例子中,这实际上是期望的行为,但您需要确定什么是您可以接受的,并相应地调整您的阈值。
答案 1 :(得分:-1)
我没有在Jenkin的工作中看到像&#34; Build的选项,无论何时构建上游依赖项&#34; 。每当构建SNAPSHOT依赖关系时,它就会被称为&#34; Build&#34; (Jenkins v1.592及其最新的插件)。这是你的意思吗?
还有内联帮助中的最后一句话:&#34;如果此行为有问题,请取消选中此选项。&#34; : - )
我不知道条件BuildStep插件在这种情况下是否会有所帮助。我们使用它但不是为了达到这个目的。
根据您的工作运行时间,我建议: