jenkinsci / jenkinsci/slack-plugin
NullPointerException when trying to send slack with notifyCommitters: true
- 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
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