Jenkins+Maven+Nexusでのハマりどころ

Java

今回は自宅サーバーでJenkinsとMavenとNexusを使って自宅開発環境を整備してハマったところをご紹介。

ハマりどころ其の一。

Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No X509TrustManager implementation available
  at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1764)
  at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)
  at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)
  at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206)
  at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)
  at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
  at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:958)
  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1203)
  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1230)
  at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1214)
  at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434)
  at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
  at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:133)
  at hudson.cli.CLI.getCliTcpPort(CLI.java:272) ... 4 more Caused by: java.security.cert.CertificateException: No X509TrustManager implementation available
  at com.sun.net.ssl.internal.ssl.DummyX509TrustManager.checkServerTrusted(SSLContextImpl.java:232)
  at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1198) ... 15 more

NexusをHTTPSで稼働していて、当然のごとくオレオレ認証局で認可しているわけですが。。
ブラウザ上ではよく信頼しますか?的な画面が出て、はいを選べば問題なく表示されます。
しかし、Jenkins(Maven)さんはそんなことしてくれませんw

対応策はMaven公式だとSunのkeytoolを使って証明書を作成して、それをMaven起動時のオプションに設定するとかなのですが、
手っ取り早いのはオレオレ認証局のブラウザ対応と同じく、オレオレ認証局を信頼するルートCAとして登録してしまうのが良いです(笑)

/usr/java/default/bin/keytool -import -file {オレオレ認証局の証明書} -keystore /usr/java/default/jre/lib/security/cacerts -alias CA名

でパスワードを聞かれるので「changeit」と入力。

ハマりどころ其の二

[INFO] Executing: /bin/sh -c cd /****/**** && git symbolic-ref HEAD
[INFO] Working directory: /****/****
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.314 s
[INFO] Finished at: 2014-03-01T21:34:17+09:00
[INFO] Final Memory: 12M/235M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.4.2:prepare (default-cli) on project parent: An error is occurred in the checkin process: Exception while executing SCM command. Detecting the current branch failed: fatal: ref HEAD is not a symbolic ref ->[Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR][Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException[JENKINS] Archiving /****/****/pom.xml to /****/****.pom channel stopped Finished: FAILURE

こいつはかなり厄介でした。
JenkinsでSSLのSCMからチェックアウトしてMavenビルド->NexusにSNAPSHOTのアップロードまでできたのにmave-relese-pluginがうまく動かない。。
サーバー上で直接MVN release:prepare release:performを叩くとうまくいくからいっそJenkinsのm2-release-pluginは使わないという選択肢も考えました。
が、グーグル先生に問い合わせること数時間。。。
ビルド設定->Git設定->Additional BehavioursにCheck out to specific local branchを追加。
masterブランチをチェックアウトするようにしたら見事に動きました。

無事にSNAPSHOTバージョンで開発してGitにPUSH->Jenkinsでビルド->Nexusに上がったSNAPSHOTの検証->Jenkinsでリリースという一連の流れができるようになりました。

コメント

タイトルとURLをコピーしました