slackapi / java-slack-sdk

Slack Developer Kit (including Bolt for Java) for any JVM language
https://slack.dev/java-slack-sdk/
MIT License
573 stars 214 forks source link

Bolt micronaut/micronaut 4 upgrade #1294

Closed hrothwell closed 6 months ago

hrothwell commented 6 months ago

(Describe the goal of this PR. Mention any related Issue numbers)

Resolving #1252 and #892

I am not very familiar with maven so unsure if test failures right now are due to Micronaut issues, compiling issues with maven / wrong jdk (MN 4 requires jdk 17), etc. Opening as draft because of this and will try to continue looking into how to get the tests all running correctly.

Update 2024-03-28T22:42:37+00:00 - Initial test issues in bolt-micronaut were resolved, not exactly sure on the issue that was present but removing a @MockBean that was not actually returning a mock seemed to have fixed it. Since Micronaut 4 requires JDK 17, a JDK 17 build workflow was created. Since some other test modules had issues on JDK 17, created JDK 17 profile to apply maven surefire arguments to resolve those test issues which I believe would also resolve #892

Category (place an x in each of the [ ])

Requirements

Please read the Contributing guidelines and Code of Conduct before creating this issue or pull request. By submitting, you agree to those rules.

hrothwell commented 6 months ago

