jenkinsci / jenkinsci/slack-plugin

NullPointerException when trying to send slack with notifyCommitters: true

Open
#665 25 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
672
Forks
396
Avg merge
2d 23h
Merged PRs (30d)
5

Description

- [x] Jenkins version
2.176.4
- [x] Plugin version
2.36
- [x] OS
Ubuntu 18.04

### Description
Send slack message like this:
slackSend (color: '#FF0000', channel: channel, message: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})", notifyCommitters: true)

It failed "sometimes" with error stack below, if the changes in the build are from committer A.
But it does work if the changes are from committer B.

We use LDAP accounts. I don't see difference between account A and B.
The email in change/ email in LDAP/ email in slack are consistent.

I don't have a clue now...

```
Slack Send Pipeline step running, values are - baseUrl: , teamDomain: xxxx, channel: xxxx , color: #FF0000, botUser: true, tokenCredentialId: xxxxx, notifyCommitters: true, iconEmoji: , username: botuser
[Pipeline] }
[Pipeline] // node
[Pipeline] }
[Pipeline] // podTemplate
[Pipeline] End of Pipeline
java.lang.NullPointerException
at hudson.ExtensionList.ensureLoaded(ExtensionList.java:312)
at hudson.ExtensionList.iterator(ExtensionList.java:172)
at java.util.Spliterators$IteratorSpliterator.estimateSize(Spliterators.java:1821)
at java.util.Spliterator.getExactSizeIfKnown(Spliterator.java:408)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:486)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findAny(ReferencePipeline.java:469)
at jenkins.plugins.slack.user.EmailSlackUserIdResolver.resolveUserId(EmailSlackUserIdResolver.java:100)
at jenkins.plugins.slack.user.SlackUserIdResolver.findOrResolveUserId(SlackUserIdResolver.java:65)
at jenkins.plugins.slack.user.SlackUserIdResolver.lambda$resolveUserIdsForChangeLogSet$0(SlackUserIdResolver.java:95)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at jenkins.plugins.slack.user.SlackUserIdResolver.resolveUserIdsForChangeLogSet(SlackUserIdResolver.java:97)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at jenkins.plugins.slack.user.SlackUserIdResolver.resolveUserIdsForChangeLogSets(SlackUserIdResolver.java:104)
at jenkins.plugins.slack.user.SlackUserIdResolver.resolveUserIdsForRun(SlackUserIdResolver.java:84)
at jenkins.plugins.slack.StandardSlackService.publish(StandardSlackService.java:157)
at jenkins.plugins.slack.StandardSlackService.publish(StandardSlackService.java:294)
at jenkins.plugins.slack.StandardSlackService.publish(StandardSlackService.java:289)
at jenkins.plugins.slack.workflow.SlackSendStep$SlackSendStepExecution.run(SlackSendStep.java:342)
at jenkins.plugins.slack.workflow.SlackSendStep$SlackSendStepExecution.run(SlackSendStep.java:248)
at org.jenkinsci.plugins.workflow.steps.SynchronousNonBlockingStepExecution.lambda$start$0(SynchronousNonBlockingStepExecution.java:47)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Finished: FAILURE
```

Contributor guide

Open the contributing guide

Research direction

Start with jenkins.plugins.slack.user.EmailSlackUserIdResolver.java at line 100 and trace how SlackUserIdResolver resolves committers when notifyCommitters is true. Reproduce the differing-committer case if possible, using the stack trace through StandardSlackService.publish. Done means sending the Slack notification no longer fails with a NullPointerException for valid LDAP-backed committers.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.