GitBucket 4.18.0をリリースしました

Scalaで実装されたオープンソースのGitサーバ、GitBucket 4.18.0をリリースしました。

https://github.com/takezoe/gitbucket/releases/tag/4.18.0

レビューコメントへの返信フォーム

プルリクエストなど、ソースコードにつけたコメントに対して返信するためのフォームを表示するようにしました。レビューコメントに対してこのフォームから簡単に返信を行うことができます。

f:id:takezoe:20171011025818p:plain

ユーザ名のサジェストにフルネームも表示

ユーザ名のサジェスト時に、ユーザ名だけでなくフルネームも表示するようにしました。

f:id:takezoe:20171011025837p:plain

コミットフックをブラウザ編集時も適用

これまでプラグインが提供するコミットフック(実際にはReceiveHookとして実装されます)はgit pushでのプッシュ時のみ適用され、ブラウザ上でgitリポジトリ内のファイルをオンライン編集した場合には適用されていなかったのですが、GitBucket 4.18.0からはブラウザでの編集時もコミットフックが動作するようになりました。

これによってブランチプロテクションの設定を行っている場合、ブラウザ上での変更からも保護が有効になりました。

gitbucket-ci-pluginのアップデート

gitbucket-ci-pluginが1.1.0にバージョンアップし、以下の機能が追加されました。

  • コミットメッセージに特定のキーワードを含めておくとビルドをスキップ
  • プルリクエストに特定のキーワードを含むコメントを追加するとビルドを再実行

これらのキーワードはビルドの設定画面で指定可能です(カンマ区切りで複数設定可)。

f:id:takezoe:20171011025853p:plain

また、ビルドスクリプトで以下の環境変数が使用できるようになりました。

  • CI (true)
  • HOME (root of the build directory)
  • CI_BUILD_DIR (same as HOME)
  • CI_BUILD_NUMBER
  • CI_BUILD_BRANCH
  • CI_COMMIT_ID
  • CI_COMMIT_MESSAGE
  • CI_REPO_SLUG ("owner/repo")
  • CI_PULL_REQUEST (pull request id or "false")
  • CI_PULL_REQUEST_SLUG ("owner/repo" or "")

今回のバージョンではこの他にも様々な改善やバグフィックスを行っています。詳細についてはIssueの一覧をご覧ください。

第二十回 #渋谷java でElasticsearch + Akka Streamsの話をしました

f:id:takezoe:20171001013203j:plain

shibuya-java.connpass.com

渋谷javaもいつの間にか二十回、今回は久しぶりに蓮沼さんや小宮さんにも発表していただきました。

当日の様子は以下のTogetterまとめをご覧ください。

togetter.com

emegさんが紹介されていたActiveMQ Artemisは、後でお話を聞いたところ実はHornetQ(JBossの次世代JMS実装として開発されていたもの)がASFに寄贈されたものだとのことで、昔HornetQとだいぶ悪戦苦闘していた時期があったのでちょっと微妙な気持ちになりましたw ActiveMQはもともとApolloという次世代版をScalaで開発していたのですが、なかなか開発者が集まらず困っていたところにHornetQの寄贈の話があり、こちらで行くことにしたそうです。いつの間にかそんなことになってたんですねぇ。

さて、自分はといえば、10分枠のLTで先日AlpakkaにマージしていただいたAkka Streams用のElasticsearchコネクタの紹介と簡単なデモをさせていただきました。

takezoe.hatenablog.com

資料はこちらです。バックプレッシャーのデモは何が起きているのかあれで伝わっただろうか?という一抹の不安がありますが…。

www.slideshare.net

今回紹介させていただいたElasticsearch以外にも、Alpakkaにはいろんなストレージ向けのコネクタが用意されているので、バックプレッシャー云々は置いておくとしてもデータの加工や移行などを行うバッチなんかは結構書きやすいんじゃないかと思います。Akka StreamsはJava用のAPIもあるので普段Javaを使ってる方も気軽に試してみて欲しいです。

GitBucket 4.17.0をリリースしました

Scalaで実装されたオープンソースのGitサーバ、GitBucket 4.17.0をリリースしました。

https://github.com/takezoe/gitbucket/releases/tag/4.17.0

gitbucket-ci-pluginが利用可能になりました

GitBucketでシンプルなCI機能を提供するgitbucket-ci-pluginが利用可能になりました。

f:id:takezoe:20170924143458p:plain

f:id:takezoe:20170924143509p:plain

このプラグインリポジトリのオーナーが設定したビルド用のコマンドを以下のタイミングで実行します。

  • デフォルトブランチにpushされたとき
  • プルリクエストにpushされたとき

このプラグインリポジトリのオーナーにGitBucketが動作しているサーバ上で任意のコマンド実行を許可することになりますので、公開環境で運用しているGitBucketでは使用しないでください。

