Details
-
Bug
-
Resolution: Fixed
-
High
-
None
-
8.20.10
-
None
-
8.2
-
38
-
Severity 3 - Minor
-
229
-
Description
Issue Summary
Jira Server for Slack (Official) app started to send duplicate notifications after 2022-10-14 without any configuration changes made.
This is reproducible on Data Center: yes
Steps to Reproduce
- Have Jira send a Slack notification.
Expected Results
A single Slack notification is shown.
Actual Results
Duplicated Slack notifications are shown.
The application logs will show the following errors:
2022-10-14 10:22:38,231+0000 jira-slack-plugin:thread-5 WARN xxxxxx 578x6850920x11 quxdfr xxxxxxxxxxxxxx /secure/AjaxIssueAction.jspa [c.a.p.slack.util.ResponseMapper] Error when performing request to Slack: chat.postMessage/G0186MULC7R com.google.gson.JsonParseException: Unsupported layout block type: rich_text at com.github.seratch.jslack.common.json.GsonLayoutBlockFactory.getLayoutClassInstance(GsonLayoutBlockFactory.java:36) at com.github.seratch.jslack.common.json.GsonLayoutBlockFactory.deserialize(GsonLayoutBlockFactory.java:19) at com.github.seratch.jslack.common.json.GsonLayoutBlockFactory.deserialize(GsonLayoutBlockFactory.java:12) at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:69) at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222) at com.google.gson.Gson.fromJson(Gson.java:963) at com.google.gson.Gson.fromJson(Gson.java:928) at com.google.gson.Gson.fromJson(Gson.java:877) at com.google.gson.Gson.fromJson(Gson.java:848) at com.github.seratch.jslack.common.http.SlackHttpClient.parseJsonResponse(SlackHttpClient.java:81) at com.github.seratch.jslack.api.methods.impl.MethodsClientImpl.doPostFormWithToken(MethodsClientImpl.java:913) at com.github.seratch.jslack.api.methods.impl.MethodsClientImpl.chatPostMessage(MethodsClientImpl.java:304) at com.atlassian.plugins.slack.api.client.DefaultSlackClient.lambda$postMessage$23(DefaultSlackClient.java:494) at com.atlassian.plugins.slack.util.ResponseMapper.toEither(ResponseMapper.java:25) at com.atlassian.plugins.slack.api.client.DefaultSlackClient.postMessage(DefaultSlackClient.java:492) at com.atlassian.jira.plugins.slack.service.task.impl.SendNotificationTask.lambda$null$0(SendNotificationTask.java:89) at java.base/java.util.Optional.flatMap(Optional.java:294) at com.atlassian.plugins.slack.api.client.RetryLoaderHelper.lambda$retryWithUserTokens$1(RetryLoaderHelper.java:25) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:271) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) at java.base/java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958) at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543) at com.atlassian.plugins.slack.api.client.RetryLoaderHelper.retryWithUserTokens(RetryLoaderHelper.java:26) at com.atlassian.jira.plugins.slack.service.task.impl.SendNotificationTask.lambda$call$1(SendNotificationTask.java:87) at com.atlassian.jira.plugins.slack.service.task.impl.DefaultTaskExecutorService.lambda$submitTask$1(DefaultTaskExecutorService.java:94) at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125) at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:57) at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829)
Workaround
A new version of the Jira Server for Slack (Official) was released with a hotfix for this issue (version 3.0.2)
Note that this version will still show errors in the logs but it will prevent duplicate messages until a permanent fix is delivered.
Notes
Investigation done by the development team shows Slack's chat.postMessage REST method suddenly started returning blocks that include rich_text, which is undocumented and not properly handled by the Jira Server for Slack app, causing duplicate notifications.