error output from trying to run CommandsTest locally (just the first test output included, all are pretty much the same as controller can't seem to spin up):

13:27:03.506 [main] INFO  i.m.c.DefaultApplicationContext$RuntimeConfiguredEnvironment - Established active environments: [test]
13:27:04.233 [main] DEBUG reactor.util.Loggers - Using Slf4j logging framework
13:27:04.433 [default-nioEventLoopGroup-1-3] ERROR i.m.http.server.RouteExecutor - Unexpected error occurred: Error instantiating bean of type  [com.slack.api.bolt.micronaut.SlackAppController]

Message: 'java.lang.Object io.micronaut.context.DefaultBeanContext.getProxyTargetBean(io.micronaut.context.BeanResolutionContext, io.micronaut.inject.BeanDefinition, io.micronaut.core.type.Argument, io.micronaut.context.Qualifier)'
Path Taken: new SlackAppController(App slackApp,SlackAppMicronautAdapter adapter) --> new SlackAppController([App slackApp],SlackAppMicronautAdapter adapter)
io.micronaut.context.exceptions.BeanInstantiationException: Error instantiating bean of type  [com.slack.api.bolt.micronaut.SlackAppController]

Message: 'java.lang.Object io.micronaut.context.DefaultBeanContext.getProxyTargetBean(io.micronaut.context.BeanResolutionContext, io.micronaut.inject.BeanDefinition, io.micronaut.core.type.Argument, io.micronaut.context.Qualifier)'
Path Taken: new SlackAppController(App slackApp,SlackAppMicronautAdapter adapter) --> new SlackAppController([App slackApp],SlackAppMicronautAdapter adapter)
    at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2324)
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2279)
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2291)
    at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3054)
    at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
    at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:2956)
    at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2917)
    at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2730)
    at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1729)
    at io.micronaut.context.AbstractBeanResolutionContext.getBean(AbstractBeanResolutionContext.java:89)
    at io.micronaut.context.AbstractInitializableBeanDefinition.resolveBean(AbstractInitializableBeanDefinition.java:2165)
    at io.micronaut.context.AbstractInitializableBeanDefinition.getBeanForConstructorArgument(AbstractInitializableBeanDefinition.java:1328)
    at com.slack.api.bolt.micronaut.$SlackAppController$Definition.instantiate(Unknown Source)
    at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2309)
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2279)
    at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:2291)
    at io.micronaut.context.DefaultBeanContext.createRegistration(DefaultBeanContext.java:3054)
    at io.micronaut.context.SingletonScope.getOrCreate(SingletonScope.java:80)
    at io.micronaut.context.DefaultBeanContext.findOrCreateSingletonBeanRegistration(DefaultBeanContext.java:2956)
    at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2917)
    at io.micronaut.context.DefaultBeanContext.resolveBeanRegistration(DefaultBeanContext.java:2891)
    at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:1695)
    at io.micronaut.context.DefaultBeanContext$BeanContextExecutionHandle.getTarget(DefaultBeanContext.java:4247)
    at io.micronaut.context.DefaultBeanContext$BeanContextUnsafeExecutionHandle.invokeUnsafe(DefaultBeanContext.java:4214)
    at io.micronaut.web.router.AbstractRouteMatch.execute(AbstractRouteMatch.java:271)
    at io.micronaut.http.server.RouteExecutor.executeRouteAndConvertBody(RouteExecutor.java:488)
    at io.micronaut.http.server.RouteExecutor.callRoute(RouteExecutor.java:478)
    at io.micronaut.http.server.RequestLifecycle.callRoute(RequestLifecycle.java:201)
    at io.micronaut.http.server.RequestLifecycle.executeRoute(RequestLifecycle.java:191)
    at io.micronaut.http.server.RequestLifecycle.lambda$normalFlow$1(RequestLifecycle.java:181)
    at io.micronaut.http.filter.FilterRunner.run(FilterRunner.java:155)
    at io.micronaut.http.filter.FilterRunner.run(FilterRunner.java:135)
    at io.micronaut.http.server.RequestLifecycle.runWithFilters(RequestLifecycle.java:357)
    at io.micronaut.http.server.RequestLifecycle.normalFlow(RequestLifecycle.java:181)
    at io.micronaut.http.server.netty.NettyRequestLifecycle.handleNormal(NettyRequestLifecycle.java:88)
    at io.micronaut.http.server.netty.RoutingInBoundHandler.accept(RoutingInBoundHandler.java:227)
    at io.micronaut.http.server.netty.websocket.NettyServerWebSocketUpgradeHandler.accept(NettyServerWebSocketUpgradeHandler.java:156)
    at io.micronaut.http.server.netty.handler.PipeliningServerHandler$OptimisticBufferingInboundHandler.read(PipeliningServerHandler.java:474)
    at io.micronaut.http.server.netty.handler.PipeliningServerHandler.channelRead(PipeliningServerHandler.java:213)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
    at io.netty.handler.codec.http.websocketx.extensions.WebSocketServerExtensionHandler.channelRead(WebSocketServerExtensionHandler.java:88)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
    at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:289)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.NoSuchMethodError: 'java.lang.Object io.micronaut.context.DefaultBeanContext.getProxyTargetBean(io.micronaut.context.BeanResolutionContext, io.micronaut.inject.BeanDefinition, io.micronaut.core.type.Argument, io.micronaut.context.Qualifier)'
    at test_locally.app.$CommandsTest$MockSlackAppConfig0$Definition$Intercepted.interceptedTarget(Unknown Source)
    at test_locally.app.$CommandsTest$MockSlackAppConfig0$Definition$Intercepted.getSlack(Unknown Source)
    at com.slack.api.bolt.App.<init>(App.java:447)
    at com.slack.api.bolt.App.<init>(App.java:442)
    at example.app.AppFactory.createApp(AppFactory.java:38)
    at example.app.$AppFactory$CreateApp1$Definition.instantiate(Unknown Source)
    at io.micronaut.context.DefaultBeanContext.resolveByBeanFactory(DefaultBeanContext.java:2309)
    ... 70 common frames omitted

