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: BitBucketPPRAction.getType() is null #314

Closed Z9n2JktHlZDmlhSvqc9X2MmL3BwQG7tk closed 10 months ago

Z9n2JktHlZDmlhSvqc9X2MmL3BwQG7tk commented 11 months ago

Problem: job does not run automatically on a push event in the repository.

I use BitBucket cloud (bitbucket.org) and BitBucketPPR plugin 3.0.0, Jenkins-2.414.3. Repository is configured to send webhooks on push events only. For some reason on manual Pull request merge on bitbucket.org I get 2 webhooks, one of which is "branch: null". This leads to java.lang.NullPointerException. As I understand exception also affects first non-null webhook, it does not run the job too.

Nov  6 18:16:28 dev jenkins[18229]: >>> Received POST request over Bitbucket hook
Nov  6 18:16:28 dev jenkins[18229]: INFO      i.j.p.b.r.BitBucketPPRHookReceiver#doIndex: Received POST request over Bitbucket hook
Nov  6 18:16:28 dev jenkins[18229]: INFO      i.j.p.b.p.BitBucketPPRPayloadProcessorFactory#createProcessor: Create BitBucketPPRRepositoryCloudPayloadProcessor
Nov  6 18:16:28 dev jenkins[18229]: INFO      i.j.p.b.p.BitBucketPPRRepositoryCloudPayloadProcessor#buildActionForJobs: Instantiate BitBucketPPRRepositoryAction
Nov  6 18:16:28 dev jenkins[18229]: INFO      i.j.p.b.a.BitBucketPPRRepositoryAction#<init>: Received commit hook notification for branch: master
Nov  6 18:16:28 dev jenkins[18229]: INFO      i.j.p.b.a.BitBucketPPRRepositoryAction#<init>: Received commit hook type: branch
Nov  6 18:16:28 dev jenkins[18229]: INFO      i.j.p.b.f.r.BitBucketPPRRepositoryTriggerMatcher#matchesAction: BitBucketPPREvent [bitbucketEventKey = repo:push, event = repo, action = push]
Nov  6 18:16:29 dev jenkins[18229]: >>> Received POST request over Bitbucket hook
Nov  6 18:16:29 dev jenkins[18229]: INFO      i.j.p.b.r.BitBucketPPRHookReceiver#doIndex: Received POST request over Bitbucket hook
Nov  6 18:16:29 dev jenkins[18229]: INFO      i.j.p.b.p.BitBucketPPRPayloadProcessorFactory#createProcessor: Create BitBucketPPRRepositoryCloudPayloadProcessor
Nov  6 18:16:29 dev jenkins[18229]: INFO      i.j.p.b.p.BitBucketPPRRepositoryCloudPayloadProcessor#buildActionForJobs: Instantiate BitBucketPPRRepositoryAction
Nov  6 18:16:29 dev jenkins[18229]: INFO      i.j.p.b.a.BitBucketPPRRepositoryAction#<init>: Received commit hook notification for branch: null
Nov  6 18:16:29 dev jenkins[18229]: INFO      i.j.p.b.a.BitBucketPPRRepositoryAction#<init>: Received commit hook type: null
Nov  6 18:16:29 dev jenkins[18229]: INFO      i.j.p.b.f.r.BitBucketPPRRepositoryTriggerMatcher#matchesAction: BitBucketPPREvent [bitbucketEventKey = repo:push, event = repo, action = push]
Nov  6 18:16:29 dev jenkins[18229]: INFO      i.j.p.b.f.r.BitBucketPPRRepositoryPushActionFilter#shouldTriggerBuild: Should trigger build for the bitbucket action: BitBucketPPRRepositoryAction?
Nov  6 18:16:30 dev jenkins[18229]: INFO      i.j.p.b.common.BitBucketPPRUtils#lambda$matches$2: Matched branch: master
Nov  6 18:16:30 dev jenkins[18229]: INFO      i.j.p.b.f.r.BitBucketPPRRepositoryPushActionFilter#shouldTriggerBuild: Should trigger build for the bitbucket action: BitBucketPPRRepositoryAction?
Nov  6 18:16:30 dev jenkins[18229]: INFO      i.j.p.b.common.BitBucketPPRUtils#lambda$matches$2: Matched branch: master
Nov  6 18:16:30 dev jenkins[18229]: INFO      i.j.p.b.f.r.BitBucketPPRRepositoryPushActionFilter#shouldTriggerBuild: Should trigger build for the bitbucket action: BitBucketPPRRepositoryAction?
Nov  6 18:16:30 dev jenkins[18229]: WARNING   i.j.p.b.BitBucketPPRTrigger$1#lambda$onPollSuccess$0: During the polling process an exception was thrown: Cannot invoke "String.equalsIgnoreCase(String)" because the return value of "io.jenkins.plugins.bitbucketpushandpullrequest.action.BitBucketPPRAction.getType()" is null.
Nov  6 18:16:30 dev jenkins[18229]: java.lang.NullPointerException: Cannot invoke "String.equalsIgnoreCase(String)" because the return value of "io.jenkins.plugins.bitbucketpushandpullrequest.action.BitBucketPPRAction.getType()" is null
Nov  6 18:16:30 dev jenkins[18229]:     at io.jenkins.plugins.bitbucketpushandpullrequest.filter.repository.BitBucketPPRRepositoryPushActionFilter.shouldTriggerBuild(BitBucketPPRRepositoryPushActionFilter.java:72)
Nov  6 18:16:30 dev jenkins[18229]:     at io.jenkins.plugins.bitbucketpushandpullrequest.filter.repository.BitBucketPPRRepositoryTriggerFilter.shouldScheduleJob(BitBucketPPRRepositoryTriggerFilter.java:50)
Nov  6 18:16:30 dev jenkins[18229]:     at io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRTrigger.shouldScheduleJob(BitBucketPPRTrigger.java:172)
Nov  6 18:16:30 dev jenkins[18229]:     at io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRTrigger$1.lambda$onPollSuccess$0(BitBucketPPRTrigger.java:136)
Nov  6 18:16:30 dev jenkins[18229]:     at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
Nov  6 18:16:30 dev jenkins[18229]:     at java.base/java.util.stream.ReferencePipeline$Head.forEach(Unknown Source)
Nov  6 18:16:30 dev jenkins[18229]:     at io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRTrigger$1.onPollSuccess(BitBucketPPRTrigger.java:132)
Nov  6 18:16:30 dev jenkins[18229]:     at io.jenkins.plugins.bitbucketpushandpullrequest.BitBucketPPRPollingRunnable.run(BitBucketPPRPollingRunnable.java:73)
Nov  6 18:16:30 dev jenkins[18229]:     at hudson.util.SequentialExecutionQueue$QueueEntry.run(SequentialExecutionQueue.java:123)
Nov  6 18:16:30 dev jenkins[18229]:     at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
Nov  6 18:16:30 dev jenkins[18229]:     at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68)
Nov  6 18:16:30 dev jenkins[18229]:     at jenkins.util.ErrorLoggingExecutorService.lambda$wrap$0(ErrorLoggingExecutorService.java:51)
Nov  6 18:16:30 dev jenkins[18229]:     at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
Nov  6 18:16:30 dev jenkins[18229]:     at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
Nov  6 18:16:30 dev jenkins[18229]:     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
Nov  6 18:16:30 dev jenkins[18229]:     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
Nov  6 18:16:30 dev jenkins[18229]:     at java.base/java.lang.Thread.run(Unknown Source)
Z9n2JktHlZDmlhSvqc9X2MmL3BwQG7tk commented 11 months ago

