From 173b94dbe1053c421cab995582106c653dc98d0a Mon Sep 17 00:00:00 2001 From: caguilar187 Date: Wed, 16 May 2018 20:29:33 -0400 Subject: [PATCH 1/2] adding support for triggering multibranch pipeline projects --- models/services/get_build_cause.rb | 3 +- models/services/get_jenkins_projects.rb | 13 +++++- models/use_cases/build_now.rb | 7 ++- models/use_cases/notify_commit.rb | 6 ++- models/values/project.rb | 57 +++++++++++++++++++++---- 5 files changed, 74 insertions(+), 12 deletions(-) diff --git a/models/services/get_build_cause.rb b/models/services/get_build_cause.rb index 7bbc8d9..294e797 100644 --- a/models/services/get_build_cause.rb +++ b/models/services/get_build_cause.rb @@ -1,6 +1,7 @@ include Java java_import Java.hudson.model.Cause +java_import Java.hudson.model.CauseAction module GitlabWebHook class GetBuildCause @@ -8,7 +9,7 @@ def with(details) raise ArgumentError.new('details are required') unless details notes = details.payload ? from_payload(details) : 'no payload available' - Cause::RemoteCause.new(details.repository_uri.host, notes) + CauseAction.new(Cause::RemoteCause.new(details.repository_uri.host, notes)) end def from_payload(details) diff --git a/models/services/get_jenkins_projects.rb b/models/services/get_jenkins_projects.rb index 1307ce3..aebdcc0 100644 --- a/models/services/get_jenkins_projects.rb +++ b/models/services/get_jenkins_projects.rb @@ -14,6 +14,13 @@ java_import Java.hudson.plugins.git.browser.GitLab java_import Java.hudson.plugins.git.util.DefaultBuildChooser +MultiBranchPluginAvailable = true +begin + java_import Java.jenkins.branch.MultiBranchProject +rescue NameError + MultiBranchPluginAvailable = false +end + module GitlabWebHook class GetJenkinsProjects include Settings @@ -51,7 +58,11 @@ def master(details) def all projects = nil Security.impersonate(ACL::SYSTEM) do - projects = Java.jenkins.model.Jenkins.instance.getAllItems(AbstractProject.java_class).map do |jenkins_project| + temp = Java.jenkins.model.Jenkins.instance.getAllItems(AbstractProject.java_class).to_a + if MultiBranchPluginAvailable + temp.concat Java.jenkins.model.Jenkins.instance.getAllItems(MultiBranchProject.java_class).to_a + end + projects = temp.map do |jenkins_project| Project.new(jenkins_project) unless jenkins_project.java_kind_of?(MatrixConfiguration) end - [nil] end diff --git a/models/use_cases/build_now.rb b/models/use_cases/build_now.rb index 0aeeeba..1ba0103 100644 --- a/models/use_cases/build_now.rb +++ b/models/use_cases/build_now.rb @@ -8,6 +8,7 @@ class BuildNow java_import Java.java.util.logging.Logger java_import Java.java.util.logging.Level + java_import Java.hudson.model.Action def initialize(project, logger = Logger.getLogger(self.class.name)) raise ArgumentError.new('project is required') unless project @@ -21,7 +22,11 @@ def with(details, cause_builder = GetBuildCause.new, actions_builder = GetBuildA raise ArgumentError.new('details are required') unless details begin - return "#{project} scheduled for build" if project.scheduleBuild2(project.getQuietPeriod(), cause_builder.with(details), actions_builder.with(project, details)) + actions = [cause_builder.with(details)] + if project.multibranchProject? + actions.concat actions_builder.with(project, details) + end + return "#{project} scheduled for build" if project.scheduleBuild2(project.getQuietPeriod(), actions.to_java(Action)) rescue java.lang.Exception => e # avoid method signature warnings severe = logger.java_method(:log, [Level, java.lang.String, java.lang.Throwable]) diff --git a/models/use_cases/notify_commit.rb b/models/use_cases/notify_commit.rb index 617737a..7d65d77 100644 --- a/models/use_cases/notify_commit.rb +++ b/models/use_cases/notify_commit.rb @@ -18,7 +18,11 @@ def call return "#{project} is not buildable (it is disabled or not saved), skipping polling" unless project.buildable? begin - return "#{project} scheduled for polling" if project.schedulePolling + if project.multibranchProject? + return "#{project} scheduled for polling" if project.scheduleBuild + else + return "#{project} scheduled for polling" if project.schedulePolling + end rescue java.lang.Exception => e # avoid method signature warnings severe = logger.java_method(:log, [Level, java.lang.String, java.lang.Throwable]) diff --git a/models/values/project.rb b/models/values/project.rb index 294213f..2c3f572 100644 --- a/models/values/project.rb +++ b/models/values/project.rb @@ -14,9 +14,18 @@ java_import Java.hudson.util.NullStream java_import Java.hudson.plugins.git.GitSCM java_import Java.hudson.plugins.git.util.InverseBuildChooser +java_import Java.hudson.plugins.git.util.DefaultBuildChooser java_import Java.hudson.plugins.git.extensions.impl.PreBuildMerge java_import Java.hudson.plugins.git.extensions.impl.RelativeTargetDirectory +MultiBranchPluginAvailable = true +begin + java_import Java.jenkins.branch.MultiBranchProject + java_import Java.jenkins.scm.api.SCMSource +rescue NameError + MultiBranchPluginAvailable = false +end + MultipleScmsPluginAvailable = true begin java_import Java.org.jenkinsci.plugins.multiplescms.MultiSCM @@ -31,9 +40,8 @@ class Project include Settings extend Forwardable - def_delegators :@jenkins_project, :schedulePolling, :scheduleBuild2, :fullName, :isParameterized, :isBuildable, :getQuietPeriod, :getProperty, :delete, :description + def_delegators :@jenkins_project, :schedulePolling, :scheduleBuild, :scheduleBuild2, :fullName, :isParameterized, :isBuildable, :getProperty, :delete, :description - alias_method :parametrized?, :isParameterized alias_method :buildable?, :isBuildable alias_method :name, :fullName alias_method :to_s, :fullName @@ -58,6 +66,27 @@ def initialize(jenkins_project, env_vars = nil) end end + def multibranchProject? + if MultiBranchPluginAvailable + return jenkins_project.java_kind_of?(MultiBranchProject) + end + return false + end + + def getQuietPeriod + if multibranchProject? + return 0 + end + return jenkins_project.getQuietPeriod() + end + + def parametrized? + if !multibranchProject? + return @jenkins_project.isParameterized + end + return false + end + def matches_uri?(details_uri) return false unless scms.any? matching_scms?(details_uri) @@ -65,6 +94,7 @@ def matches_uri?(details_uri) def matches?(details, branch = false, exactly = false) return false unless buildable? + return true if multibranchProject? if merge_to?( branch || details.branch ) logger.info("project #{self} merge target matches #{branch || details.branch}") return true @@ -214,12 +244,23 @@ def matches_branch?(details, branch = false, exactly = false) def setup_scms @scms = [] - if jenkins_project.scm - if jenkins_project.scm.java_kind_of?(GitSCM) - @scms << jenkins_project.scm - elsif MultipleScmsPluginAvailable && jenkins_project.scm.java_kind_of?(MultiSCM) - @multiscm = true - @scms.concat(jenkins_project.scm.getConfiguredSCMs().select { |scm| scm.java_kind_of?(GitSCM) }) + if multibranchProject? + jenkins_project.getSCMSources.to_a.each { |scm_source| + scm_source.fetch(nil).to_a.each { |head| + scm = scm_source.build(head) + if scm.java_kind_of?(GitSCM) + @scms.push(scm) + end + } + } + else + if jenkins_project.scm + if jenkins_project.scm.java_kind_of?(GitSCM) + @scms << jenkins_project.scm + elsif MultipleScmsPluginAvailable && jenkins_project.scm.java_kind_of?(MultiSCM) + @multiscm = true + @scms.concat(jenkins_project.scm.getConfiguredSCMs().select { |scm| scm.java_kind_of?(GitSCM) }) + end end end end From beaa23f54050d7f8c379cba3d204307143d97a05 Mon Sep 17 00:00:00 2001 From: caguilar187 Date: Thu, 17 May 2018 14:44:55 -0400 Subject: [PATCH 2/2] fixing silent warning due to failed serialization --- models/api.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/models/api.rb b/models/api.rb index 611ddc5..35ed31e 100644 --- a/models/api.rb +++ b/models/api.rb @@ -12,6 +12,7 @@ require_relative 'services/check_git_details' java_import Java.org.jruby.exceptions.RaiseException +java_import Java.hudson.model.Action module GitlabWebHook class Api < Sinatra::Base @@ -41,7 +42,11 @@ class Api < Sinatra::Base cause_builder = GetBuildCause.new actions_builder = GetBuildActions.new details = parse_request - project.scheduleBuild2(project.getQuietPeriod(), cause_builder.with(details), actions_builder.with(project, details)) + actions = [cause_builder.with(details)] + if project.multibranchProject? + actions.concat actions_builder.with(project, details) + end + project.scheduleBuild2(project.getQuietPeriod(), actions.to_java(Action)) end end