travis-ciを使ってSNAPSHOTのjarを自動でsonatypeにpublish

最近いつくかのプロジェクトがやっていたので

真似してやってみました。


手順としては*1

  • travis-ciのコマンドラインクライアントを、gemを使ってインストー
  • そのコマンドラインクライアントを使って、sonatypeのuser名とpasswordなどのpublishする際に必要な(だが直接ビルドファイルには書けない)情報を、SONATYPE_USER、SONATYPE_PASSというkey(keyの名前は任意)に暗号化する
  • その暗号化したkeyを.travis.ymlに設定。*2また、環境変数からそれらを読み込んでCredentialsを設定する以下の様なコードをbuild.sbtもしくはbuild.scalaに書く
val userPass = for {
  user <- sys.env.get("SONATYPE_USER")
  pass <- sys.env.get("SONATYPE_PASS")
} yield (user, pass)

credentials ++= userPass.map{
  case (user, pass) => Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", user, pass) :: Nil
}.getOrElse(Nil)

https://github.com/xuwei-k/iarray/commit/f7e4e570e24e1

という流れです。

以下参考URL

これで、githubにpushする度に、自動で毎回snapshotのjarがsonatypeにpublishされるようになります。


セキュリティ的に大丈夫なのかな(pull reqのときとか)と思って、ちょっと試してみた限りは大丈夫でした。
*3
ただあまりない状況でしょうが、コミット権がある人が、よくわからないミスするか、githubの権限奪われたりして、
println(sys.env.get("SONATYPE_PASS"))
というコードをpushされてしてしまったら、自分のsonatypeのパスワード漏れだすことにはなりますね。



その他、セキュリティ的にtravis-ciを信用出来ないという人はやらないほうがいいでしょうが、そのあたりは自分で判断してください

*1:sonatypeのアカウント持っていたり、すでに基本的な設定は済んでいるのが前提です

*2:.travis.ymlのscriptの項目も変えるのも忘れずに

*3:pull reqのコードに、println( sys.env.get("SONATYPE_PASS") ) などを入れても、mergeしない限りは表示されなかった