🦊

FirefoxのArtifactビルドの仕組み

2024/01/21に公開

はじめに

最近FloorpというFirefoxベースのブラウザの開発に貢献にハマっているNyanRusです。

この記事ではFirefoxビルド時間を短縮してくれる謎のArtifactビルドについて解説します!

Artifactビルドの謎

私は最近Firefoxのビルドの仕組みについて疑問を持っていました。
Firefoxはビルド時間が長く、一からビルドすると一時間以上かかるのも日常です。
待つのがダルいですね。
その長い長いビルド時間を改善するのがArtifactビルドです。(救世主!)

Artifactビルドとは、Mozilla側でビルドした結果物をダウンロードして、だるいビルドをスキップしよう!のために作られたビルドモードです。

私が最近貢献しているFloorpでもFirefoxベースで、ビルド時間が長く、デプロイに時間がかかりすぎます。
私はそのFloorpにArtifactビルドを適用しようとしました。

ArtifactビルドのDocsを見てみると、ビルドがすごく速くなり良い機能なのですが、C++ソースの変更に対応してなかったり、
ビルドのソースをどれだけ漁ってもどうArtifactが作られるのか乗ってなかったりします。

FloorpではC++などのソースを変えてるらしく、MozillaのArtifactビルドを利用できません。
なのでArtifactビルドを利用するため、謎を解明してみました。

注意

この記事に書くことは推測です。
ご注意ください。

仕組み

実際にmozilla-centralをCloneし、Artifactビルドを実行するとわかりやすいです。

比較するために、普通のビルドについて見てみましょう。
./mach buildを実行したとき、
ビルドの最初にpre-export段階ではビルド情報の取得で.xptファイル(バイナリを再ビルドしないといけないか判別するためのテキスト情報)を作ります。
そしてコンパイル、リンクしてコマンドが終わります。

ここで./mach packageで公開用のパッケージを作れるのですが、
パッケージ前のデバッグ時によく見かけるであろう、ビルド先のobj*より深く入り、
/obj*/dist/binに行きます。
するとそこにはfirefox.exeと、すべてのXHTML、CSS、JSファイルが未圧縮のまま残っています。

そしてArtifactビルドでは、そのfirefox.exeがそのまま降ってきます!
すごいですね。

JSファイルなどは事前コンパイルが必要ないので、リソースとしてこっち処理で、Mozillaからビルド済みのexeがそのまま降ってきます。
ビルドもリンクもすっ飛ばしでです!
なのでC++のソースをいじるとArtifactビルドが利用できないのですね。

苦労したぞい()

私はこれを探すのにsearchfox.orgを漁りまわったのですが、何一つ分からなくて、.xptファイルが重要な役割をするということしかわかりませんでした。
実際はArtifactビルドを実行できるか確認用のテキスト情報なんですね。

Firefoxビルド用の使われるCIプラットフォームのTaskclusterでも普通にビルドするという情報しか得られませんでした。
実際にArtifactビルドを実行してみるのが一番だったわけです。

感想

実際知った後には仕組みが単純すぎて驚きました。
これがDocsに書かれないわけです(…)

私が貢献しているブラウザのFloorpにどう適用してビルドを高速化するか悩みどころです()

そしてパッケージ前には未圧縮のリソースが使われるので、そのリソースを編集し、Firefoxを再起動すれば適用されます。
デバッグの高速化に応用できそうです。
夢が広がります!

終わりに

知った後には単純すぎたArtifactビルドでした。
面白かったです!

P.S pulse-browser/experimentalでは当然のようにArtifactビルドが使われていてすごかったです。
知った後に見えるようになるってこんな感じなんですね。

Discussion