限制在SNAPSHOT依赖项上触发哪些下游构建

时间:2014-12-04 15:57:30

标签: maven jenkins git-flow

我们有一个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

2 个答案:

答案 0 :(得分:0)

这是一个老问题,但它在 6 年后仍然相关。 Build whenever a SNAPSHOT dependency is built 设置中有一个“阈值”字段,可以对触发哪些构建进行一些控制

来自pipeline-maven-plugin README

<块引用>

基于 Maven 中达到的 Maven lifecycle phase 的阈值 上游作业的构建(打包、安装、部署)。默认情况下,只有 到达部署阶段的 Maven 构建将触发下游 构建。

Downstream lifecycle
phase

例如,在脚本化管道的 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(例如packageinstall)将触发下游作业。请注意,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插件在这种情况下是否会有所帮助。我们使用它但不是为了达到这个目的。

根据您的工作运行时间,我建议:

  1. 如果作业不运行,则 Build when 高级项目选项安静时段一起使用(让我们说几分钟)
  2. 根据建议停用随时随地的构建,并使用构建后操作构建其他项目在其他项目上触发参数化构建如果您的工作时间更长,建立一个真正的上/下游构建流程