io.micronaut.http.client.exceptions.HttpClientResponseException: Internal Server Error

    at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.makeErrorFromRequestBody(DefaultHttpClient.java:2259)
    at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.forwardResponseToPromise(DefaultHttpClient.java:2210)
    at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2179)
    at io.micronaut.http.client.netty.DefaultHttpClient$FullHttpResponseHandler.channelReadInstrumented(DefaultHttpClient.java:2147)
    at io.micronaut.http.client.netty.SimpleChannelInboundHandlerInstrumented.channelRead0(SimpleChannelInboundHandlerInstrumented.java:46)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
    at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:93)
    at io.micronaut.http.client.netty.ResettableReadTimeoutHandler$NextInterceptor.channelRead(ResettableReadTimeoutHandler.java:92)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:289)
    at io.micronaut.http.client.netty.ResettableReadTimeoutHandler.channelRead(ResettableReadTimeoutHandler.java:64)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:833)
    Suppressed: java.lang.Exception: #block terminated with an error
        at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:103)
        at reactor.core.publisher.Flux.blockFirst(Flux.java:2704)
        at io.micronaut.http.client.netty.DefaultHttpClient$1.exchange(DefaultHttpClient.java:571)
        at io.micronaut.http.client.BlockingHttpClient.exchange(BlockingHttpClient.java:77)
        at io.micronaut.http.client.BlockingHttpClient.exchange(BlockingHttpClient.java:106)
        at test_locally.app.CommandsTest.regexp_matching(CommandsTest.java:130)
        at java.base/java.lang.reflect.Method.invoke(Method.java:568)
        at io.micronaut.test.extensions.junit5.MicronautJunit5Extension$2.proceed(MicronautJunit5Extension.java:142)
        at io.micronaut.test.extensions.AbstractMicronautExtension.interceptEach(AbstractMicronautExtension.java:157)
        at io.micronaut.test.extensions.AbstractMicronautExtension.interceptTest(AbstractMicronautExtension.java:114)
        at io.micronaut.test.extensions.junit5.MicronautJunit5Extension.interceptTestMethod(MicronautJunit5Extension.java:129)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)

Based on this error it seems like it is something with the generated micronaut classes, which could be misconfigured local env, wrong jdk / maven project setup for MN 4, etc. I followed most of Micronaut's upgrade notes and some of my own changes from other apps I have migrated, but still getting this failure locally

hrothwell commented 6 months ago

@seratch thanks for the feedback, I'm hoping to be able to look into the test failures more at some point but I don't have an exact idea when.

Do you know of a way that I can verify that maven is compiling the project module to the correct target jdk - jdk 17? I have updated several Micronaut projects before but I've always used gradle, so I am less familiar with maven. Since Micronaut 4 requires jdk 17 that tends to be one of the first things I try to fix/diagnose but I am unsure of how to really tell if I am setting up the pom.xml right at the moment.

hrothwell commented 6 months ago

seems that the existing workflows do not like the target being jdk 17 now for this module

seratch commented 6 months ago

Ah, yeah that’s right. It’s totally fine to adjust the GitHub Actions job to run tests for this module with jdk 17 and skip it for 1.8 and 14. If you’re fine to make the changes, it’d be appreciated. Otherwise, I can work on it once I am back from PTOs next week.

hrothwell commented 6 months ago

Ah, yeah that’s right. It’s totally fine to adjust the GitHub Actions job to run tests for this module with jdk 17 and skip it for 1.8 and 14. If you’re fine to make the changes, it’d be appreciated. Otherwise, I can work on it once I am back from PTOs next week.

I should be able to, my week doesn't seem like it will be too busy for me and shouldn't take very long. Probably won't be tonight though. Enjoy your PTO!

codecov[bot] commented 6 months ago

Codecov Report

All modified and coverable lines are covered by tests :white_check_mark:

Project coverage is 74.65%. Comparing base (9b48c3d) to head (734749c).

:exclamation: Current head 734749c differs from pull request most recent head 835d9bb. Consider uploading reports for the commit 835d9bb to get more accurate results

Additional details and impacted files ```diff @@ Coverage Diff @@ ## main #1294 +/- ## ========================================= Coverage 74.65% 74.65% + Complexity 4148 4138 -10 ========================================= Files 444 442 -2 Lines 13114 13062 -52 Branches 1325 1317 -8 ========================================= - Hits 9790 9752 -38 + Misses 2558 2549 -9 + Partials 766 761 -5 ```

:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.

seratch commented 6 months ago

@hrothwell Thank you so much for taking your time on this! Your changes has been merged and we will release a new minor version including it shortly!