Apache Arrowの開発に参加している須藤です。現時点でapache/arrowのコミット数は1位です。私はRubyでデータ処理できるようになるといいなぁと思ってApache Arrowの開発に参加し始めました。同じような人が増えるといいなぁと思うので、最近の活動を紹介して仲間を増やそうと試みます。
今回はapache/arrowリポジトリーで使っているCIツール「Crossbow」を紹介します。
背景
Apache Arrowはいろんな言語で使える!というのもウリの一つなので、たくさんの言語での実装があります。Apache Arrowのリポジトリー分割で紹介した通り、apache/arrowリポジトリー内に各種言語の実装がありました。こういう構成にしているとなにが困るかというと、CIです。1つのリポジトリーに開発が集中してCIが追いつかないんです。
最近は各実装の別リポジトリーへの分割やGitHub Actionsのキャパシティ増加(Apache Software Foundationがなにかお金を払ってくれているのかもしれないがよくわかっていない)などで溢れ(実行待ちのジョブが溜まってなかなか結果を確認できない)なくなっていますが、2018年頃は溢れていました。
ということで、「Crossbow(クロスボウ)」というApache Arrowの開発用のCIツールが開発されました。名前の由来はArrow(矢)に関連する単語だから、なはず。クロスボウは矢を射る弓の一種。
Crossbowを使うことでapache/arrowのCIキャパシティは増加し、開発が楽になりました。しかし、前述の通り、2018年当時と比べると状況はだいぶ変わってきたので、Crossbowを卒業できるようになってきている感があります。ということでCrossbowをやめない?という提案をしているのですが、それについてはまた別途紹介します。今回はCrossbowを紹介します。
Crossbow
Crossbowはかなり強引にCIのキャパシティを増やすツールで、まぁ、なんというか、あまり行儀はよくありません。どうやってCIのキャパシティを増やしているかというと、各種CIサービスを組み合わせることで増やしています。1つのCIサービスだと溢れちゃうならたくさんCIサービスを使えばいいんじゃない?というアイディアです。具体的には次のCIサービスを統一的なインターフェイスで使えるようになっています。
- Appveyor
- Azure Pipelines
- Circle CI
- GitHub Actions
- Travis CI
1つのリポジトリーで複数のCIサービスを使うこと自体は普通にできるので、apache/arrowで複数のCIサービスを使うというアプローチもありえますが、Crossbowはそうしていません。リポジトリーを別途用意します。別のリポジトリーにすることによりCIのキャパシティが2倍になるというアイディアです。多くのCIサービスはリポジトリーごとに上限を設定しているので、リポジトリーが2つになると上限が2倍になります。
原理的には開発者ごとにCrossbow用のリポジトリーを作ってそこで自分の変更を確認できますが、Apache Arrowの開発では伝統的にursacomputing/crossbowを使うことが多いです。
このCrossbow用リポジトリーに対して、実行したいジョブごとにブランチを切り、そのブランチに実行したい内容を含んだCIの設定をpushします。そして、そのコミットにタグも打ちます。多くのCIサービスはpushを契機にジョブを走らせてくれるので、これでジョブが動きます。ジョブの成果物はタグごとに生成されるGitHub Releasesに添付します。
ジョブごとにブランチを切る?タグを打つ?というところで、おや?と思った人はさすがです。このアプローチだとブランチ・タグがすごい勢いで増えるのです。現時点で、Crossbow用のジョブの種類は(あまり使っていないものも含めて)200種類あります。すべての種類をよく使うわけではありませんが、開発にあたり、1日にたくさんのジョブを実行するので、すごい勢いで増えるのです。
そのため、定期的に古いブランチ・タグを削除していますが、それでも現時点で25000ブランチ・25000タグくらいあります。あまり激しく削除するとGitHubにbanされるので、ゆっくり削除しないといけません。
ということで、あまり行儀がよくないのです。
使い方
Crossbowの仕組みを紹介したついでに、使い方も簡単に紹介します。
PRに@github-actions crossbow submit ジョブ名
というコメントを書くとジョブが登録されるようになっています。GitHub Actionsのon.issue_comment.types.created
などで動き出したジョブが追加されたコメントの内容をチェックして、@github-actions crossbow submit ...
から始まるコメントの場合はジョブを実行する、というようなことをしています。面倒なので詳細は説明しませんが、関連処理のリンクは提供しておきます。
まとめ
Apache ArrowのCI問題を解決するためのツール「Crossbow」を紹介しました。行儀がよくないのですが、たしかに開発は楽になったので助かっています。ただ、最近はCrossbowなしでも大丈夫になってきている感があります。近いうちにCrossbowをやめない?という提案を紹介する記事も書く、、、かもしれません。
それはそうとして、apache/arrowコミット数1位の私にApache Arrow関連のサポートを頼みたいという場合はクリアコードのApache Arrowサービスをどうぞ。