1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

モバイルアプリ開発における AI 活用術 - CI/CD & リリース編

1
Last updated at Posted at 2026-01-18

この記事は「モバイルアプリ開発における AI 活用術」の詳細記事です。

目次


はじめに

開発が完了したら、GitHub にプッシュして CI・レビュー・リリースを行います。

このフェーズのゴール:

  • GitHub Actions による CI の設定
  • CHANGELOG からストア文言の自動生成
  • Fastlane による自動デプロイ

GitHub Actions(CI)

PR が作成されると、自動で CI が実行されます。

ワークフロー例

モノレポ対応: このプロジェクトはモノレポ構造のため、Sodalio/ 配下の変更のみを検出して CI を実行します。カスタムアクション(.github/actions/)を使用して Flutter セットアップや変更検出を共通化しています。

.github/workflows/ci-flutter.yml
name: Flutter CI

on:
  push:
    branches: [master, develop, 'release/**']
    paths:
      - "Sodalio/**"
      - ".github/actions/**"
      - ".github/workflows/ci-flutter.yml"
  pull_request:
    branches: [master, develop, 'release/**']
    paths:
      - "Sodalio/**"

env:
  FLUTTER_VERSION: "3.32.4"

jobs:
  flutter:
    runs-on: ubuntu-latest
    timeout-minutes: 30
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Check changes
        id: changes
        uses: ./.github/actions/check-file-changes
        with:
          directory: Sodalio

      - name: Setup Flutter
        if: steps.changes.outputs.changed == 'true'
        uses: ./.github/actions/setup-flutter
        with:
          flutter-version: ${{ env.FLUTTER_VERSION }}

      - name: Install dependencies
        if: steps.changes.outputs.changed == 'true'
        working-directory: Sodalio
        run: flutter pub get

      - name: Format check
        if: steps.changes.outputs.changed == 'true'
        working-directory: Sodalio
        run: dart format --set-exit-if-changed lib test

      - name: Analyze
        if: steps.changes.outputs.changed == 'true'
        working-directory: Sodalio
        run: flutter analyze --no-fatal-infos --no-fatal-warnings

      - name: Test with coverage
        if: steps.changes.outputs.changed == 'true'
        working-directory: Sodalio
        run: flutter test --coverage

スクリーンショット 2026-01-18 9.35.22.png

CI 高速化のポイント

設定 効果
paths 変更があったディレクトリのみ CI を実行
カスタムアクション Flutter セットアップ、変更検出を共通化
--no-fatal-infos --no-fatal-warnings 情報・警告レベルはブロックしない
timeout-minutes: 30 長時間実行を防止

リリースブランチの作成

開発が完了したら、リリースブランチを作成します。

# リリースブランチを作成
git checkout -b release/1.1.0

# 開発内容をマージ
git merge feature/ai-image-generation

# master へ PR を作成
gh pr create --base master --title "Release 1.2.0"

CHANGELOG → ストア文言生成

CHANGELOG.md を元に、ストア用のリリースノートを生成します。

CHANGELOG.md の例

CHANGELOG.md
# Changelog

## [1.1.0] - 2025-01-15

### Added
- AI によるキャラクター画像自動生成機能
- 画像の再生成機能

### Fixed
- 会話履歴のスクロールが重い問題を改善
- 一部端末での画像表示の不具合を修正

### Changed
- キャラクター作成画面のUIを改善

@claude への依頼

この工程は PR 上の @claude コメントで依頼し、CHANGELOG 更新とストア文言生成の 作業 PR を切り出してもらう運用にしています。

💬 PR コメント(@claude):
「CHANGELOG.md の更新と、App Store 用のリリースノートを多言語で生成してください。
リリースノートにはユーザーに見える変更のみを記載(新機能/改善/不具合修正)。
内部実装・リファクタ・CI/依存更新・テスト追加・開発向け変更は記載しないでください。
対象言語: ja, en, ko, th, vi, id, es-419
配置先: Store/whats_new/{version}/{lang}.md」

スクリーンショット 2026-01-18 9.37.30.png

↓ 作成されたブランチ
スクリーンショット 2026-01-18 9.38.24.png

生成されるストア文言の例

Store/whats_new/1.2.0/ja.md
【新機能】
・AIがキャラクターの画像を自動生成!設定内容から自分だけのアバターを作れます
・気に入らなかったら再生成も可能

【改善】
・会話履歴のスクロールがスムーズになりました
・キャラクター作成画面がより使いやすくなりました

【修正】
・一部端末での画像表示の問題を修正しました

リリース前の E2E 検証

自動デプロイ前に release ブランチで ローカルの E2E テストを全実行し、スクリーンショット差分を確認します。

私は claude に e2e 用のカスタムコマンドを作成しており、そこから実行可能にしています。

スクリーンショット 2026-01-18 9.42.01.png


自動デプロイ(Fastlane + GitHub Actions)

