gitbucketを支えるjava技術とグローバルで使われるossの作り方

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

Upload: takezoe

Post on 16-Apr-2017

9.432 views

Category:

Software


0 download

TRANSCRIPT

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

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

Naoki Takezoe@takezoen

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

自己紹介

● 竹添 直樹 @takezoen● 株式会社ビズリーチ勤務

● Java→Scala● GitBucketやScalatraなどのOSSを開発してい

ます

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

Agenda

● GitBucketの紹介

● OSSの成長に必要なもの

● 今後の展望

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

Agenda

● GitBucketの紹介

● OSSの成長に必要なもの

● 今後の展望

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

GitBucketとは?

● Scalaで実装されたOSSのGitサーバ

○ イントラネット内のサーバ等にインストールできます

● インストールはめっちゃ簡単○ Javaさえ動作すればどこでも動作します

$ java -jar gitbucket.war

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

リポジトリビューア

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

イシュー

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

プルリクエスト

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

GitBucketの機能

● Public / PrivateなGitリポジトリ (httpとsshでアクセス可能)● アクティビティのタイムライン表示を含むダッシュボード

● オンラインでのファイル編集も可能なリポジトリビューア

● Markdown書式が利用可能なWiki● イシュー、プルリクエスト

● ソースコードへのコメント

● リポジトリのフォーク

● Eメールによる通知

● ユーザ、グループによる権限管理、LDAP連携

● Gravator連携

● GitHub互換のWeb API● プラグインによる拡張

● H2 / MySQL / PostgreSQL Herokuでデモサイトが動いています:http://gitbucket.herokuapp.com/

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

GitBucketの開発について

● コミッタはいまのところ日本人中心

● 必ず月1回リリース

● 使用しているフレームワーク(Scalatra)の開発に

も積極的に関与している

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

これまでの歩み

● 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へ)

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

技術的な話

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

技術スタック

Git Repository RDBMS(H2 / MySQL / PostgreSQL)

JGit Slick

Apache MINA SSHD

Jetty

GitServlet (JGit) Scalatra / Twirl

Git Client Web Browser

SSH HTTP

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

Scalaの特徴

● オブジェクト指向言語 + 関数型言語の機能○ Javaよりも強力な型安全性

○ スクリプト言語のような柔軟性

● Javaとの相互運用性○ 既存の膨大なJavaの資産を利用可能

○ 最新のScala 2.12ではJava8のサポートも強化

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

Scalaの特徴を活かしたフレームワーク

● Scalatra(Webフレームワーク)

● Slick(DBアクセスライブラリ)

● Twirl(テンプレートエンジン)

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

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

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

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>

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

Scalaが少人数での開発を支えている

● 大規模なコードでも型によるチェックで修正漏れを

防ぐことができる

● Javaでは複雑な生SQLやHTMLテンプレートな

どにおいて型安全性を活かせない

● Scalaはコンパイルが遅いがGitBucketにおいて

はそれ以上に圧倒的なメリットがある

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

GitBucketを支えるJava技術

● Jetty● JGit● Apache MINA● H2 database

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

GitBucketを支えるJava技術

Git Repository RDBMS(H2 / MySQL / PostgreSQL)

JGit Slick

Apache MINA SSHD

Jetty

GitServlet (JGit) Scalatra / Twirl

Git Client Web Browser

SSH HTTP

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

独自開発のJavaライブラリ

汎用的なものは敢えてJavaで作っている

● markedj○ marked.jsというGitHub Flavored Markdown互換の

MarkdownパーサをJavaに移植したもの

○ 現在はcommonmarkへの移行を検討中

● solidbase○ Liquibaseをベースにマルチテナント、マルチデータソース

に対応したマイグレーションツール

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

既存のJava資産を支えるのは大きい

● 低レイヤのミドルウェアやライブラリのネイティブ

実装が充実している

● Javaさえ動けばどこでも簡単に動作するアプリ

ケーションを開発することができる

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

プラグインシステム

● Scalaで記述できる

○ コンパイルしたjarを特定のディレクトリに配置して

GitBucketを起動すると読み込まれる

● 様々な拡張ポイントを利用可能

○ GitBucketが使用しているフレームワークの機能、コアが

提供する全てのAPIを利用可能

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

こんなプラグインがあります

プラグイン 説明

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のレンダリングをできるようにするプラグイン

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

GitBucketプラグインを作ってみよう

http://takezoe.hatenablog.com/entry/2016/08/06/202109

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

Agenda

● GitBucketの紹介

● OSSの成長に必要なもの

● 今後の展望

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

OSSの成長に必要なもの

● ユーザ

● 開発者

● コミュニティ

● エコシステム

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

GitBucketはどのくらい?

● 6000 stars● 100 contributors● 1300 issues / pull requests● 380 gitter users

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

私のOSS代表作

● FreeStyle Wiki 2003年〜○ 日本人ユーザがターゲットだった