During Pull request merge bitbucket.org sends first hook about real changes push and one more about "This commit is not reachable from any branch or tag in this repository. It may be from a fork outside of this repository". Second request payload:

{
  "push": {
    "changes": [
      {
        "old": {
          "name": "__MERGED_BRANCH_NAME__",
          "target": {
            "type": "commit",
            "hash": "__NONEXISTING_COMMIT_ID__",
            "date": ".....",
            "author": {.....},
            "message": ".....",
            "summary": {.....},
            "links": {.....},
            "parents": [.....],
            "rendered": {},
            "properties": {}
          },
          "links": {.....},
          "type": "branch",
          "merge_strategies": [
            "merge_commit",
            "squash",
            "fast_forward"
          ],
          "default_merge_strategy": "squash"
        },
        "new": null,                      <----------- !!!!!!!!!!
        "truncated": false,
        "created": false,
        "forced": false,
        "closed": true
      }
    ]
  },
  "repository": {
    "type": "repository",
    "full_name": "__REPOSITORY__",
    "links": {.....},
    "name": ".....",
    "scm": "git",
    "website": null,
    "owner": {.....},
    "workspace": {.....},
    "is_private": true,
    "project": {.....},
    "uuid": "{.....}",
    "parent": null
  },
  "actor": {.....}
}

Here we see "new": null.

Z9n2JktHlZDmlhSvqc9X2MmL3BwQG7tk commented 11 months ago

Added a patch to code, it seems to work. PR merge followed by patching worked good: no any errors, job was automatically triggered.

Patch:

--- src/main/java/io/jenkins/plugins/bitbucketpushandpullrequest/filter/repository/BitBucketPPRRepositoryPushActionFilter.java
+++ src/main/java/io/jenkins/plugins/bitbucketpushandpullrequest/filter/repository/BitBucketPPRRepositoryPushActionFilter.java
@@ -69,11 +69,12 @@
     logger.info(
         () -> "Should trigger build for the bitbucket action: " + bitbucketAction.toString() + "?");

-    if (!bitbucketAction.getType().equalsIgnoreCase("BRANCH")
+    if ( bitbucketAction == null || bitbucketAction.getType() == null || (
+           !bitbucketAction.getType().equalsIgnoreCase("BRANCH")
         && !bitbucketAction.getType().equalsIgnoreCase("named_branch")
         && !bitbucketAction.getType().equalsIgnoreCase("UPDATE")
         && !bitbucketAction.getType().equalsIgnoreCase("TAG")
-        && !this.triggerAlsoIfTagPush) {
+        && !this.triggerAlsoIfTagPush) ) {
       logger.info(
           "Neither bitbucketAction type is BRANCH, nor UPDATE, nor trigger on tag push is set: "
               + bitbucketAction.getType());
cdelmonte-zg commented 10 months ago

Will be fixed in the next bugfix release 3.0.1