AppStore/GooglePlay への画像、文言、バイナリファイルのアップロードは release→master の PR において、workflow_dispatch を実行することで実現しています。

ワークフロー概要

.github/workflows/store-upload.yml
name: Upload Store Metadata

on:
  workflow_dispatch:
    inputs:
      version:
        description: "Store version (x.y.z). Optional; defaults to pubspec.yaml."
        required: false
      version_code:
        description: "Android versionCode. Optional; defaults to pubspec.yaml."
        required: false
      # Platform selection
      upload_ios:
        description: "Upload to App Store Connect"
        type: boolean
        default: true
      upload_android:
        description: "Upload to Google Play"
        type: boolean
        default: true
      # Upload targets
      upload_binary:
        description: "Build and upload binary (IPA/AAB)"
        type: boolean
        default: true
      upload_description:
        description: "Upload app description (概要文言)"
        type: boolean
        default: true
      upload_whats_new:
        description: "Upload release notes (アップデート文言)"
        type: boolean
        default: true
      upload_screenshots:
        description: "Upload screenshots"
        type: boolean
        default: true

実行オプション

オプション 説明
version バージョン番号(未指定時は pubspec.yaml から取得)
version_code ビルド番号(未指定時は pubspec.yaml から取得)
upload_ios App Store Connect へのアップロード有無
upload_android Google Play へのアップロード有無
upload_binary バイナリ(IPA/AAB)のビルド&アップロード
upload_description アプリ概要文言のアップロード
upload_whats_new リリースノート(アップデート文言)のアップロード
upload_screenshots スクリーンショットのアップロード

スクリーンショット 2026-01-18 9.43.39.png

アップロード対象

ストアへのアップロード対象は以下の 4 種類です:

対象 説明 iOS Android
バイナリ アプリ本体 IPA AAB
概要文言 アプリの説明文 description.txt full_description.txt
アップデート文言 今回の更新内容 release_notes.txt changelogs/{version_code}.txt
スクリーンショット ストア掲載画像 screenshots/ images/phoneScreenshots/

実用的なユースケース

やりたいこと 設定
文言だけ先に準備 upload_binary: false, upload_screenshots: false
スクショだけ更新 upload_binary: false, upload_description: false, upload_whats_new: false
バイナリだけ更新 upload_description: false, upload_whats_new: false, upload_screenshots: false

バイナリビルドはローカルで

GitHub Actions での iOS ビルドは時間がかかるため、実際の運用では以下のパターンが効率的です:

1. バイナリはローカルでビルド
   $ flutter build ipa --dart-define=PRODUCTION=true --release
   $ flutter build appbundle --flavor production --dart-define=PRODUCTION=true --release

2. fastlane で直接アップロード(ローカル)
   $ cd ios && bundle exec fastlane upload_metadata
   $ cd android && bundle exec fastlane upload_metadata

3. メタデータ(文言・スクショ)だけ Actions で更新
   - upload_binary: false で実行
   - 数分で完了

バージョン指定

  • version / version_code の入力が優先
  • 未指定時は pubspec.yamlversion: x.y.z+code から抽出

メタデータの管理

ストアメタデータは Store/ ディレクトリで一元管理し、アップロード時に fastlane 形式に変換します:

Store/
├── description/
│   └── current/
│       ├── ja.md    # 概要文言(日本語)
│       ├── en.md    # 概要文言(英語)
│       └── ...
├── whats_new/
│   ├── 1.0.0/
│   │   └── ja.md, en.md, ...
│   └── 1.1.0/       # アップデート文言(バージョンごと)
│       └── ja.md, en.md, ...
└── assets/
    └── screenshots/ # スクリーンショット
        └── ja/current/

メリット:

  • Markdown で管理できる
  • Git で変更履歴を追跡
  • バージョンごとのアップデート文言を保存

デプロイフロー

┌─────────────────────────────────────────────────────────────────────┐
│                        自動デプロイフロー                              │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  workflow_dispatch 実行                                             │
│       │                                                             │
│       ▼                                                             │
│  pubspec.yaml からバージョン取得                                       │
│       │                                                             │
│       ▼                                                             │
│  Store メタデータ同期(sync_store_metadata.sh)                        │
│       │                                                             │
│       ├─────────────────┬─────────────────┐                         │
│       ▼                 ▼                 ▼                         │
│  iOS Build         Android Build    Screenshots                     │
│  (flutter build)   (flutter build)  (maestro/fastlane)              │
│       │                 │                 │                         │
│       ▼                 ▼                 ▼                         │
│  App Store         Google Play      両ストアに                        │
│  Connect           Console          アップロード                      │
│       │                 │                                           │
│       └─────────────────┴─────────────────┐                         │
│                                           ▼                         │
│                                      審査待ち                       │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

👤 人の判断ポイント

# 判断内容 タイミング
1 ストア文言の最終確認 リリースノート生成後
2 ストアアップロードの実行判断 workflow_dispatch 実行前

次のステップ

👉 運用編 へ進む


参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?