Как заставить Hudson поддерживать svn ssh доступ?

Как сделать так, чтобы Hudson поддерживал доступ svn + ssh?

Сегодня моя компания переместила весь репозиторий исходного кода на другой сервер и попросила всех разработчиков начать использоватьsvn+ssh для доступа ко всему исходному коду. Напримерsvn+ssh://example.com/share/svn/repo. Наша компания использует Hudson CI для автоматической сборки исходного кода.

Goal: мне нужно настроитьHudson, чтобы он поддерживал доступ кsvn+ssh.

1. Попробуйте F-Secure Authentication Agent

Я пытаюсь использовать F-Secure Authentication Agent для генерации пары ключей - открытого и закрытого ключей. Однако, когда я отправляю закрытый ключ в Hudson Subversion Authentication, я нажимаю следующую ошибку Hudson.

Error
Attempting a public key authentication with username example
Failed to authenticate: svn: File 'NULL' is not valid OpenSSH DSA or RSA private key file
FAILED: svn: Authentication failed for svn+ssh://example.com/share/svn/repo

Понятия не имею, что случилось, похоже, Хадсон не распознал формат закрытого ключа, созданный агентом F-Secure Authentication Agent.

2. Попробуйте Putty

Я пытаюсь использовать Putty для генерации пары ключей - открытый ключ и закрытый ключ. Однако, когда я отправляю закрытый ключ в Hudson Subversion Authentication, я получаю другую ошибку.

javax.servlet.ServletException: java.lang.NullPointerException
    org.kohsuke.stapler.Stapler.invoke(Stapler.java:449)
    org.kohsuke.stapler.MetaClass$9.doDispatch(MetaClass.java:263)
    org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:30)
    org.kohsuke.stapler.Stapler.invoke(Stapler.java:440)
    org.kohsuke.stapler.Stapler.invoke(Stapler.java:361)
    org.kohsuke.stapler.Stapler.service(Stapler.java:121)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:61)
    hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:53)
    hudson.security.HudsonFilter.doFilter(HudsonFilter.java:88)
root cause

java.lang.NullPointerException
    org.kohsuke.putty.PuTTYKey.toKey(PuTTYKey.java:140)
    org.kohsuke.putty.PuTTYKey.(PuTTYKey.java:108)
    org.kohsuke.putty.PuTTYKey.(PuTTYKey.java:69)
    hudson.scm.SubversionSCM$DescriptorImpl.doPostCredential(SubversionSCM.java:1111)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    java.lang.reflect.Method.invoke(Unknown Source)
    org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:103)
    org.kohsuke.stapler.Function.bindAndinvoke(Function.java:57)
    org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:75)
    org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:30)
    org.kohsuke.stapler.Stapler.invoke(Stapler.java:440)
    org.kohsuke.stapler.MetaClass$9.doDispatch(MetaClass.java:263)
    org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:30)
    org.kohsuke.stapler.Stapler.invoke(Stapler.java:440)
    org.kohsuke.stapler.Stapler.invoke(Stapler.java:361)
    org.kohsuke.stapler.Stapler.service(Stapler.java:121)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:61)
    hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:53)
    hudson.security.HudsonFilter.doFilter(HudsonFilter.java:88)

Похоже, формат закрытого ключа Putty не подходит и для Hudson. Хм… я думал, что все методы генерации закрытых ключей должны соответствовать какому-то стандарту?

Решение

Googling Hudson ……. Ошибка поиска… .Googling…. целый день, я узнаюHudson is using OpenSSH private key format. Есть ли другие инструменты, которые я могу использовать для преобразования моего существующего закрытого ключа в формат OpenSSH?

Да,PuTTYgen.exe имеет функцию дляconvert putty private key to OpenSSH private key format. Great news, i import my existing Putty generated private key and click on the export to OpenSSH format.

image

После экспорта в формат OpenSSH закрытый ключ работает как шарм! Теперь Hudson поддерживает доступ svn + ssh.

Note
Я также обнаружил следующую ошибку во время настройки Hudson для поддержки svn + ssh, я думаю, что это также связано с недопустимым форматом закрытого ключа. После использования формата OpenSSH эта ошибка тоже исчезла.

INFO: Failed to access subversion repository svn+ssh://example.com/share/svn/repo
org.tmatesoft.svn.core.SVNCancelException: svn: No credential to try. Authentication failed
    at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.cancel(SVNErrorManager.java:36)
    at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.cancel(SVNErrorManager.java:31)
    ...
    at org.tmatesoft.svn.core.internal.io.svn.SVNSSHConnector.open(SVNSSHConnector.java:70)
    at org.tmatesoft.svn.core.internal.io.svn.SVNConnection.open(SVNConnection.java:73)