Triggers not working after adding Reverse Build triggers with Groovy

944 views
Skip to first unread message

Sverre Moe

unread,
Aug 21, 2015, 3:23:17 AM8/21/15
to Jenkins Users
I have added some reverse build triggers with a Groovy script. Unfortunately the triggers does not work properly.

It all looks like its ok, but after an upstream project has been built I get the following NullPointerException:
Warning: you have no plugins providing access control for builds, so falling back to legacy behavior of permitting any downstream builds to be triggered
FATAL
: null
java.lang.NullPointerException
        at jenkins.triggers.ReverseBuildTrigger.shouldTrigger(ReverseBuildTrigger.java:111)
        at
jenkins.triggers.ReverseBuildTrigger.access$000(ReverseBuildTrigger.java:84)
        at
jenkins.triggers.ReverseBuildTrigger$1.shouldTriggerBuild(ReverseBuildTrigger.java:141)
        at
hudson.tasks.BuildTrigger.execute(BuildTrigger.java:245)
        at
hudson.model.AbstractBuild$AbstractBuildExecution.cleanUp(AbstractBuild.java:687)
        at
hudson.model.Run.execute(Run.java:1788)
        at
hudson.matrix.MatrixBuild.run(MatrixBuild.java:301)
        at
hudson.model.ResourceController.execute(ResourceController.java:98)
        at
hudson.model.Executor.run(Executor.java:381)
Finished: SUCCESS

I fixed it by the following approach: Before building one of the upstream project, I went into the configuration of each of its downstream projects, checked the "Build after other projects are built" for each of them. The reverse build trigger was already activated, the projects listed. I save the project even though there actually was no changes. This time the reverse build trigger worked when an upstream project was build all its downstream projects got triggered.

Why did I have to manually go into each downstream project and save it? My groovy script does that.


#!/usr/bin/env groovy

import jenkins.triggers.ReverseBuildTrigger
import hudson.model.Result

def jenkinsInstance = jenkins.model.Jenkins.getInstance()
def developmentView = jenkinsInstance.getView("Development")
developmentView.getItems().each { project ->

    def upstreamProjects = null
    if (project.name.equals("project3")) {
        upstreamProjects = "project1, project2 "
    }

    if (upstreamProjects != null) {
        def trigger = new ReverseBuildTrigger(upstreamProjects, Result.SUCCESS)
        project.addTrigger(trigger)
        project.save()
    }
}

jenkinsInstance.rebuildDependencyGraph()
It contains only one for simplicity. My if-else contains aprox 100 projects.

Sverre Moe

unread,
Aug 21, 2015, 3:46:59 AM8/21/15
to Jenkins Users
I checked inside the config.xml before and after I manually saved the downstream project.

The only difference after saved, the reverse build trigger was placed before the scmtrigger.
  <triggers>
 <jenkins.triggers.ReverseBuildTrigger>
   <spec></spec>
   <upstreamProjects>project1</upstreamProjects>
   <threshold>
     <name>SUCCESS</name>
     <ordinal>0</ordinal>
     <color>BLUE</color>
     <completeBuild>true</completeBuild>
   </threshold>
 </jenkins.triggers.ReverseBuildTrigger>
 <hudson.triggers.SCMTrigger>
   <spec>H/15 * * * *</spec>
   <ignorePostCommitHooks>false</ignorePostCommitHooks>
 </hudson.triggers.SCMTrigger>
</triggers>

Reply all
Reply to author
Forward
0 new messages