【ITニュース解説】My First Tauri CI/CD Pipeline: Lessons from Building VaultNote with SvelteKit
2025年09月24日に「Dev.to」が公開したITニュース「My First Tauri CI/CD Pipeline: Lessons from Building VaultNote with SvelteKit」について初心者にもわかりやすく解説しています。
ITニュース概要
TauriとSvelteKitでアプリ開発者が、Windows, Mac, Linux, Android向けに自動リリース環境(CI/CD)構築に挑戦。GitHub Actionsで60回以上の失敗を乗り越え、苦労しつつもシステムを完成させた。その過程で得た具体的な教訓を共有する。
ITニュース解説
VaultNoteは、Web技術を用いてデスクトップとモバイルのクロスプラットフォームアプリケーションを開発する学習プロジェクトとして始まった。TauriとSvelteKitという主要な技術を組み合わせ、一つのコードベースからWindows、macOS、Linux、Androidといった多様なプラットフォームで動作するメモアプリの構築を目指した。このプロジェクトでは、アプリ自体の開発だけでなく、アプリケーションを自動でビルド、テスト、リリースするCI/CDパイプラインの構築が重要な目標だった。
アプリの基盤技術として、デスクトップ・モバイルアプリのフレームワークにはTauriを選んだ。Tauriは、Webアプリケーションを軽量かつセキュアなネイティブアプリケーションに変換でき、Electronなどの既存技術と比較して、生成されるアプリのサイズが非常に小さい特徴がある。例えば、WindowsやmacOS向けは約5MB、Linux向けは約80MB、Android向けは約43MBといった具体的なサイズだ。フロントエンドには、高速でリアクティブなSvelteKitを採用し、ビルドツールにはVite、パッケージマネージャーにはBunを利用して効率的な開発環境を構築した。データストレージには、IndexedDBを容易に扱えるDexie.jsを採用し、クロスプラットフォームでのデータ永続化を実現している。
TauriとSvelteKitを使った開発の初期段階は比較的スムーズに進んだが、最大の挑戦はCI/CDパイプラインの構築だった。このパイプラインの目標は、メインブランチにコードをプッシュするだけで、自動的にバージョンが更新され、デスクトップ(Windows、macOSのIntel版とARM版、Linux)とAndroid(APKとAAB形式)の合計6プラットフォーム向けにアプリがビルドされ、Androidアプリにはデジタル署名が施され、最終的な成果物がGitHub Releasesに自動的にアップロードされることだ。この目標達成には数ヶ月を要し、60回以上のビルド失敗を経験し、特にAndroid関連で6つの大きな問題を解決する必要があった。パイプラインはGitHub Actionsを基盤とし、バージョン管理にはrelease-please、Tauriアプリのビルドにはtauri-action、そしてバージョン同期のためのカスタムスクリプトを組み合わせて構築された。
最初の大きな課題は、プロジェクト内の複数の設定ファイル(package.json、Cargo.toml、tauri.conf.json)間でのバージョン情報の不一致を防ぐことだった。この問題を解決するため、package.jsonを唯一のバージョン情報源とし、そこからCargo.tomlとtauri.conf.jsonのバージョンを自動で同期するNode.jsスクリプトを作成した。このスクリプトは、コードをコミットする前とCI/CDパイプラインの開始時に必ず実行されるように設定され、バージョンの一貫性を保つ役割を果たした。GitHub Actionsのワークフローはrelease-pleaseから始まり、コミット履歴に基づいてバージョンを更新し、新しいバージョンタグを生成する。
デスクトップ版アプリのビルドは、Android版に比べると比較的容易に進んだ。GitHub Actionsのmatrix strategyという機能を利用し、Windows、macOS(IntelおよびARMプロセッサ向け)、Ubuntu Linuxの各環境でビルドを並行して実行した。このビルドプロセスでは、まず各OSで必要な依存関係(例えばLinuxではWebKitライブラリ)をインストールし、BunとRustの開発環境をセットアップした。ビルド時間を短縮するため、Rustの依存関係はキャッシュするように設定した。次に、Bunを使ってWebアセット(ウェブサイトの構成要素)をビルドし、その後tauri-actionを使ってデスクトップアプリケーションとしてパッケージングし、GitHub Releasesにアップロードした。macOS向けには特定のターゲット指定が必要だったり、Linuxでlibwebkit2gtk-4.1-devライブラリのインストールが必要だったりといった小さな課題はあったものの、ビルドの成功率は高く、1回あたり4〜8分で完了した。生成された成果物は、Windows向けには約5MBの.msiや.exe、macOS向けには約5.5MBの.dmg、Linux向けには約79MBのAppImage、deb、rpm形式だった。一つのプラットフォームでのビルドが失敗しても他のプラットフォームのビルドは継続するようfail-fast: falseを設定したことも、全体の安定性向上に貢献した。
最も困難だったのはAndroid版アプリのビルドだ。Ubuntu環境でJava 17、Android SDK/NDK、RustのAndroid向けターゲットをセットアップし、cargo tauri android buildコマンドを実行するプロセスは、様々な問題に直面した。
具体的には、SDKパスの混乱が頻繁に発生し、Androidアプリの署名に必要なapksignerというツールが見つからないエラーに遭遇した。これは、Android SDKのbuild-tools 34.0.0を明示的にインストールし、そのパスを環境変数に追加することで解決した。また、RustがTauriのバージョン文字列「2」を正しく解析できず、tauri = "2.8.5"のように具体的なバージョンをピンポイントで指定する必要があることが判明した。これはTauriのドキュメントとコミュニティでの調査により解決された。Androidアプリのデジタル署名プロセスも複雑だった。GitHubの秘密情報として安全に保存されたキーストア情報をBase64デコードし、keystore.propertiesファイルを生成する必要があった。TauriがAPKに自動署名する機能を持っていたため、手動でのapksigner使用は不要だった。さらに、ビルド後に生成される署名済みAPKファイルのパス特定や、汎用的なファイル名(app-universal-release.apk)をアプリ名とバージョンを含む形式にリネームする作業も必要だった。これらの問題の解決には、AIからの一般的な回答だけでは不十分で、Tauriコミュニティでの情報収集や、60回を超える試行錯誤が不可欠だった。Android版ビルドは10〜15分かかり、約43MBのAPKと20MBのAABが生成される。
現在、このCI/CDパイプラインはバージョン0.21.5として安定稼働している。メインブランチにコードをプッシュすると、まずrelease-pleaseがバージョンを同期し、タグとプルリクエストを生成する。新しいリリースが作成されれば、デスクトップ版とAndroid版のビルドが並行して実行される。最終的に、ブランド名とバージョンが付けられ、署名された成果物がGitHub Releasesに自動的にアップロードされる。成功率は95%以上で、プロセス全体は15〜25分で完了する。アプリはDexie.jsでメモをローカル保存し、Carta-MDでMarkdown表示するシンプルなものだが、自動化されたビルドとリリースパイプラインの構築は大きな成果だ。パイプラインの完全なコードやガイドは、リポジトリ内のprogress/ci-cd-documentationフォルダに詳細に記録されている。
このプロジェクトを通じて、多くの重要な教訓を得た。クロスプラットフォーム開発では、デスクトップから着手し、Androidのようにツールチェーンが複雑なモバイルプラットフォームは後回しにする「スモールスタート」が賢明だ。複数の設定ファイルでのバージョン管理を避け、package.jsonのような単一の場所を真の情報源とし、スクリプトで自動同期する仕組みが不可欠だ。問題に直面した際は、TauriのDiscordコミュニティや公式ドキュメントのような具体的な情報源を深く調査することの重要性を痛感した。デバッグ時には、設定内容やコマンド出力を詳細にログに残す「ログの徹底」が問題解決の鍵となる。 Androidビルドで直面した多くの問題は、一つずつ細分化して取り組むことで着実に解決できた。TauriのテンプレートやGitHub Actionsコミュニティが提供する既存の知識やツールに助けられたように、困った時にコミュニティを活用する価値も大きかった。
今後の課題として、iOS向けのサポートは現在、MacやApple開発者アカウントがないため未実装だ。デスクトップアプリの署名も今後の検討事項である。ビルド時間をさらに短縮するためのキャッシュ最適化も可能だ。VaultNoteはTauriとSvelteKitの可能性を追求する学習プロジェクトであり、この構築したパイプラインは開発者としての成果である。プロジェクトのコードは公開されており、興味のある人は自由に試したり、改善提案をしたりできる。iOS対応、ビルド速度改善、署名プロセスの最適化など、様々なアイデアを歓迎しており、他の開発者からのフィードバックを通じて、さらに良いものを作っていきたい。