在Jenkins中使用Git Plugin訪問Https代碼庫失敗的問題

  最近須要在Jenkins上配置一個Job,SCM源是http://git.opendaylight.org/gerrit/p/integration.git
  因而使用Jenkins的Git Plugin作這件事情。
  結果報錯以下:java

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自己有bug就不能支持https,我以爲應該不至於吧,查看了git plugin的主頁(https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin)也沒有發現什麼端倪。因而又隨便嘗試了一下github上的某個https的git庫,是能夠clone下來的,這就說明支持https是沒問題的。那麼問題出在哪裏呢?從新複習了一下SSL/TSL的原理以後,認爲問題應該出在頒發證書的CA上,因而在瀏覽器中去查看兩者的CA有何不一樣,以下:git

  github使用的是DigiCert的證書,而opendaylight用的是StartCom的。上網一查,這個StartCom頒發的整數竟然是免費的。這樣看來,緣由大概就是Java不信任這個CA了。那麼解決方法應該就是把這個CA添加到Java的信任列表。具體作法以下:
1. 首先要獲得StartCom的證書文件(xxx.cer)。從哪裏得到呢?既然瀏覽器可以正常訪問,說明系統中是信任StartCom的證書的,因此先打開系統的證書管理界面。在Mac中是Keychain,打開以後找到StartCom的證書,而後右鍵導出成一個.cer文件,命名爲startcom.cer。github

2. 而後使用下面的命令把上面那個cer文件導入到Java的運行時系統中:瀏覽器

keytool -import -alias startcom  -keystore %JRE_HOME/lib/security/cacerts  -file startcom.cer

  運行該命令時會提示輸入密碼,若是你沒有改過的話密碼是’changeit’
  而後再運行下面的命令,就能夠看到StartCom已經被加進去了。less

keytool -list -keystore  %JRE_HOME/lib/security/cacerts  | less

  而後在在Jenkins中配置git路徑,git clone成功!
ide

相關文章
相關標籤/搜索