GitBucketを支えるJava技術とグローバルで使われるOSSの作り方

6,692 views

Published on

at JJUG CCC 2016 Fall #jjug_ccc

Published in: Software
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,692
On SlideShare
0
From Embeds
0
Number of Embeds
5,242
Actions
Shares
0
Downloads
15
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

GitBucketを支えるJava技術とグローバルで使われるOSSの作り方

  1. 1. GitBucketを支えるJava技術と グローバルで使われるOSSの作り方 Naoki Takezoe @takezoen
  2. 2. 自己紹介 ● 竹添 直樹 @takezoen ● 株式会社ビズリーチ勤務 ● Java→Scala ● GitBucketやScalatraなどのOSSを開発してい ます
  3. 3. Agenda ● GitBucketの紹介 ● OSSの成長に必要なもの ● 今後の展望
  4. 4. Agenda ● GitBucketの紹介 ● OSSの成長に必要なもの ● 今後の展望
  5. 5. GitBucketとは? ● Scalaで実装されたOSSのGitサーバ ○ イントラネット内のサーバ等にインストールできます ● インストールはめっちゃ簡単 ○ Javaさえ動作すればどこでも動作します $ java -jar gitbucket.war
  6. 6. リポジトリビューア
  7. 7. イシュー
  8. 8. プルリクエスト
  9. 9. GitBucketの機能 ● Public / PrivateなGitリポジトリ (httpとsshでアクセス可能) ● アクティビティのタイムライン表示を含むダッシュボード ● オンラインでのファイル編集も可能なリポジトリビューア ● Markdown書式が利用可能なWiki ● イシュー、プルリクエスト ● ソースコードへのコメント ● リポジトリのフォーク ● Eメールによる通知 ● ユーザ、グループによる権限管理、LDAP連携 ● Gravator連携 ● GitHub互換のWeb API ● プラグインによる拡張 ● H2 / MySQL / PostgreSQL Herokuでデモサイトが動いています: http://gitbucket.herokuapp.com/
  10. 10. GitBucketの開発について ● コミッタはいまのところ日本人中心 ● 必ず月1回リリース ● 使用しているフレームワーク(Scalatra)の開発に も積極的に関与している
  11. 11. これまでの歩み ● 2013年4月頃開発開始 ● 2013年7月1.0リリース ● 2014年5月2.0リリース ● 2014年6月GitBucket News開始 ● 2015年3月3.0リリース(プラグイン導入) ● 2015年9月gitbucket community plugins開始 ● 2016年4月4.0リリース(外部DBサポート) ● 2016年7月4.3リリース(独自UIへ)
  12. 12. 技術的な話
  13. 13. 技術スタック Git Repository RDBMS (H2 / MySQL / PostgreSQL) JGit Slick Apache MINA SSHD Jetty GitServlet (JGit) Scalatra / Twirl Git Client Web Browser SSH HTTP
  14. 14. Scalaの特徴 ● オブジェクト指向言語 + 関数型言語の機能 ○ Javaよりも強力な型安全性 ○ スクリプト言語のような柔軟性 ● Javaとの相互運用性 ○ 既存の膨大なJavaの資産を利用可能 ○ 最新のScala 2.12ではJava8のサポートも強化
  15. 15. Scalaの特徴を活かしたフレームワーク ● Scalatra(Webフレームワーク) ● Slick(DBアクセスライブラリ) ● Twirl(テンプレートエンジン)
  16. 16. Slick: タイプセーフなクエリDSL Issues .filter { t1 => t1.issueId === issueId.bind } .innerJoin(Accounts).on { case (t1, t2) => t1.userId === t2.userId } .map{ case (t1, t2) => (t1.issueId, t1.title, t2.userName) } .list
  17. 17. Twirl: タイプセーフなテンプレートエンジン @(account: model.Account) <ul> <li>user namne: @account.name</li> <li>email: @account.email</li> @if(account.isManager){ <li>role: Manager</li> } else { <li>role: Developer</li> } </li>
  18. 18. Scalaが少人数での開発を支えている ● 大規模なコードでも型によるチェックで修正漏れを 防ぐことができる ● Javaでは複雑な生SQLやHTMLテンプレートな どにおいて型安全性を活かせない ● Scalaはコンパイルが遅いがGitBucketにおいて はそれ以上に圧倒的なメリットがある
  19. 19. GitBucketを支えるJava技術 ● Jetty ● JGit ● Apache MINA ● H2 database
  20. 20. GitBucketを支えるJava技術 Git Repository RDBMS (H2 / MySQL / PostgreSQL) JGit Slick Apache MINA SSHD Jetty GitServlet (JGit) Scalatra / Twirl Git Client Web Browser SSH HTTP
  21. 21. 独自開発のJavaライブラリ 汎用的なものは敢えてJavaで作っている ● markedj ○ marked.jsというGitHub Flavored Markdown互換の MarkdownパーサをJavaに移植したもの ○ 現在はcommonmarkへの移行を検討中 ● solidbase ○ Liquibaseをベースにマルチテナント、マルチデータソース に対応したマイグレーションツール
  22. 22. 既存のJava資産を支えるのは大きい ● 低レイヤのミドルウェアやライブラリのネイティブ 実装が充実している ● Javaさえ動けばどこでも簡単に動作するアプリ ケーションを開発することができる
  23. 23. プラグインシステム ● Scalaで記述できる ○ コンパイルしたjarを特定のディレクトリに配置して GitBucketを起動すると読み込まれる ● 様々な拡張ポイントを利用可能 ○ GitBucketが使用しているフレームワークの機能、コアが 提供する全てのAPIを利用可能
  24. 24. こんなプラグインがあります プラグイン 説明 Announce plugin ユーザにメールでのアナウンスをするためのプラグイン H2 Backup plugin H2のデータをダンプするためのプラグイン Desktop Notification デスクトップ通知を行うためのプラグイン Gist plugin スニペットを管理するためのプラグイン Commits graph plugin ユーザ毎のコミット数を表示するプラグイン  Asciidoc plugin Asciidocのレンダリングをできるようにするプラグイン Bugspots plugin リポジトリのソースコードに Bugspotsを適用するプラグイン Pages plugin リポジトリの内容をWebページとして公開するためのプラグイン Network plugin コミットのネットワークグラフを表示するプラグイン Emoji plugin WikiやIssuesなどで絵文字を使えるようにするプラグイン RST plugin ReStructuredTextのレンダリングをできるようにするプラグイン
  25. 25. GitBucketプラグインを作ってみよう http://takezoe.hatenablog.com/entry/2016/08/06/202109
  26. 26. Agenda ● GitBucketの紹介 ● OSSの成長に必要なもの ● 今後の展望
  27. 27. OSSの成長に必要なもの ● ユーザ ● 開発者 ● コミュニティ ● エコシステム
  28. 28. GitBucketはどのくらい? ● 6000 stars ● 100 contributors ● 1300 issues / pull requests ● 380 gitter users
  29. 29. 私のOSS代表作 ● FreeStyle Wiki 2003年〜 ○ 日本人ユーザがターゲットだった ○ プラグインを作ってくださる方も多かった ● Project Amateras 2004年〜 ○ 英語のWebサイト、ユーザインターフェースを提供 ○ 海外:日本のユーザ比率 3:1くらいになったが、開発コミュ ニティを作ることができなかった ● Seasar2, Apache Click 2008年〜 ○ Apache Software Foundationへの移行、ASFコミッタと しての活動を経験
  30. 30. 私のOSS代表作 ● GitBucket 2013年〜 ○ 基本的にすべての活動を英語でやっている ○ 開発面でのフィードバックも多く得られている ○ GitHubの力によるところが大きい
  31. 31. ASFで感じたこと ● メリット ○ ブランディング(?) ○ リーガル面のサポート(ユーザ、開発者双方にとってメリッ トがある) ● デメリット ○ 官僚的なルール、レガシーな開発インフラ ○ 協力者の敷居が高く、開発速度も遅くなってしまう
  32. 32. GitHubによってもたらされたもの ● 使いやすく必要最低限の機能 ○ 既存のOSSホスティングサービスより使いやすかった ○ 個人レベルのOSS開発によくフィットしていた ● 自然とコミュニティの構築が促進される ○ プルリクエストによってコードによる貢献が劇的に簡単に なった(する側もされる側も) ○ 簡単に貢献できることによって開発コミュニティの構築が促 進されている
  33. 33. ソフトウェアとして大事なこと ● 継続性 ○ 自分が必要としているものを作る ○ 自分が使い続ける限り開発が継続される ○ 開発コミュニティを作る ● 拡張性 ○ コアを小さく保つことでメンテナンスコストを下げる ○ 開発者のコミュニティ、さらにはエコシステムの構築を促進 できる
  34. 34. 最も大事なのは英語でやること ● すべてを英語で行う ○ UI、ドキュメント、ブログ、GitHub上でのやりとり等 ● 対象ユーザが一気に広がる ○ Amateasのときは英語のページを作っておいただけで ユーザ数が4倍になった ● ユーザが増えると協力者も増える ○ 協力者が増えないと開発コミュニティができない
  35. 35. ユーザが増えるにつれ起こる問題 ● イシューが質問で埋め尽くされてしまう ○ 質問用のgitterルームを作り誘導する ○ WikiにFAQをまとめる ● 英語で投稿してくれない人が現れる ○ タイトルだけでも英語でリライトしてしまう ○ 日本語用のgitterルームを用意している
  36. 36. GitHubのテンプレート機能を活用 gitリポジトリのルートもしくは.githubディレクトリに 以下のファイルを配置 ファイル名 説明 CONTRIBUTING.md コントリビューションの際の注意事項を記述。イ シュー、プルリクエストの作成画面にリンクが 表示される。 ISSUE_TEMPLATE.md イシュー作成時にテンプレートとして表示され る。 PULL_REQUEST_TEMPLATE.md プルリクエスト作成時にテンプレートとして表示 される。
  37. 37. ユーザに注意を促すことができる CONTRIBUTING.mdへのリンク ISSUE_TEMPLATE.mdの内容が 初期表示される
  38. 38. OSSでワンチャンありますか?
  39. 39. なくはない ● 開発元やユーザ企業などへの転職 ● 書籍や記事などを書いて副収入 ● ビジネスとして成立するケースもある
  40. 40. ただし必ずしも「ユーザの数」が全てではない ● GitBucketは世界中で使われてるっぽい ○ でも海外のScalaコミュニティでは知られていない ○ Scala使ってるような会社はみんなGitHub使ってる ● 特定のコミュニティ内での知名度が重要 ○ プログラマ向けのライブラリやフレームワーク ○ 著名なプロダクトへのコミット
  41. 41. Agenda ● GitBucketの紹介 ● OSSの成長に必要なもの ● 今後の展望
  42. 42. コアを小さくシンプルに保つ ● 特定用途向けの機能はプラグインとして提供 ○ Excelが出てくるやつとか… ● 現在は基本機能として実装されている機能もプラ グインに切り出していきたい ○ Issues、Wiki、認証機能など ● メンテナンスコストの最小化とプラグインコミュニ ティの活性化の両方に繋がる
  43. 43. プラグイン開発の促進 ● より簡単にプラグインを開発/利用可能にする ○ 動作確認を簡単に行うための仕組み ○ ドキュメントの整備 ○ ネットワーク経由でのプラグインインストール ● GitBucketプラグインの開発がScalaに触れる きっかけになると嬉しい
  44. 44. 技術的な課題 ● パフォーマンス、スケーラビリティ ○ 巨大なリポジトリの場合にgitアクセスが重くなる ○ 検索機能(特にGitリポジトリの検索)が遅い (Elasticsearchで横断検索できるようにするプラグインを 作ってくださっている方がいます) ● フロントエンド技術のレガシー化 ○ 現在はVanilla JS + jQuery ○ これはこれでいいのではという気もしている…
  45. 45. 開発者募集中です! ● プラグイン開発でもコミッタでも ● Scalaをやっていきましょう
  46. 46. Try GitBucket!

×