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