Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ビルドツールBazelを触ってみた/2022-09-28-llt27

Satoshi SAKAO
September 28, 2022

 ビルドツールBazelを触ってみた/2022-09-28-llt27

社内のLTイベント「えるLT Vol.27 オンライン」で発表した資料です

Satoshi SAKAO

September 28, 2022
Tweet

More Decks by Satoshi SAKAO

Other Decks in Programming

Transcript

  1. 話すひと 2 🏢 インフォコム株式会社 サービスマネジメント室 👨🔧 ソフトウェアエンジニア 🛠 Node.js /

    AWS / IoT / iOS (Swift) / Linux 💖 猫,テクテクライフ(ランク: 24) Satoshi SAKAO @ottijp
  2. 3

  3. WORKSPACE 9 $ cat WORKSPACE load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") http_archive( name =

    "build_bazel_rules_swift", sha256 = "51efdaf85e04e51174de76ef563f255451d5a5cd24c61ad902feeadafc7046d9", url = "https://github.com/bazelbuild/rules_swift/releases/download/1.2.0/rules_swift.1.2.0.tar.gz", ) load( "@build_bazel_rules_swift//swift:repositories.bzl", "swift_rules_dependencies", ) swift_rules_dependencies() load( "@build_bazel_rules_swift//swift:extras.bzl", "swift_rules_extra_dependencies", ) swift_rules_extra_dependencies() • 外部拡張機能の取得とロード • StarlarkというDSLで記述
  4. BUILD 10 $ cat BUILD load("@build_bazel_rules_swift//swift:swift.bzl", "swift_binary") swift_binary( name =

    "hello-world", srcs = ["main.swift"], ) • ビルドやテストに必要な拡張機能をロード • ターゲットのルールを定義 • 同じくStarlarkで記述
  5. ビルドと実行 12 $ bazel build //:hello-world Starting local Bazel server

    and connecting to it... INFO: Analyzed target //:hello-world (45 packages loaded, 540 targets configured). INFO: Found 1 target... Target //:hello-world up-to-date: bazel-bin/hello-world INFO: Elapsed time: 24.631s, Critical Path: 0.07s INFO: 1 process: 1 internal. INFO: Build completed successfully, 1 total action $ bazel run //:hello-world INFO: Analyzed target //:hello-world (0 packages loaded, 0 targets configured). INFO: Found 1 target... Target //:hello-world up-to-date: bazel-bin/hello-world INFO: Elapsed time: 0.386s, Critical Path: 0.00s INFO: 1 process: 1 internal. INFO: Build completed successfully, 1 total action INFO: Build completed successfully, 1 total action hello world
  6. 依存関係の出力(query サブコマンド) 13 $ tree . ├── WORKSPACE ├── fizzbuzz-lib

    │ ├── BUILD │ └── fizzbuzz.swift └── main ├── BUILD └── main.swift $ xdot <(bazel query "deps(//...)" --notool_deps --noimplicit_deps --output graph )
  7. 所感 • 複雑なコンパイラ引数を意識しないでよいのはよい感覚だった • リポジトリが大きくても,パフォーマンスがよさそうな動きだった • 自分が作るプロダクトでお世話になることはなさそうだが,MediaPipeのよう なものもあるので,Bazelが提供することと,ワークスペースやビルドといった コンセプトだけでも抑えておくとよさそう •

    どういった場合に選択すべきか • 大きなプロジェクトのビルドパフォーマンス問題の解決 • マルチプラットフォームをターゲットとしたプロダクト • 特にiOSの場合は,複雑性の増加とのトレードオフをよく考える必要がありそう 14
  8. 特徴の詳細 • 高級ビルド言語 • 抽象化されヒューマンリーダブルな言語で,セマンティックにビルド定義が可能 • コンパイラやリンカの複雑な呼び出しを隠蔽してくれる • 高速・高信頼性 •

    キャシュと変更のトラッキングにより,必要な部分だけを差分ビルドする • 並行ビルド,インクリメンタルビルドにも対応 • マルチプラットフォーム • Linux, macOS, Windowsで動作 • マルチプラットフォーム向けバイナリ・パッケージを出力可能 • スケーラブル • 複数リポジトリにまたがる巨大なコードベースや多人数開発をハンドルできる • リモート実行での分散処理 • https://bazel.build/remote/rbe • https://bazel.build/run/client-server • 拡張性 • サポートする言語: https://bazel.build/rules • 言語やフレームワークのサポートを,独自に拡張を作ることも可能 18
  9. bazelワークスペース・リポジトリの構成 19 $ tree . ├── WORKSPACE ├── fizzbuzz-lib │

    ├── BUILD │ └── fizzbuzz.swift └── main ├── BUILD └── main.swift ワークスペース メインリポジトリ “@“ $ tree . ├── WORKSPACE └── tools └── build_defs └── repo ├── BUILD └── http.bzl ビルドインリポジトリ “@bazel_tools“ $ tree . ├── WORKSPACE └── swift ├── BUILD ├── repositories.bzl └── swift.bzl サードパーティリポジトリ “@build_bazel_rules_swift“ load load 表記法: @リポジトリ//パッケージパス:ターゲット(or .bzl) @// fi zzbuzz-lib: fi zzbuzz-lib @build_bazel_rules_swift//swift:swift.bzl
  10. Xcodeプロジェクトのビルド • シミュレータで走らせるためには,結局Xcodeプロジェクトを導出してXcodeを使う必要がある • TulsiでXcodeプロジェクト作ってビルドする • bazelを使うメリットが不明 • 実機で動かす場合はプロビを設定してビルドすればbazelだけで可能 •

    大規模プロダクトでビルドパフォーマンスの改善を図っても,色々とツラミが多い模様 • LINE iOS版のビルドパフォーマンスをBazelで改善 
 https://engineering.linecorp.com/ja/blog/line-ios-build-performance-improved-with-bazel/ • LINE iOSのビルド環境の変遷 / Changes in LINE iOS Build Environment - Speaker Deck 
 https://speakerdeck.com/player/0802f8a3c7464dba86720ae1e85722f1 • ローカルでのビルドだけなら,M1でXcode使うほうがスマートな解法になりそう 20
  11. refs • Starlark の言語 | Bazel 
 https://bazel.build/rules/language • GitHub

    - bazelbuild/rules_swift: Bazel rules to build Swift on Apple and Linux platforms 
 https://github.com/bazelbuild/rules_swift • Bazelを使ってみる その1(Goのビルド) - Carpe Diem 
 https://christina04.hatenablog.com/entry/using-bazel-to-build-go • Bazelお試し | meda-log 
 https://blog.medalotte.net/archives/1083 • Googleが開発する最新ビルドツール「Bazel」を使ってみよう | さくらのナレッジ 
 https://knowledge.sakura.ad.jp/6174/ 21