社内クローズドなリポジトリをGitHubに公開するのは色々つらいけど、おかげで色々解き放たれた件

どうもこんにちは

先月AeromockをOSSとして公開しましたが、もともとこれは社内のGithub Enterpriseにあったリポジトリで、OSSとして公開するためには色々と紆余曲折がありました。というわけでクローズドなリポジトリをGitHubに公開するまでにやったことをまとめてみます。

概要

  • リポジトリはAmeba内のGitHub Enterprise
  • Scalaで書いてて、ビルドはsbt
  • サブプロジェクトだけ一部Gradleプロジェクト
  • 成果物(Jar)は社内クローズドなnexusにディプロイ
  • ドキュメントは全てAmebaのCofluenceに書いてた(社内限定情報含む)
Mavenリポジトリ

OSS化前は、社内のクローズドなnexusリポジトリにディプロイして運用していました。これを公開時にはMaven Centralにする必要があります(独自のリポジトリ立てるのもありなんですが、運用するものは増やしたくない)。 なので、sbtやbuild.gradleに書いてあるリポジトリURLをcentral用にする必要がありました。

で、実際これぶっつけ本番になっちゃうので公開時に手間取らないように、ローカルにVagrantで仮想nexusを用意しました。GHEからGitHub(private)へ行く前までにこれでリハを済ませときました。

パッケージマネージャ

Aeromockのインストールのためにaeromock-brewというパッケージマネージャを用意してますが、社内nexusからMaven CentralからJarをダウンロードする運用に変わります。これも仮想nexusでリハ。あと別でモジュールを列挙したファイルをGithubのリポジトリからダウンロードするっていう処理があるんですが、これもprivateな状態(認証が必要)なのでテストがタルい。

Gitの過去のログ

リポジトリにはGHEで運用していた時代のログが全て残されているので、いくらでも過去の情報に巻き戻すことができるので、社外秘な情報を消しておきたいところです。この件については以下のエントリが有名ですね。

https://help.github.com/articles/remove-sensitive-data

今回は、めんどかったのでGHE→GitHubのタイミングで新しいリポジトリ作ってぶち込みました(過去のログは重要ではななかったので)

ドキュメント整備

それまで運用していたコンフルのドキュメントから、社内に関わる情報を一切排除してGitHub Wikiへ移行しました。移行作業中も新規開発やってたので、GitHub Wiki書きつつ既存のコンフルのメンテもしないといけないんで結構キツい。

あと、ドキュメントは英語でなければならないという決まりは無いんですが、少しでも利用者の裾を広げたいというのもあって、日本語・英語両方に対応しました。自分の英語力ではなかなか大変なんですが、なんとかなりました。READMEは弊社外国人エンジニアによる校正が多少入ったようです(;´Д`)

Maven Centralへのディプロイ準備

sonatypeのアカウントは用意してくれることになったので、pomをsonatype準拠にしっかり整備したり、jarにgpg署名を自動で施したりする必要があります。設定は以下のようになるので、興味あれば見てください。

その辺の詳細は、sonatypeの公式が詳しいので一度目を通しておきましょう。 http://central.sonatype.org/pages/ossrh-guide.html

最終的には一連の作業をFabricで自動化しました。

セキュリティチェック

OSSとして公開するための最初の関門として弊社セキュリティチームによるセキュリティチェックがあります。正直具体的に何をチェックされるかはわからないですが、特に問題なく通過。Vagrant Shareサポートの箇所でprivate IP書いてるとこだけ確認してくれって言われましたがそれだけでした。

ちなみにセキュリティチェックは定期的に入るようです。

OSS審議会

セキュリティチェックを突破すると、OSS審議会というのがあります。フリーザ級のエンジニアの人にチェックされます。ここではドキュメント周りに数点チェックが入ったけど無事通過。

いざ公開、そしてディプロイ

審議会を突破したのでようやくprivateリポジトリをpublicにして公開。Maven Centralのアカウントを用意してもらったので、それを使ってsonatypeへディプロイ。パッケージマネージャでのインストールもリハ通り!これで晴れて世に出すことができたわけです。

OSS化してからできるようになったこと

これまで社内環境に閉じ込められていたためできなかったことが、OSS化したことによって色々とできるようになりましたのでいくつか紹介しましょう。

CircleCI

CIツールとしてCircleCIが使えるようになったのです。OSSなので最初は werckerにしようかと思ってたけど、まだそんなに安定してないってのと、ちょうどCircleCIがpublicなリポジトリであれば無料になった(parallerismは3x)のでCircleCiにした感じです。

https://circleci.com/gh/CyberAgent/aeromock

Coveralls

CircleCIではカバレッジレポートを見たりすることはできないので、Coverallsというサービスと連携してます。これもpublicリポジトリであれば無料です。

READMEにはバッジを貼ると、Coverallsへのリンクになります。

まだカバレッジが低いですがこれからですよこれから(;゙゚'ω゚')

Gitter

GitterはGitHubが作ってると連携できるチャットサービスで、Organizationやリポジトリに紐付いた部屋を作れます。Gitterも各種サービスと連携することができて、GitHub上の動きやCircleCIでのビルド結果をActivityとして通知できます。

https://gitter.im/CyberAgent/aeromock

まだ作ったばかりですよ(ΦωΦ)。

GitterもREADMEに貼れるバッジがあります。バッジを踏めばチャットにジョインできるので、質問やコントリビュートの敷居もちょっと下がるんじゃないでしょうかね。

他にも連携できるサービスがあって、代表的なものを以下の通り。

  • BitBucket
  • GitLab
  • Trello
  • Jenkins
  • TravisCI
  • Heroku

まとめ

社内に閉じ込められて、社内のものに依存しているものをOSSとして公開するには、かなりの労力がいります。まあ公開前提のものは、最初からGithub上に作った方が楽ですね。うん、間違いない。

しかし、OSSとして公開することで開発の可能性は大きく広がります。出せるものはどんどん公開してきましょう!