jenkinsci / bitbucket-push-and-pull-request-plugin

Plugin for Jenkins v2.138.2 or later, that triggers job builds on Bitbucket's push and pull request events.
https://plugins.jenkins.io/bitbucket-push-and-pull-request
MIT License
46 stars 50 forks source link

NullPointerException when receiving payload #246

Open rotorsolutions opened 2 years ago

rotorsolutions commented 2 years ago

Hi,

I try to setup Bitbucket PR building but I receive the following error when receiving the payload. This causes a 500 response in Bitbucket and prevents the job from building.

Jenkins version: 2.319.3 Plugin version: 2.8.1

Output in Jenkins system log:

Error while serving https://REDACTED/
java.lang.NullPointerException
    at io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRJobProbe.triggerScm(BitBucketPPRJobProbe.java:107)
    at io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRJobProbe.lambda$triggerMatchingJobs$1(BitBucketPPRJobProbe.java:94)
    at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
    at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
    at io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRJobProbe.triggerMatchingJobs(BitBucketPPRJobProbe.java:92)
    at io.jenkins.plugins.bitbucketpushandpullrequest.processor.BitBucketPPRPullRequestCloudPayloadProcessor.processPayload(BitBucketPPRPullRequestCloudPayloadProcessor.java:46)
    at io.jenkins.plugins.bitbucketpushandpullrequest.receiver.BitBucketPPRHookReceiver.process(BitBucketPPRHookReceiver.java:108)
    at io.jenkins.plugins.bitbucketpushandpullrequest.receiver.BitBucketPPRHookReceiver.doIndex(BitBucketPPRHookReceiver.java:71)
    at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:710)
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:393)
Caused: java.lang.reflect.InvocationTargetException
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:397)
    at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:405)
    at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:208)
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:141)
    at org.kohsuke.stapler.IndexDispatcher.dispatch(IndexDispatcher.java:27)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:766)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:898)
    at org.kohsuke.stapler.MetaClass$9.dispatch(MetaClass.java:457)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:766)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:898)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:694)
    at org.kohsuke.stapler.Stapler.service(Stapler.java:240)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
    at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1626)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:156)
    at jenkins.security.ResourceDomainFilter.doFilter(ResourceDomainFilter.java:80)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:153)
    at jenkins.telemetry.impl.UserLanguages$AcceptLanguageFilter.doFilter(UserLanguages.java:128)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:153)
    at jenkins.metrics.impl.MetricsFilter.doFilter(MetricsFilter.java:125)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:153)
    at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:159)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
    at io.jenkins.plugins.bitbucketpushandpullrequest.receiver.BitBucketPPRCrumbExclusion.process(BitBucketPPRCrumbExclusion.java:58)
    at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:127)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:92)
    at jenkins.security.AcegiSecurityExceptionFilter.doFilter(AcegiSecurityExceptionFilter.java:52)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:97)
    at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:53)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:97)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:121)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:115)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:97)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:105)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:97)
    at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:133)
    at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:92)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:97)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:97)
    at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:97)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:97)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
    at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:62)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:97)
    at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:109)
    at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
    at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:51)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
    at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:85)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
    at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
    at jenkins.security.SuspiciousRequestFilter.doFilter(SuspiciousRequestFilter.java:39)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:193)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1601)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:548)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:578)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1434)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.Server.handle(Server.java:516)
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:388)
    at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
    at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:386)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
    at java.base/java.lang.Thread.run(Thread.java:829)
y0zg commented 2 years ago

The same!

rotorsolutions commented 2 years ago

PS, I do get several of these lines before the NullPointerException:

Feb 16, 2022 7:15:19 AM INFO io.jenkins.plugins.bitbucketpushandpullrequest.receiver.BitBucketPPRHookReceiver doIndex
Received POST request over Bitbucket hook
Feb 16, 2022 7:15:19 AM INFO io.jenkins.plugins.bitbucketpushandpullrequest.processor.BitBucketPPRPayloadProcessorFactory createProcessor
Create BitBucketPPRPullRequestCloudPayloadProcessor
Feb 16, 2022 7:15:19 AM WARNING io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRJobProbe lambda$triggerMatchingJobs$1
Trigger not set
Feb 16, 2022 7:15:19 AM WARNING io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRJobProbe lambda$triggerMatchingJobs$1
Trigger not set
Feb 16, 2022 7:15:19 AM WARNING io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRJobProbe lambda$triggerMatchingJobs$1
Trigger not set
rotorsolutions commented 2 years ago

PS2: The repository which is used has a Jenkinsfile. However this job is not configured to use this Jenkinsfile. Could that be related?

rotorsolutions commented 2 years ago

I have been working all day to figure this out...

I have created a temporary Jenkins instance in a Docker setup. I started with copying the job over for which I wanted to setup the plugin. That worked correctly. The hook triggered a build. So I can confirm this is an 'environment related issue' caused by another job or a setting or something like that.

After that I tried to copy all the other jobs over one by one (just the jobs, no credentials) to see at what time it would 'break'... But as you might expect, it didn't break.. Builds kept being triggered..

So I tried to do a similar approach with our plugins, but again this did not break..

TakiTake commented 2 years ago

I also encounter same issue.

In my case, If there is "External Job", io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRJobProbe.triggerScm is failed due to java.lang.NullPointerException. So I removed all Jobs that kind of "External Job" as a workaround solution.

I guess this line should be return Optional.ofNullable(trigger).

I find suspicious Jobs with running following code on JENKINS_URL/script

import io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRTrigger

Jenkins.get().getAllItems(Job.class).stream().each{ job ->
  def trigger = null

  if (job instanceof ParameterizedJobMixIn.ParameterizedJob) {
    ParameterizedJobMixIn.ParameterizedJob<?, ?> pJob = (ParameterizedJobMixIn.ParameterizedJob<?, ?>) job;
    trigger = pJob.getTriggers().values().stream().filter{ it instanceof BitBucketPPRTrigger }.findFirst().map{ it as BitBucketPPRTrigger }
  }

  if (trigger == null) {
    println "${job.fullName}"
  }
}
jsj1027 commented 2 years ago

Im also having this error and I've tried so many different things. Jenkins Version: 2.332.3 Plugin Version: 2.8.2-beta-1

I hoped the beta version would fix this but it didn't. It did fix the invalid crumb error I had though.

I'm running a MultiBranchPipeline and honestly this error message doesn't make much sense.

I thought the problem was that I was using a username&password to interact with Bitbucket rather than using an app password but I switched and I still get the same error.

Here's the branch source configuration.

Screen Shot 2022-06-21 at 4 57 22 PM
jsj1027 commented 2 years ago

@TakiTake What exactly did you mean by "External Job"?

jsj1027 commented 2 years ago

@TakiTake I figured out what you meant! I ran the script and found an External Job that was empty and just sitting there. I've got to see if deleting it fixes this but I think this is a good direction! If this works I'll make a PR to fix this in the plugin itself.

jsj1027 commented 2 years ago

@TakiTake So deleting that "External Job" did fix the issue, and now I don't get the NullPointerException! Thank you!

HeidiRechek commented 1 year ago

this solved my issue as well. Thank you!