GitBucketはプラグインシステムを備えており、プラグインで様々な機能を拡張することができます。このエントリではプラグイン開発の最初の一歩について説明します。内容的には以前GitBucket Newsで書いた以下の英語のエントリと同じものです。
プロジェクトの作成
まず初めに以下の内容のbuild.sbt
でScalaプロジェクトを作成します(gitbucketの依存関係は最新のバージョンにあわせて変更してください)。
name := "gitbucket-helloworld-plugin" organization := "io.github.gitbucket" version := "1.0.0" scalaVersion := "2.11.8" libraryDependencies ++= Seq( "io.github.gitbucket" %% "gitbucket" % "4.3.0" % "provided", "javax.servlet" % "javax.servlet-api" % "3.1.0" % "provided" )
プラグインの定義
/src/main/scala
に以下のような内容でPlugin
クラスを作成します。このクラスではプラグインのメタデータと、どのように拡張するかを定義します。ここではcontrollers
という拡張ポイントを使用して/helloworld
というパスに新たなコントローラを追加しています。
import io.github.gitbucket.solidbase.model.Version import io.github.gitbucket.helloworld.controller.HelloWorldController class Plugin extends gitbucket.core.plugin.Plugin { override val pluginId: String = "helloworld" override val pluginName: String = "HelloWorld Plugin" override val description: String = "First example of GitBucket plug-in" override val versions: List[Version] = List(new Version("1.0.0")) override val controllers = Seq( "/helloworld" -> new HelloWorldController() ) }
コントローラの実装
Plugin
クラスで定義したHelloWorldController
を実装します。コントローラはgitbucket.core.controller.ControllerBase
を継承し、/src/main/io/github/gitbucket/helloworld/controller
ディレクトリに作成します。これは一般的なScalatraのコントローラです。
package io.github.gitbucket.helloworld.controller import gitbucket.core.controller.ControllerBase class HelloWorldController extends ControllerBase { get("/helloworld"){ "Hello World!" } }
このサンプルではHelloWorldController
は文字列をレスポンスとして返却します。もちろんTwirlテンプレートを使用してHTMLを返却したり、JSONを返却したりすることもできます。
プラグインのインストールと実行
sbt package
を実行すると/target/scala-2.11/gitbucket-helloworld-plugin_2.11-1.0.0.jar
が生成されるのでこのjarファイルを~/.gitbucket/plugins
ディレクトリ(ディレクトリが存在しない場合は手で作成してください)にコピーします。
GitBucketを起動し、http://localhost:8080/helloworldにブラウザでアクセスするとHello World!
と表示されるはずです。
次のステップ
このエントリで説明したプロジェクトは以下にありますので、これを雛形にGitBucketプラグインの開発を始めることができます。
また、gitbucket community pluginsには実用的なgitBucketプラグインのリストがあります。GitBucketプラグインの開発方法の詳細を知りたい場合はこれらのプラグインのソースコードを参照してみてください。