Hudsonにsvn + sshアクセスをサポートさせるには?

Hudsonにsvn + sshアクセスをサポートさせるにはどうすればよいですか?

今日、私の会社はすべてのソースコードリポジトリを別のサーバーに移動し、すべての開発者にsvn+sshを使用してすべてのソースコードにアクセスするように要求しました。 たとえば、svn+ssh://example.com/share/svn/repo。 当社では、Hudson CIを使用してソースコードを自動的にビルドしています。

Goalsvn+sshアクセスをサポートするようにHudsonを構成する必要があります。

1. F-Secure認証エージェントを試す

F-Secure認証エージェントを使用して、公開キーと秘密キーのキーのペアを生成しようとしています。 ただし、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認証エージェントによって生成された秘密キー形式を認識しなかったようです。

2. パテを試す

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)

パテの秘密鍵形式はハドソンにとっても適切ではないようです。 うーん...私はすべての秘密鍵生成方法が何らかの標準に従うべきだと思いましたか?

溶液

グーグルハドソン……。グーグルエラー…。グーグル…。 一日中、私は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形式にエクスポートした後、秘密鍵は魅力のように機能します! ハドソンは現在、svn + sshアクセスをサポートしています。

Note
svn + sshをサポートするためにHudsonを構成しているときに、次のエラーも発生しました。これも無効な秘密鍵形式が原因だと思います。 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)