Jenkins无法连接GitLab问题求助(附异常堆栈日志)
Jenkins与GitLab连接失败问题
操作步骤
- 创建GitLab Token,尝试以下GitLab主机地址均无法连接:
https://gitlab.comhttps://gitlab.com/usernamehttps://gitlab.com/username/repository
- 安装插件:GitLab API插件、GitLab插件、Git插件、GitLab认证插件
- 将GitLab Token添加至Jenkins凭证
- 在GitLab配置区域关联该Token
错误现象
点击「测试连接」时失败,Jenkins日志关键异常堆栈如下:
2023-03-01 19:39:16.358+0000 [id=13] WARNING o.e.j.s.h.ContextHandler$Context#log: Error while serving http://34.204.61.XXX:8080/manage/descriptorByName/com.dabsquared.gitlabjenkins.connection.GitLabConnection/testConnection java.lang.IllegalArgumentException: RESTEASY003900: Unable to find a public constructor for provider class org.glassfish.jersey.jackson.internal.DefaultJacksonJaxbJsonProvider at org.jboss.resteasy.spi.ResteasyProviderFactory.createConstructorInjector(ResteasyProviderFactory.java:2844) at org.jboss.resteasy.spi.ResteasyProviderFactory.createProviderInstance(ResteasyProviderFactory.java:2833) at org.jboss.resteasy.spi.ResteasyProviderFactory.addMessageBodyReader(ResteasyProviderFactory.java:1068) at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1841) Caused: java.lang.RuntimeException: RESTEASY003940: Unable to instantiate MessageBodyReader at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:1846) at org.jboss.resteasy.spi.ResteasyProviderFactory.register(ResteasyProviderFactory.java:3065) at org.jboss.resteasy.spi.ResteasyProviderFactory.register(ResteasyProviderFactory.java:123) at org.jboss.resteasy.util.FeatureContextDelegate.register(FeatureContextDelegate.java:52) at org.jboss.resteasy.util.FeatureContextDelegate.register(FeatureContextDelegate.java:12) at org.glassfish.jersey.jackson.JacksonFeature.configure(JacksonFeature.java:107) at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProviderInstance(ResteasyProviderFactory.java:2605) at org.jboss.resteasy.spi.ResteasyProviderFactory.registerProviderInstance(ResteasyProviderFactory.java:2233) at org.jboss.resteasy.spi.ResteasyProviderFactory.register(ResteasyProviderFactory.java:3036) at org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder.register(ResteasyClientBuilder.java:617) at com.dabsquared.gitlabjenkins.gitlab.api.impl.ResteasyGitLabClientBuilder.buildClient(ResteasyGitLabClientBuilder.java:141) at com.dabsquared.gitlabjenkins.gitlab.api.impl.ResteasyGitLabClientBuilder.buildClient(ResteasyGitLabClientBuilder.java:92) at com.dabsquared.gitlabjenkins.gitlab.api.impl.AutodetectingGitLabClient.autodetect(AutodetectingGitLabClient.java:378) at com.dabsquared.gitlabjenkins.gitlab.api.impl.AutodetectingGitLabClient.autodetectOrDie(AutodetectingGitLabClient.java:368) at com.dabsquared.gitlabjenkins.gitlab.api.impl.AutodetectingGitLabClient.delegate(AutodetectingGitLabClient.java:361) at com.dabsquared.gitlabjenkins.gitlab.api.impl.AutodetectingGitLabClient$GitLabOperation.execute(AutodetectingGitLabClient.java:397) at com.dabsquared.gitlabjenkins.gitlab.api.impl.AutodetectingGitLabClient.execute(AutodetectingGitLabClient.java:391) at com.dabsquared.gitlabjenkins.gitlab.api.impl.AutodetectingGitLabClient.getCurrentUser(AutodetectingGitLabClient.java:306) at com.dabsquared.gitlabjenkins.connection.GitLabConnection$DescriptorImpl.doTestConnection(GitLabConnection.java:259) at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:710) at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:397) Caused: java.lang.reflect.InvocationTargetException at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:401) at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:409) at org.kohsuke.stapler.interceptor.RequirePOST$Processor.invoke(RequirePOST.java:78) at org.kohsuke.stapler.PreInvokeInterceptedFunction.invoke(PreInvokeInterceptedFunction.java:26) at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:207) at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:140) at org.kohsuke.stapler.MetaClass$11.doDispatch(MetaClass.java:558) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:59) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:762) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:894) at org.kohsuke.stapler.MetaClass$4.doDispatch(MetaClass.java:289) at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:59) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:762) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:894) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:830) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:894) at org.kohsuke.stapler.MetaClass$9.dispatch(MetaClass.java:475) at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:762) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:894) at org.kohsuke.stapler.Stapler.invoke(Stapler.java:690) at org.kohsuke.stapler.Stapler.service(Stapler.java:240) at javax.servlet.http.HttpServlet.service(HttpServlet.java:590) at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764) at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1665) at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:157) at jenkins.telemetry.impl.UserLanguages$AcceptLanguageFilter.doFilter(UserLanguages.java:129) at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154) at jenkins.security.ResourceDomainFilter.doFilter(ResourceDomainFilter.java:81) at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154) at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:160) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:154) at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:202) at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1635) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:94) at jenkins.security.AcegiSecurityExceptionFilter.doFilter(AcegiSecurityExceptionFilter.java:52) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99) at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:54) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99) at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99) at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:106) at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:97) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:223) at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99) at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:97) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:63) at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:99) at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:111)
注:完整堆栈日志更长,推测首行异常信息是问题关键
额外信息
- Jenkins部署在AWS EC2实例的Docker容器中
- EC2入站/出站规则已开放22、80、8080、443端口,允许所有来源访问
解决建议
1. 修正GitLab主机地址
连接GitLab.com时,正确的主机地址应为https://gitlab.com,无需添加用户名或仓库路径。带路径的地址会导致API请求定位错误,仅填写根域名即可。
2. 排查插件版本冲突
日志中Unable to find a public constructor for provider class org.glassfish.jersey.jackson.internal.DefaultJacksonJaxbJsonProvider异常,说明Jackson相关依赖存在版本冲突,这通常由Jenkins插件不兼容导致:
- 卸载已安装的所有GitLab相关插件,清理Jenkins插件缓存后,重新安装最新稳定版的GitLab插件(无需单独安装GitLab API插件,GitLab插件已包含必要依赖)
- 检查Jenkins核心版本与GitLab插件的兼容性,确保核心版本满足插件最低要求
3. 优化Docker部署配置
如果使用自定义Jenkins镜像,尝试更换官方LTS镜像(如jenkins/jenkins:lts),避免镜像内存在依赖冲突。启动容器时确保正确挂载插件目录,防止依赖文件损坏。
4. 验证Token权限
确认GitLab Token拥有api、read_user权限,这是Jenkins与GitLab进行API交互的必要权限。生成Token后重新添加到Jenkins凭证中,确保凭证类型选择「Secret text」。
5. 测试容器内网络连通性
进入Docker容器内部,执行curl https://gitlab.com/api/v4/user -H "PRIVATE-TOKEN: <你的Token>",验证是否能正常返回用户信息,排除容器内代理、DNS解析等网络层面问题。
内容的提问来源于stack exchange,提问作者hhrzc
相关产品推荐
相关产品推荐

