標籤:style blog http color io ar 使用 java sp
最近需要在Jenkins上配置一個Job,SCM源是http://git.opendaylight.org/gerrit/p/integration.git
於是使用Jenkins的Git Plugin做這件事情。
結果報錯如下:
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有何不同,如下:
github使用的是DigiCert的認證,而opendaylight用的是StartCom的。上網一查,這個StartCom頒發的整數居然是免費的。這樣看來,原因大概就是Java不信任這個CA了。那麼解決方案應該就是把這個CA添加到Java的信任清單。具體做法如下:
1. 首先要得到StartCom的認證檔案(xxx.cer)。從哪裡獲得呢?既然瀏覽器能夠正常訪問,說明系統中是信任StartCom的認證的,所以先開啟系統的認證管理介面。在Mac中是Keychain,開啟之後找到StartCom的認證,然後右鍵匯出成一個.cer檔案,命名為startcom.cer。
2. 然後使用下面的命令把上面那個cer檔案匯入到Java的運行時系統中:
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成功!
在Jenkins中使用Git Plugin訪問Https程式碼程式庫失敗的問題