JenkinsでGit Pluginを使用してHttpsコードライブラリにアクセスできなかった問題
4072 ワード
最近JenkinsでJobを構成する必要があります.SCMソースはhttp://git.opendaylight.org/gerrit/p/integration.gitそこでJenkinsのGit Pluginを使ってこのことをしました.その結果、次のようにエラーが発生しました.
しかし、コマンドラインでgit cloneを直接実行するのは良いのですが、違いはどこにあるのでしょうか.ネットで調べてみると、Jenkins全体がJavaの上に構築されているという考え方が得られました.gitの引き継ぎの範囲に入る前に、Javaが何かをしていました.git自体が仕事ができる以上、Java側の問題だったはずです.具体的なエラーを調べると、SSL/TSL証明書と関係があることがわかりました.StackOverflowでgit plugin自体にバグがあるとhttpsをサポートできないという同志がいるのを見て、そうではないかと思いgit pluginのホームページ(https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin)も何の手がかりも見つからなかった.そこでgithubのあるhttpsのgitライブラリを勝手に試してみましたが、cloneしてもいいので、httpsをサポートしても大丈夫だということです.では、問題はどこにあるのでしょうか.SSL/TSLの原理を復習した後、証明書を発行するCAに問題があると考え、ブラウザで両者のCAの違いを調べてみました.
githubはDigiCertの証明書を使用し、opendaylightはStartComを使用しています.インターネットで調べてみると、このStartComが発行した整数は意外にも無料だった.こうしてみると、JavaがこのCAを信用していないのが原因かもしれません.では、解決策はこのCAをJavaの信頼リストに追加することです.具体的なやり方は以下の通りである:1.まずStartComの証明書ファイル(xxx.cer)を入手します.どこから入手しますか?ブラウザが正常にアクセスできる以上、システムではStartComの証明書を信頼していることを示しますので、まずシステムの証明書管理インタフェースを開きます.MacではKeychainで、開いてからStartComの証明書を見つけて、それから右クリックして.cerファイルにエクスポートしてstartcom.cerと名付けます.
2.次のコマンドを使用して、Javaのランタイムシステムに上記のcerファイルをインポートします.
このコマンドを実行するとパスワードの入力を求められますが、変更していない場合はパスワードが「changeit」で次のコマンドを実行すると、StartComが追加されていることがわかります.
そしてJenkinsでgitパスを設定しgit cloneに成功!
hudson.plugins.git.GitException: Failed to fetch from https://git.opendaylight.org/gerrit/p/integration.git
at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:627)
at hudson.plugins.git.GitSCM.retrieveChanges(GitSCM.java:865)
at hudson.plugins.git.GitSCM.checkout(GitSCM.java:890)
at hudson.model.AbstractProject.checkout(AbstractProject.java:1415)
at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:652)
at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:88)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:561)
at hudson.model.Run.execute(Run.java:1678)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46)
at hudson.model.ResourceController.execute(ResourceController.java:88)
at hudson.model.Executor.run(Executor.java:231)
Caused by: hudson.plugins.git.GitException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.checkCredentials(CliGitAPIImpl.java:2198)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.launchCommandWithCredentials(CliGitAPIImpl.java:1152)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.access$200(CliGitAPIImpl.java:87)
at org.jenkinsci.plugins.gitclient.CliGitAPIImpl$1.execute(CliGitAPIImpl.java:266)
at hudson.plugins.git.GitSCM.fetchFrom(GitSCM.java:625)
... 10 more
しかし、コマンドラインでgit cloneを直接実行するのは良いのですが、違いはどこにあるのでしょうか.ネットで調べてみると、Jenkins全体がJavaの上に構築されているという考え方が得られました.gitの引き継ぎの範囲に入る前に、Javaが何かをしていました.git自体が仕事ができる以上、Java側の問題だったはずです.具体的なエラーを調べると、SSL/TSL証明書と関係があることがわかりました.StackOverflowでgit plugin自体にバグがあるとhttpsをサポートできないという同志がいるのを見て、そうではないかと思いgit pluginのホームページ(https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin)も何の手がかりも見つからなかった.そこでgithubのあるhttpsのgitライブラリを勝手に試してみましたが、cloneしてもいいので、httpsをサポートしても大丈夫だということです.では、問題はどこにあるのでしょうか.SSL/TSLの原理を復習した後、証明書を発行するCAに問題があると考え、ブラウザで両者のCAの違いを調べてみました.
githubはDigiCertの証明書を使用し、opendaylightはStartComを使用しています.インターネットで調べてみると、このStartComが発行した整数は意外にも無料だった.こうしてみると、JavaがこのCAを信用していないのが原因かもしれません.では、解決策はこのCAをJavaの信頼リストに追加することです.具体的なやり方は以下の通りである:1.まずStartComの証明書ファイル(xxx.cer)を入手します.どこから入手しますか?ブラウザが正常にアクセスできる以上、システムではStartComの証明書を信頼していることを示しますので、まずシステムの証明書管理インタフェースを開きます.MacではKeychainで、開いてからStartComの証明書を見つけて、それから右クリックして.cerファイルにエクスポートしてstartcom.cerと名付けます.
2.次のコマンドを使用して、Javaのランタイムシステムに上記のcerファイルをインポートします.
keytool -import -alias startcom -keystore %JRE_HOME/lib/security/cacerts -file startcom.cer
このコマンドを実行するとパスワードの入力を求められますが、変更していない場合はパスワードが「changeit」で次のコマンドを実行すると、StartComが追加されていることがわかります.
keytool -list -keystore %JRE_HOME/lib/security/cacerts | less
そしてJenkinsでgitパスを設定しgit cloneに成功!