Jenkins active-directory Не удалось найти соответствующий конструктор - PullRequest
0 голосов
/ 31 августа 2018

Осторожно: я хорошо разбираюсь в EnterpriseLinux, но предположим, что я в лучшем случае неохотный пешеход в Дженкинсе, банках, войнах, jpis, java и groovy. Мне очень жаль.

Я установил коробку Дженкинса на RHEL7, в основном с помощью (по-видимому, гниющей) поваренной книги шеф-повара, так что она повторяемая и почти идиотская. Когда дело доходит до добавления модуля, я добавляю 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 / Установлено:

active directory plugin  2.8
Display URL API          2.2.0
Mailer Plugin            1.21

.. и два deps имеют свои флажки и затемнены, где плагин AD только что отмечен. Это говорит о том, что они установлены и активированы, но я предполагаю.

Теперь о настройке плагина AD, я думаю, и вот где сегодня дела идут ужасно неправильно.

Здесь это сценарий, который я использую, о 5th такой сценарий (Google - мой единственный друг здесь, когда мозги ушли):

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) скрипты, которые я тоже пробовал, как и интернет-фургон, тоже с ошибками конструктора. Я могу запустить их и представить ошибки для сравнения, если это необходимо, но я хочу сказать, что это пахнет как большая проблема, что мои аддоны почему-то не добавляются в код, который они должны быть, даже если все выглядит хорошо , Снова все еще догадываюсь.

И да, в других 3-4 попытках я настраивал сценарии с помощью внутренних пользовательских данных; этот, с таким низким моральным духом, я даже не беспокоился. Но я обещаю, что я использовал действительные данные с остальными, и планируется использовать реальные значения, если мы сможем обойти ошибку конструктора.

И вопросы, в очень особом порядке:

  1. что за хорошо известный вызов groovy для создания этой конфигурации AD? С самой последней из того, что кажется очень изменяющейся кодовой базой?
  2. Кто-нибудь еще видел эту нестандартную проблему с конструктором с аналогичной настройкой?
  3. Какие-нибудь подсказки, чтобы приблизить меня к победе?

Спасибо, что прочитали это далеко, и я надеюсь, что ваш день идет очень хорошо. ; -) * * 1051

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Во-первых, не забудьте перезапустить 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. проверить, нужен ли еще твик Константиноса

Большое спасибо Константиносу и Ною здесь. Я, видимо, не могу рекомендовать вам отдать им должное, но я очень благодарен.

0 голосов
/ 31 августа 2018

Таким образом, все скрипты Groovy в Jenkins - это очень тонкий слой над реальными объектами 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")

Или что-то в этом роде.

...