○ プラグインを作ってくださる方も多かった

● Project Amateras 2004年〜○ 英語のWebサイト、ユーザインターフェースを提供

○ 海外:日本のユーザ比率 3:1くらいになったが、開発コミュ

ニティを作ることができなかった

● Seasar2, Apache Click 2008年〜

○ Apache Software Foundationへの移行、ASFコミッタと

しての活動を経験

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

私のOSS代表作

● GitBucket 2013年〜○ 基本的にすべての活動を英語でやっている

○ 開発面でのフィードバックも多く得られている

○ GitHubの力によるところが大きい

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

ASFで感じたこと

● メリット○ ブランディング(?)

○ リーガル面のサポート(ユーザ、開発者双方にとってメリッ

トがある)

● デメリット○ 官僚的なルール、レガシーな開発インフラ

○ 協力者の敷居が高く、開発速度も遅くなってしまう

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

GitHubによってもたらされたもの

● 使いやすく必要最低限の機能○ 既存のOSSホスティングサービスより使いやすかった

○ 個人レベルのOSS開発によくフィットしていた

● 自然とコミュニティの構築が促進される

○ プルリクエストによってコードによる貢献が劇的に簡単に

なった(する側もされる側も)

○ 簡単に貢献できることによって開発コミュニティの構築が促

進されている

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

ソフトウェアとして大事なこと

● 継続性○ 自分が必要としているものを作る

○ 自分が使い続ける限り開発が継続される

○ 開発コミュニティを作る

● 拡張性○ コアを小さく保つことでメンテナンスコストを下げる

○ 開発者のコミュニティ、さらにはエコシステムの構築を促進

できる

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

最も大事なのは英語でやること

● すべてを英語で行う

○ UI、ドキュメント、ブログ、GitHub上でのやりとり等

● 対象ユーザが一気に広がる

○ Amateasのときは英語のページを作っておいただけで

ユーザ数が4倍になった

● ユーザが増えると協力者も増える○ 協力者が増えないと開発コミュニティができない

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

ユーザが増えるにつれ起こる問題

● イシューが質問で埋め尽くされてしまう

○ 質問用のgitterルームを作り誘導する

○ WikiにFAQをまとめる

● 英語で投稿してくれない人が現れる○ タイトルだけでも英語でリライトしてしまう

○ 日本語用のgitterルームを用意している

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

GitHubのテンプレート機能を活用

gitリポジトリのルートもしくは.githubディレクトリに

以下のファイルを配置

ファイル名 説明

CONTRIBUTING.md コントリビューションの際の注意事項を記述。イシュー、プルリクエストの作成画面にリンクが表示される。

ISSUE_TEMPLATE.md イシュー作成時にテンプレートとして表示される。

PULL_REQUEST_TEMPLATE.md プルリクエスト作成時にテンプレートとして表示される。

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

ユーザに注意を促すことができる

CONTRIBUTING.mdへのリンク

ISSUE_TEMPLATE.mdの内容が初期表示される

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

OSSでワンチャンありますか?

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

なくはない

● 開発元やユーザ企業などへの転職

● 書籍や記事などを書いて副収入

● ビジネスとして成立するケースもある

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

ただし必ずしも「ユーザの数」が全てではない

● GitBucketは世界中で使われてるっぽい○ でも海外のScalaコミュニティでは知られていない

○ Scala使ってるような会社はみんなGitHub使ってる

● 特定のコミュニティ内での知名度が重要○ プログラマ向けのライブラリやフレームワーク

○ 著名なプロダクトへのコミット

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

Agenda

● GitBucketの紹介

● OSSの成長に必要なもの

● 今後の展望

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

コアを小さくシンプルに保つ

● 特定用途向けの機能はプラグインとして提供

○ Excelが出てくるやつとか…

● 現在は基本機能として実装されている機能もプラ

グインに切り出していきたい

○ Issues、Wiki、認証機能など

● メンテナンスコストの最小化とプラグインコミュニ

ティの活性化の両方に繋がる

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

プラグイン開発の促進

● より簡単にプラグインを開発/利用可能にする○ 動作確認を簡単に行うための仕組み

○ ドキュメントの整備

○ ネットワーク経由でのプラグインインストール

● GitBucketプラグインの開発がScalaに触れる

きっかけになると嬉しい

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

技術的な課題

● パフォーマンス、スケーラビリティ○ 巨大なリポジトリの場合にgitアクセスが重くなる

○ 検索機能(特にGitリポジトリの検索)が遅い

(Elasticsearchで横断検索できるようにするプラグインを

作ってくださっている方がいます)

● フロントエンド技術のレガシー化○ 現在はVanilla JS + jQuery○ これはこれでいいのではという気もしている…

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

開発者募集中です!

● プラグイン開発でもコミッタでも

● Scalaをやっていきましょう

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

Try GitBucket!