Jenkins active-directory 找不到匹配的构造函数



注意:我擅长EnterpriseLinux,但假设我充其量是一个不情愿的行人,对于Jenkins,jars,wars,jpis,java和groovy。 我很抱歉。

我在 RHEL7 上设置了一个 Jenkins 盒子,主要是通过(诚然腐烂的(Chef 食谱,所以它是可重复的,几乎是防白痴的。 在添加模块时,我通过本地文件(安全站点,无网络访问(添加 HPI,如下所示:

plugins=%w(active-directory mailer display-url-api)
require 'digest'
plugins
.each_with_index do |plugin_with_version, index|
p, v = plugin_with_version.split(':')  # yeah I know
source = "#{Chef::Config[:file_cache_path]}/cookbooks/#{cookbook_name}/files/default/#{p}.hpi"
directory  "#{node['jenkins']['master']['home']}/plugins" do
owner     node['jenkins']['master']['user']
group     node['jenkins']['master']['group']
mode      0755
end
cookbook_file "#{node['jenkins']['master']['home']}/plugins/#{p}.hpi" do
action    :create
owner     node['jenkins']['master']['user']
group     node['jenkins']['master']['group']
mode      0755
notifies  :create, "ruby_block[jenkins_restart_flag]", :immediately
end
end

当我使用 HPI 预玩游戏文件部分时,它会填充/var/lib/jenkins/plugins 位置,所以我想我到了那里。

# ls -l /var/lib/jenkins/plugins/
total 708
drwxr-xr-x 6 jenkins jenkins     77 Aug 30 08:37 active-directory
-rwxr-xr-x 1 jenkins jenkins 583280 Aug 30 08:37 active-directory.hpi
drwxr-xr-x 4 jenkins jenkins     53 Aug 30 08:37 display-url-api
-rwxr-xr-x 1 jenkins jenkins  19478 Aug 30 08:37 display-url-api.hpi
drwxr-xr-x 4 jenkins jenkins     53 Aug 30 08:37 mailer
-rwxr-xr-x 1 jenkins jenkins 115745 Aug 30 08:37 mailer.hpi

事实上,这三个插件似乎都在/pluginManager/install 中处于活动状态:

active directory plugin  2.8
Display URL API          2.2.0
Mailer Plugin            1.21

.. 两个 deps 的框被选中并变暗,其中 AD 插件刚刚被选中。 这表明它们已被安装和激活,但我猜是。

现在要配置 AD 插件,我认为,这就是今天出现严重错误的地方。

这是我正在使用的脚本,大约是第 5 个这样的脚本(当大脑失去线索时,谷歌是我唯一的朋友(:

import hudson.plugins.active_directory.*
import jenkins.model.*
def instance = Jenkins.getInstance();
def ActiveDirectoryDomain adDomain = new ActiveDirectoryDomain("Example_Domain_Name_2", "Example_Domain_Controller_
2");
def domains = new ArrayList<ActiveDirectoryDomain>();
domains.add(adDomain);
def securityRealm = new ActiveDirectorySecurityRealm(
"",
domains,
"",
"",
"",
"",
GroupLookupStrategy.RECURSIVE,
false,
true,
null)
println(securityRealm.domains)
instance.setSecurityRealm(securityRealm)
instance.save()

但这种调用完全保释。 错误消息的实质是,删除厨师咩咩声,是:

---- Begin output of "/usr/lib/jvm/java-1.8.0/bin/java" -jar "/var/chef/cache/jenkins-cli.jar" -s http://localhost:8080 -"remoting" groovy = ----
STDOUT:
STDERR: Aug 30, 2018 1:32:03 PM org.jenkinsci.remoting.util.AnonymousClassWarnings warn
WARNING: Attempt to (de-)serialize anonymous class hudson.cli.ClientAuthenticationCache$1; see: https://jenkins.io/redirect/serialization-of-anonymous-classes/
ERROR: Unexpected exception occurred while performing groovy command.
groovy.lang.GroovyRuntimeException: Could not find matching constructor for: hudson.plugins.active_directory.ActiveDirectorySecurityRealm(java.lang.String, java.util.ArrayList, java.lang.String, java.lang.String, java.lang.String, java.lang.String, hudson.plugins.active_directory.GroupLookupStrategy, java.lang.Boolean, java.lang.Boolean, null)
at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1732)
at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1532)
at org.codehaus.groovy.runtime.callsite.MetaClassConstructorSite.callConstructor(MetaClassConstructorSite.java:49)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:60)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:235)
at RemoteClass.run(RemoteClass:9)
at groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:263)
at groovy.lang.GroovyShell.run(GroovyShell.java:518)
at groovy.lang.GroovyShell.run(GroovyShell.java:497)
at hudson.cli.GroovyCommand.run(GroovyCommand.java:89)
at hudson.cli.CLICommand.main(CLICommand.java:280)
at hudson.cli.CliManagerImpl.main(CliManagerImpl.java:95)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.perform(RemoteInvocationHandler.java:929)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.call(RemoteInvocationHandler.java:903)
at hudson.remoting.RemoteInvocationHandler$RPCRequest.call(RemoteInvocationHandler.java:855)
at hudson.remoting.UserRequest.perform(UserRequest.java:212)
at hudson.remoting.UserRequest.perform(UserRequest.java:54)
at hudson.remoting.Request$2.run(Request.java:369)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
at hudson.cli.CliManagerImpl$1.call(CliManagerImpl.java:66)
at hudson.remoting.CallableDecoratorAdapter.call(CallableDecoratorAdapter.java:18)
at hudson.remoting.CallableDecoratorList$1.call(CallableDecoratorList.java:21)
at jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46)
at jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71)
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)
---- End output of "/usr/lib/jvm/java-1.8.0/bin/java" -jar "/var/chef/cache/jenkins-cli.jar" -s http://localhost:8080 -"remoting" groovy = ----

