Seleniumの構築
カテゴリ
Seleniumプロジェクトの初期から認識していたことの1つは、人々は複数の言語でコーディングしたいということです。JSを少し愛する人もいれば、Ruby、そしてC#やJavaを好む人もいます。
事を複雑にするために、言語バインディング間で共有したい多くの部分があります。例としては、「atoms」(再利用可能なJavaScriptの断片で、「isDisplayed」や「getAttribute」など、どの言語でテストを書くことを好むかにかかわらず、同じように動作させたい一般的な機能を実行します)、CDPサポートのようなものがあります。これは、呼び出すことができるすべての利用可能な関数を記述する共有ファイルを使用し、新しいSelenium ManagerはRustで記述されていますが、各言語バインディングにバンドルしています。
ソースコードと他の成果物(atomsなど)をまとめて、配布する成果物(Selenium Serverや言語バインディングなど)に変換するプロセスは、「ビルド」と呼ばれます。世の中には多くのビルドツールがあります。Java開発者であれば、MavenやGradleに出会ったことがあるかもしれません。JSハッカーであれば、npmやyarnのようなものを使用したことがあるかもしれません。C開発者(まだたくさんいます!)であれば、makeやCMakeを使用している可能性があります。
多くのビルドツールの問題は、それらが1つの言語に焦点を当てていることです。Npmは素晴らしいですが、Javaプロジェクトにはひどい選択です。Gradleは問題ありませんが、Rubyで作業している場合はそうではありません。
なぜこれが問題なのでしょうか?Seleniumのコードベースでは、複数の異なる言語をサポートしたいと考えており、それらを1つのまとまりのある全体に「つなぎ合わせる」ことができるようにしたいと考えているからです。たとえば、Selenium jarにはかなりの量のJSが含まれています。Ruby gemも同様です。
私たちが望むのは、多くの異なる言語に対応できる単一のビルドツールであり、そのツール1つだけが必要なものにビルドを織り込むことができることです。
そこで Bazel の登場です。これはもともとGoogleによって開発されたビルドツールですが、現在ではオープンソースであり、ますます広く使用されています。Bazel自体ができることは比較的限られていますが、必要なものすべて、さらにはそれ以上のものをサポートできる「ルールセット」を使用して簡単に拡張できます!
Bazelは新世代のビルドツールの1つであり、ビルドプロセスの各部分が他の部分にどのように関連しているかを公開することに焦点を当てています。コンパイルする必要がある各項目(Selenium Manager、atoms、または出荷するjarの1つなど)を、それらが依存する他の部分に線で接続した図を想像してみてください。コンピュータサイエンスでは、その図は「グラフ」と呼ばれ、各線には方向があるため(「これはあれに依存する」)、有向グラフと呼びます。それ自体に依存するものに依存することはできないため、「サイクル」を導入することはできません。Bazelは、これらの「有向非巡回グラフ」で動作するように設計されたビルドツールです。
これらのグラフの良い点の1つは、ビルドのどの部分を並行して実行できるかを把握する既知の方法があることです。最新のコンピュータには、多くの(4、8、16!)コア、十分なメモリ、および高速SSDを備えたCPUが搭載されています。多くのタスクを同時に快適に実行できます。そのため、Bazelはこれを活用して、ビルドの多くの部分を同時に実行します。これにより、以前よりもビルドが大幅に高速になります!
さらに良いことに、Bazelを使用すると、ビルドの各部分が依存するすべてのものをリストアップできます。ソースコードだけでなく、どのバージョンのどのツールを使用しているかもリストアップできます。これにより、プロジェクトに不慣れな開発者が開始するのがはるかに簡単になります。リポジトリ our repo をクローンし、Bazelがインストールされていることを確認するだけで、ビルドプロセスに必要なものすべてが揃っていることを確認できます(ただし、最初のビルドは、必要なものすべてがネットからダウンロードされるため、非常に遅くなる可能性があります)。これは、プロジェクトに不慣れな人だけでなく、既存の開発者にとっても素晴らしいことです。彼らは、慣れていない可能性のあるツールチェーンをインストールして設定する方法を知る必要がなくなり、ビルドを実行するだけです。
Bazelは「ビルドグラフ」を使用して、Seleniumソースコードのどのコードが他のどの部分に依存しているかを把握できます。これは、変更を加えたときにBazelに「すべてのテストを実行する」ように指示できますが、変更によって実際に影響を受けるテストのみを実行する必要があることをBazelが認識するほど賢いことを意味します。この動作を see this in action in this video で確認できますが、言うまでもなく、これにより大幅な時間を節約できます!Bazelに不安定なテストを再実行するように依頼することもできます。
しかし、ビルドに必要なすべてのものを記述することには、もう1つの利点があります。ビルドに必要なものすべてと、すべての部分がどのように適合するかをBazelに記述したので、自分のマシンでビルドを実行するだけである必要はありません。私たちは EngFlow と協力して、彼らのビルドグリッドを利用しています。自分のマシンで少数のものを同時に実行するだけでなく、彼らのビルドグリッドでその何倍もの数を実行できます。そこでのビルドは信じられないほど高速です!
これが、プロジェクトでBazelを使用する理由です。Bazelは、単一のツールで使用したいすべての言語をサポートし、開発マシンのセットアップ方法について考える必要がなく、ビルドを非常に高速に実行でき、ビルドグリッドを利用してさらに高速にビルドできます。