また、このプラグインはあくまでGitBucketでのCIをWebフックやJenkinsなどの複雑な設定を行わなくても「試せる」ようにするためのものであり、本格的なCI/CDのために必要な柔軟性やスケーラビリティは持っていません。そのため、もしこのプラグインを試してGitBucketでのCIを本格的に使いたいと思った場合はJenkinsなどへの移行をおすすめします。

コミットID付きURLへの転送

リポジトリビューアでyキーを押すとコミットID付きのURLに移動するようになりました。ファイルの特定バージョンを示すURLを共有したい場合に便利です。

また、ファイルビューアでファイルの行番号をクリックした際も自動的にコミットID付きのURLになります。

f:id:takezoe:20170924143528p:plain

アップロード可能なファイル種別の制限を廃止

これまでGitBucketは添付可能なファイル種別に制限がありましたが、このバージョンでファイル種別による制限を廃止しました。Issues、Pull requests、各種コメントやWikiなど、ファイルをアップロード可能な箇所であればどのような種別のファイルでもアップロードできるようになりました。

メール送信APIの改善

GitBucketはプラグイン向けにメール送信用のAPIを提供していますが、このAPIがより汎用的になりました。プラグインでは以下のようにして使用できます:

val mailer = new Mailer(context.settings)

mailer.send(
  to           = "...", 
  subject      = "...", 
  textMsg      = "...", 
  htmlMsg      = Some("..."), 
  loginAccount = context.loginAccount
)

MailersendBcc()というメソッドも持っています。このメソッドはメールアドレスをSeq[String]で受け取り、これらのアドレスに対してBCCでメールを送信します。この修正に伴ってGitBucketに標準でバンドルされているgitbucket-notification-pluginは1.0.2にバージョンアップしています。

Web APIとWebフックの改善

  • 特定コミットの情報を取得するget a single commit APIを追加
  • プルリクエスト関連のAPIのレスポンスにasigneeを追加
  • Weフックのペイロードssh_urlを追加

今回のバージョンではこの他にも様々な改善やバグフィックスを行っています。詳細についてはIssueの一覧をご覧ください。

最強のMarkdown編集環境としてのAtom

ブログなどちょっとした文章の編集から書籍の執筆までMarkdownを活用しています。これまで試した各種テキストエディタMarkdown編集支援機能や、Markdown編集専用のツールはどれも満足の行くものではなかったのですが、最近はAtomに以下のようなパッケージを入れた環境が理想に近いMarkdown編集環境を得ることができました。

少し前にエンジニアHubさんで各社のエンジニアの方がオススメのAtomパッケージを紹介するという企画記事があり、私もMarkdown関連のパッケージを紹介させていただいたのですが、この記事では各パッケージを簡単にしか紹介できなかったので、ここでは少し詳しく紹介したいと思います。

employment.en-japan.com

document-outline

atom.io

サイドバーにMarkdownの見出しをツリー状に表示してくれるパッケージです。書籍原稿のような長文を編集していると文章の全体構造を見ながら作業を進めたくなることが多いのですが、Markdownの文章構造を表示してくれるツールというのは意外と見つからず、このパッケージの存在がAtomを最強のMarkdown編集環境足らしめていると言っても過言ではありません(Emacsoutline-tocという拡張を見つけたのですが、リフレッシュ時の画面のチラつきが激しくて実用は厳しかった…)。

以前は長文になるとリフレッシュが重く使い物にならなかったのですが、現在は高速化され数万文字のテキストでも問題なく扱えるようになりました。

markdown-writer

atom.io

Markdownの編集時に便利なちょっとした機能を提供してくれるパッケージです。たとえば箇条書きをしている際に行末で改行すると次の行の行頭に - を入れてくれたり(番号付きリストの場合は 1. の次は 2. のようにちゃんとインクリメントされて入ります)、TABやSHIFT + TABで箇条書きのインデントを調整したりすることができます。

他にもいろんな機能があるのですが、なくてもそんなに不便は感じないかも…。

markdown-scroll-sync

atom.io

Atomは標準機能でMarkdownのプレビューが可能ですが、エディタで表示している領域にあわせてプレビューを自動的にスクロールしてくれるパッケージです。ただ、Markdownの編集に慣れてくるとプレビューはあまり使わなくなるのでそんなに利用頻度は高くないかも…。あと、これは仕方ないことだとは思うのですが、スクロールがちょっとずれてしまうこともあります。

プレビュー機能は表や画像が正しく表示されているかを確認したり、ある程度書き終わった後に読み返す際に使うことが多いのですが、そういう用途の場合は逆にプレビューのスクロールにあわせてエディタをスクロールできるといいな、と思います。

atom-csv-markdown

atom.io

Markdownの編集時に一番手間がかかるのが表の作成ではないかと思います。これは自作のパッケージなのですが、CSV形式のテキストを範囲選択してMarkdownの表に変換できるというものです。