没有快乐,对吧? 这是最精选的剪辑:

groovy.lang.GroovyRuntimeException: Could not find matching constructor for: hudson.plugins.active_directory.ActiveDirectorySecurityRealm(java.lang.String, java.util.ArrayList, java.lang.String, java.lang.String, java.lang.String, java.lang.String, hudson.plugins.active_directory.GroupLookupStrategy, java.lang.Boolean, java.lang.Boolean, null)

现在,在我们深入研究这个问题之前,我确实想说我也尝试过的其他(实际上是 3 或 4 个(脚本,就像互联网上的 van-candy 一样,也因类似的构造函数错误而获得保释。 如果需要,我可以运行这些并呈现错误进行比较,但我想建议的是它闻起来像一个更大的问题,不知何故我的插件没有丢弃它们应该的代码,即使一切看起来都很好。 再次,还在猜测。

是的,在其他 3-4 次尝试中,我使用内部自定义数据调整了脚本;这一次,士气如此低落,我什至没有打扰。 但我保证我在其余部分使用了有效数据,如果我们能克服构造函数错误,计划是使用实际值。

以及问题,按非常特殊的顺序:

  1. Groovy创建该AD配置的已知良好的调用是什么? 最新的代码库似乎发生了很大变化?
  2. 有没有人在类似的设置中看到这个时髦的构造函数问题?
  3. 有什么提示让我更接近胜利吗?

感谢您阅读本文,我希望您的一天进展顺利。

所以 Jenkins 中的所有 Groovy 脚本都是在实际 Java 对象上非常薄的一层,所以要找到合适的构造函数,我们需要查看插件的代码: https://github.com/jenkinsci/active-directory-plugin/blob/1b082cbfb7d236d326c218c7b474fb51cb930080/src/main/java/hudson/plugins/active_directory/ActiveDirectorySecurityRealm.java#L224-L270

如果我们以第一个构造函数为例:

ActiveDirectorySecurityRealm(String domain, String site, String bindName, String bindPassword, String server)

所以你会这样称呼它:

def securityRealm = new ActiveDirectorySecurityRealm("Example_Domain_Name_2", null, null, null,  "Example_Domain_Controller_2")

或类似的东西。

首先,记得在添加插件后重新启动 Jenkins! 这似乎是一件需要强调的大事。

按照诺亚的提示,以下是对我有用的方法:

import hudson.plugins.active_directory.*
import jenkins.model.*
def instance = Jenkins.getInstance();
// public ActiveDirectorySecurityRealm(String domain, String site, String bindName, String bindPassword, String server)
def securityRealm = new ActiveDirectorySecurityRealm(
'myRealm',
'Default-First-Site-Name',
'bindaddr@myRealm,
'bindpassword_cleartext',
'ad_server1fqdn,ad_server2fqdn'
)
securityRealm.getDomains().each({
it.site = securityRealm.site
it.bindName = securityRealm.bindName
it.bindPassword = securityRealm.bindPassword
})
instance.setSecurityRealm(securityRealm)
instance.save()

请注意,我也在这里添加了康斯坦丁诺斯的调整。

.. 它奏效了! 我认为。无警报。 直到我理解了缺少保护代码和清理部分,它不断刷新它不需要的位,并且从不删除它应该删除的位,也就是说 - 绝对是我们不喜欢在自动化中使用它的模式。 所以我无论如何都无法复制配置,但至少我有模型来生成它。 还是美好的一天。

将来:

  1. 从本周的代码版本中查找最佳构造函数
  2. 使用它在脚本中形成最简单的调用
  3. 检查康斯坦丁诺斯是否仍然需要调整

非常感谢康斯坦丁诺斯和诺亚。 我显然不能建议你给予他们荣誉,但我非常感激。

最新更新