# リリース Tuistでは、意味のある変更がメインブランチにマージされると自動的に新しいバージョンを公開する継続的リリースシステムを採用しています。このアプローチにより、メンテナが手動で介入することなく、改良が迅速にユーザーに届くことが保証される。 ## 概要 私たちは3つの主要コンポーネントを継続的にリリースしている: - **Tuist CLI** - コマンドラインツール - **Tuist Server** - バックエンド・サービス - **Tuist App** - macOSおよびiOSアプリ(iOSアプリはTestFlightにのみ継続的にデプロイされる。 各コンポーネントには独自のリリースパイプラインがあり、メインブランチにプッシュするたびに自動的に実行される。 ## 仕組み ### 1.規約の遵守 コミットメッセージの構造化には[Conventional Commits](https://www.conventionalcommits.org/)を使用しています。これにより、私たちのツールは変更の性質を理解し、バージョンバンプを決定し、適切な変更ログを生成することができます。 フォーマット:`タイプ(スコープ): 説明` #### コミットの種類とその影響 | タイプ | 説明 | バージョン・インパクト | 例 | | ------- | ------------ | -------------------- | ------------------------------- | | `見事` | 新機能または能力 | マイナーバージョンアップ (x.Y.z) | `feat(cli):Swift6のサポートを追加。` | | `フィックス` | バグ修正 | パッチのバージョンバンプ (x.y.Z) | `fix(app):プロジェクトを開く際のクラッシュを解決` | | `諸注意` | ドキュメントの変更 | リリースなし | `ドキュメント:アップデート・インストール・ガイド` | | `スタイル` | コードスタイルの変更 | リリースなし | `スタイル:swiftformatでコードをフォーマットする` | | `手戻り` | コードのリファクタリング | リリースなし | `refactor(server):認証ロジックの簡素化` | | `完璧` | パフォーマンス向上 | パッチのバージョンアップ | `perf(cli): 依存関係の解決を最適化する` | | `テスト` | テストの追加/変更 | リリースなし | `test: キャッシュのユニットテストを追加` | | `雑用` | メンテナンス・タスク | リリースなし | `chore: 依存関係の更新` | | `ci` | CI/CDの変更 | リリースなし | `ci: リリースのワークフローを追加` | #### 変化への対応 破格の変更はメジャーバージョンアップ(X.0.0)の引き金となるため、コミット本文に明記する必要があります: ``` feat(cli): change default cache location BREAKING CHANGE: The cache is now stored in ~/.tuist/cache instead of .tuist-cache. Users will need to clear their old cache directory. ``` ### 2.変更検出 各コンポーネントは[git cliff](https://git-cliff.org/)を使っている: - 前回のリリース以降のコミットを分析する - スコープ(cli、app、server)によるコミットのフィルタリング - リリース可能な変更があるかどうかを判断する - 変更履歴の自動生成 ### 3.パイプラインの解放 リリース可能な変更が検出された場合: 1. **バージョン計算** :パイプラインが次のバージョン番号を決定する 2. **変更履歴の生成**: git cliff がコミットメッセージから変更履歴を生成する 3. **ビルド・プロセス** :コンポーネントがビルドされ、テストされる 4. **リリース作成** :GitHubリリースが成果物とともに作成される 5. **ディストリビューション** :アップデートはパッケージマネージャにプッシュされる (例: Homebrew for CLI) ### 4.スコープフィルタリング 各コンポーネントは、関連する変更があった場合にのみリリースする: - **CLI**:`(cli)` スコープ付きコミット、またはスコープなしコミット - **アプリ** :`(app)` スコープでのコミット - **サーバー** :`(サーバー)` スコープのコミット ## 良いコミットメッセージを書く コミットメッセージはリリースノートに直接影響を与えるので、明確で説明的なメッセージを書くことが重要です: ### やるんだ: - 現在形を使う:"add feature "ではなく、"add feature" - 簡潔でありながら、説明的であること - 変更がコンポーネント固有のものである場合は、スコープを含める。 - 該当する場合、問題を参照:`fix(cli): ビルドキャッシュの問題を解決 (#1234)` ### やめてくれ: - "バグを修正 "や "コードを更新 "といった曖昧なメッセージを使う。 - 1つのコミットで複数の無関係な変更を混在させる - 変更情報の入れ忘れ ### 変化への対応 変更を加える場合は、コミット本文に`BREAKING CHANGE:` を含めてください: ``` feat(cli): change cache directory structure BREAKING CHANGE: Cache files are now stored in a new directory structure. Users need to clear their cache after updating. ``` ## リリース・ワークフロー リリースのワークフローは - `.github/workflows/cli-release.yml` - CLI リリース - `.github/workflows/app-release.yml` - アプリのリリース - `.github/workflows/server-release.yml` - サーバーリリース それぞれのワークフロー - メインへのプッシュで走る - 手動でトリガー可能 - 変更の検出にはgit cliffを使用 - リリースプロセス全体を処理 ## モニタリング・リリース リリースの監視は - [GitHubリリースページ](https://github.com/tuist/tuist/releases)。 - ワークフロー実行用のGitHub Actionsタブ - 各コンポーネントのディレクトリにある変更履歴ファイル ## メリット この継続的なリリースのアプローチは、以下を提供する: - **迅速な納品** :マージ後すぐに変更がユーザーに届く - **ボトルネックの削減** :マニュアルリリースを待つ必要がない - **明確なコミュニケーション** :コミットメッセージからの変更履歴の自動化 - **一貫したプロセス** :すべてのコンポーネントで同じリリースフロー - **品質保証** :テストされた変更のみがリリースされる ## トラブルシューティング リリースに失敗した場合 1. 失敗したワークフローの GitHub Actions ログを確認する 2. コミットメッセージは従来の書式に従うようにしてください。 3. すべてのテストが合格することを確認する 4. コンポーネントが正常にビルドされたことを確認する 即時リリースが必要な緊急の修正 1. コミットの範囲を明確にする 2. マージ後、リリースのワークフローを監視する。 3. 必要であれば、マニュアルリリースを作動させる ## App Storeリリース CLIとサーバーは上記の継続的リリース・プロセスに従いますが、**iOSアプリ** はAppleのApp Store審査プロセスのため例外となります: - **手動リリース**: iOSアプリのリリースには、App Storeへの手動申請が必要です。 - **レビューの遅れ** :各リリースはAppleの審査プロセスを通過する必要があり、1-7日かかることがあります。 - **一括変更** :通常、iOS の各リリースでは複数の変更がまとめて行われます。 - **TestFlight** :ベータ版は、App Storeリリース前にTestFlight経由で配布される場合があります。 - **リリースノート** :App Storeガイドライン用に特別に作成する必要があります。 iOSアプリは相変わらず同じコミット規約に従い、変更ログ生成にはgit cliffを使用していますが、ユーザーへの実際のリリースはそれほど頻繁ではなく、手作業によるスケジュールで行われます。