ゼロから表を作成する場合は次に紹介するmarkdown-table-writerを使ってエディタ上で編集するでもよいのですが、スプレッドシートなどに表の元ネタがあったりする場合にはCSVで貼り付けてからこれで一括変換するのが便利です。

markdown-table-editor

atom.io

Markdownの表の編集を支援してくれるパッケージです。文章では説明しずらいのですが、表を編集していると自動的にセル幅を調整してくれたり、タブキーでセルを移動できたり、ENTERキーで新しい行を追加してくれたりなど、あたかもスプレッドシートを編集しているかのような操作性を提供してくれます。キーボードショートカットなどを覚える必要もないのでめちゃくちゃ便利です(パッケージのページに掲載されている動画を見るとどのような動作をするかわかりやすいです)。

ただ、実際Markdownで表を作成していると、同じ列でも行によって入力される文字列の長さが大きく異なる場合などセル幅を統一したくないというケースもあります。このような場合はセル幅を自動調整しないよう設定を変更することもできます。コマンドパレットからも変更できるので編集中にサクッと切り替えできて便利です。

まとめ

なんといってもdocument-outlineの存在が大きいです。このパッケージのおかげで長文のMarkdownの編集が相当快適になりました。もともとMarkdownの記法はさほど複雑なものではないので編集支援系の機能は無ければ無いでなんとかなるのですが、これだけは替えがききません。

特にMarkdownで長文を編集する際は是非Atom + document-outlineパッケージの組み合わせを試してみていただければと思います。

Akka Streams用のElasticsearchコネクタがAlpakkaにマージされました

以前から作っていたAkka Streams用のElasticsearchコネクタですが、Alpakkaにもプルリクエストを出していたのですがレビュー途中でずっと放置されてしまっていました。

takezoe.hatenablog.com

最近になって書き込みのリトライ機能などを追加したのでAlpakkaに出しているプルリクにも反映したところ、コミッタの方が気づいてくれたのか、再レビューしてマージしていただけました。最初にプルリクを出してから約半年、長い戦いだった…。

github.com

前回書いたブログ記事からの差分で大きいのは、Elasticsearchへの書き込み時に、クラスタが完全にダウンして通信不能な場合でも、指定時間内にクラスタが復帰すれば失敗したリクエストから書き込みを再開できるようにしたところです。ただ、書き込みのリトライはもう少し頑張れそうな部分があったり、読み込み時にスクロールスキャンのスライスに対応していなかったりなど、まだまだ改善の余地ありという感じなので、またプルリク出してブラッシュアップしていきたいと思います。

今月末に開催する第二十回 渋谷javaでは、実際にAkka Streamsでこのコネクタを使用して、バックプレッシャーがどのように機能しているのかをデモを交えて発表させていただこうと思っています。他にも、もはや渋谷javaのカルチャーと言っても過言ではないあやぴーさんによるClojureの発表などもありますので、お時間のある方は是非遊びに来ていただければと思いますw

shibuya-java.connpass.com

ソフトウェアデザイン2017年10月号でGit特集(の一部)を執筆しました

Git特集の冒頭で各種Gitサービス/パッケージの比較・紹介記事を執筆させていただきました。

中でもGitHub、GitLab、Bitbucket、GitBucketについて少々詳しく掘り下げさせていただいているのですが、Software Designさんの表紙にGitBucketの文字を載せていただける日が来るとは感無量です。

Git関連のサービスは日頃ウォッチしているので情報をまとめる良い機会になりましたが、これらのサービスは動きもそれなりに早いのでなかなか難しいところです。実際Bitbucketはつい先日Trelloのタスクボードの統合が発表されましたが、本稿には含めることができませんでした。ただ、各サービスの特徴は掴めるかと思いますので、特に業務でGitを導入する際にどのサービスを選択すべきかの参考にしていただければと思います。

なお、GUIのGitクライアントの紹介ではなくテキストエディタからGitを使用する方法が紹介されているのはSoftware Designさんらしいなと思うのですが、vimAtomが紹介されているにも関わらずEmacsが紹介されていないところに時代の流れを感じざるを得ません…。

MailCatcherでメール送信のテストをしてみる

昔メール送信のテストをするときはmocksmtpdというのを使っていたのですが、最近はMailCatcherというのがいいそうなので試してみました。

github.com

gemで簡単にインストールできます。

$ gem install mailcatcher

mailcatcherコマンドで実行するだけ。コンソールにSMTPサーバとWebブラウザ用のURLが表示されるので、アプリケーションからはこのSMTPサーバにメールを送信するように設定します。

$ mailcatcher
Starting MailCatcher
~~> ERROR: Something's using port 1025. Are you already running MailCatcher?
==> smtp://127.0.0.1:1025
==> http://127.0.0.1:1080

Webブラウザ用の画面ではこんな感じで受信したメールを確認できます。

f:id:takezoe:20170916104255p:plain

類似のものとしてNode.jsで動作するMailDevというものもあるみたいです。こちらは実際にメールを配送することもできるようです。

github.com