0
1

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自動化】Rails 7.1 → 7.2 のアップデート修正をAIに任せる

Last updated at Posted at 2025-11-03

はじめに

  • 今回、はじめて設計プロンプトを用いて、Rails のバージョンを7.1.3.4 → 7.2.2.2に上げました
  • CHANGELOGnew defaultsを根拠に、AIGitHub Copilot Pro / Claude Sonnet 4)に テスト → 自動修正 → 再テスト → Lint → CLEANUP までを一気通貫で実行させています
  • 本記事では、プロンプト設計の中身、実際に適用した差分等をまとめます
  • AIを設計で動かす」Railsアップデート対応の実践録です

『今後、バージョンアップデートに伴う修正はAIに任せよう』という取り組みです。

環境

  • バックエンド:Rails7.1.3.4(APIモード)
  • インフラ:AWS
  • 開発環境:Docker(リモートLinuxホスト / 例:AWS EC2)
  • エディタ:Visual Studio Code(Remote - SSH)
  • AIツール:GitHub Copilot Pro
  • AIモデル:Claude Sonnet 4
  • ホストPC:MacBook Pro (Apple M3 Pro / macOS 26.0.1)

プロンプト設計とは

プロンプト設計は、公式ドキュメント・仕様・運用規約・ログなどの一次情報を根拠に、作業手順・評価基準・失敗時の対応を事前に構造化し、その設計に沿ってAIに実行させることです。

※今回の事例では、一次情報としてRailsのCHANGELOGnew defaultsを用いました。

狙いは次の通りです。

  • Rails7.2の変更点をAIが自分で走査・根拠URLを添えて修正提案出来るようにする
  • SCAN → TEST → FIX/RETEST → D-CHECK(Deprecation=0)→ LINT → CLEANUP → FINAL1ジョブ・無停止で完走させる
  • 1論点 = 1差分unified diff を出し、即適用→再テストのループを徹底する
  • 失敗はエラーシグネチャ化し、同一シグネチャが3回stuck判定→残課題化

プロンプト設計を初めて行う前に参考にしたもの

プロンプト例
sample
# 依頼
あなたは{# 役割}です。次の{# ルール}を必ず守り、以下の「プレスリリース」への想定質問と回答例を挙げて、{# 形式}の形式で出力してください。

# 役割

# 形式
- 表形式
- 列は「想定質問」「回答例」「聞かれる可能性」

# ルール
- 想定質問と回答例を3個ずつ挙げてください
- {# 評価}の方法で評価し、出力に含めてください
- {# 参照}を例にして、出力してください
- {# 実行シナリオ}に沿って私とやり取りをしてください

# 評価
- 想定質問が聞かれる可能性を五段階で評価

# 参照
- なし

# 実行シナリオ
1. 一回目の出力を行い「どの案がよろしいですか?」と私に聞く
2. 私が選んだ案の傾向を把握して、{# 依頼}を再度実行する
3. 私に「このタスクを終了させてよろしいですか?」と聞き、終了してよければタスクを完了させる。終了してはいけなければ再度{# 依頼}を実施する

事前準備(手動作業)

Rails本体の更新だけは手動で実施しました。

Gemfile
- gem "rails", "~> 7.1.0"
+ gem "rails", "~> 7.2.0"
terminal
# 1) Railsを更新
docker compose run --rm web bundle update rails

# 2) Dockerイメージを再ビルド
docker compose build web

# 3) Dockerコンテナの生成/起動
docker compose up -d

# 4) Railsバージョン確認
docker compose run --rm web bundle exec rails -v  # => Rails 7.2.2.2

※Dockerfile内でbundle installをしていない構成であれば、
1) Railsを更新の実行後にdocker compose run --rm web bundle install を実行する

設計プロンプト(実体)

プロンプト全文
# Rails 7.1.3.4 → 7.2.2.2 アップグレード

> 目的:AI エージェント単独で **CHANGELOG 解析 → テスト → 自動修正 → 再テスト → Lint → 不要ファイル削除 → 最終判定** を連続実行し、Rails を 7.1.3.4 から 7.2.2.2 に確実に移行する

---

## 実行シグナル
- この文書の読了直後に実行を開始する
- 外部からの追加入力を待たない
- 確認/依頼/質問を禁止する

## 実行ポリシー(停止禁止)
- 全工程を **単一実行**で完走する(SCAN → TEST → FIX/RETEST ループ → D-CHECK → LINT → CLEANUP → FINAL)
- プレースホルダ禁止:#1〜#7 は **必ず具体値で埋める**
- 必要な情報が無い場合は **AI 自身がコマンドを実行してログを取得**してから埋める
- 同一エラー上限=3、総試行上限=50、各コマンドのタイムアウト=1800秒、ログ取り込み上限=300000文字
- 出力ガード:1メッセージの総文字数は **40000文字以内**。長文ログは要約し、末尾から最大 400 行に制限する
- **Rubocop はテスト成功および Deprecation 警告の解消が確認された後にのみ実行**する(早期実行を禁止)

## 前提
- 既に Rails 7.2.2.2 にアップグレード済み
  - Gemfile は `gem "rails", "~> 7.2.0"` に更新済み、`bundle update` 済み
  - `docker compose run --no-deps --rm web bundle exec rails -v` の結果は `Rails 7.2.2.2`
- テストは Minitest(RAILS_ENV=test)
- 実行環境は Docker Compose(サービス名 `web`- 作業はリポジトリ直下で行う。**Git コマンドは使用禁止**(unified diff を提示し、ファイル直接編集で適用)

## 判断根拠(限定)
- Rails 7.2 Release Notes  
  https://railsguides.jp/7_2_release_notes.html
- rails/rails 7-2-stable 各 CHANGELOG  
  Railties https://github.com/rails/rails/blob/7-2-stable/railties/CHANGELOG.md  
  Action Cable https://github.com/rails/rails/blob/7-2-stable/actioncable/CHANGELOG.md  
  Action Pack https://github.com/rails/rails/blob/7-2-stable/actionpack/CHANGELOG.md  
  Action View https://github.com/rails/rails/blob/7-2-stable/actionview/CHANGELOG.md  
  Action Mailer https://github.com/rails/rails/blob/7-2-stable/actionmailer/CHANGELOG.md  
  Active Record https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md  
  Active Storage https://github.com/rails/rails/blob/7-2-stable/activestorage/CHANGELOG.md  
  Active Model https://github.com/rails/rails/blob/7-2-stable/activemodel/CHANGELOG.md  
  Active Support https://github.com/rails/rails/blob/7-2-stable/activesupport/CHANGELOG.md  
  Active Job https://github.com/rails/rails/blob/7-2-stable/activejob/CHANGELOG.md  
  Action Mailbox https://github.com/rails/rails/blob/7-2-stable/actionmailbox/CHANGELOG.md
- `config/initializers/new_framework_defaults_*.rb` の原文キー
- 上記以外の情報源は使用禁止

## 行動規範
- 推測を禁止する。各論点に **根拠 URL** を付与(railsguides.jp または github.com/rails/rails の 7-2-stable 該当アンカー)
- 修正は **unified diff(---/+++/@@、リポジトリ相対パス)** で提示し、提示直後に **AI が適用**する(Git 操作禁止)
- 実行可能コマンドは **Tools の3種のみ**。ユーザーに実行依頼しない
- **1 論点 = 1 diff**`db/migrate/**``config/initializers/**` の一括置換は提案のみ可(適用は論点単位の最小修正)

## Tools(AI が実行するコマンド)
1) テスト  
```bash
docker compose run --rm web rails test
```

2) Lint(D-CHECK 合格後のみ)
```bash
docker compose run --rm web bundle exec rubocop -A
```

3) new defaults の安全取得(実リポジトリを変更しない一時コピー方式)  
```bash
docker compose run --no-deps --rm web sh -lc '
  set -eu
  tmpdir="$(mktemp -d)"
  mkdir -p "$tmpdir/app"
  tar -C .     --exclude=.git     --exclude=node_modules     --exclude=log     --exclude=tmp     --exclude=vendor/cache     -cf - . | tar -C "$tmpdir/app" -xf -
  cd "$tmpdir/app"
  bundle exec rails -v
  bundle exec rails app:update --force
  [ -f config/initializers/new_framework_defaults_7_2.rb ] && cat config/initializers/new_framework_defaults_7_2.rb || { echo "new_framework_defaults_7_2.rb not found" >&2; exit 1; }
'
```

---





# 実行フロー(Deprecation 自動修正を組み込み)

## SCAN
- 公式ソースのみを根拠に **#1 影響まとめ表** を作成(Breaking/Deprecation/Default のうち挙動に影響するものに限定)
- **#2 横断検索パターン** を CHANGELOG と new defaults から AI が自動生成し、**patterns.txt** を出力する  
  - 各パターンに「命中例」「除外条件」「誤検知注意」を付す
- **Deprecation 候補一覧** を作成する  
  - 項目名、根拠 URL、推奨される代替手段、検出用のキーワードまたはコードシグネチャを列挙する
- **#3 修正計画 JSON** を SCHEMA 適合で作成する  
  - `type` は Brk / Dep / Default のいずれか
  - `fix_strategy`**代替 API への置換** または **設定キーの更新** または **旧挙動フラグの削除** を具体記述する
- **#4 修正 diff** を #3 と一対一で作成する(空の diff は禁止)
- SCAN の終了直後に **TEST を即実行** する

## TEST
- **テスト開始前に** `config/application.rb``config.load_defaults`**`7.2` に更新**(unified diff を提示・適用)
- `docker compose run --rm web rails test` を実行し、ログを解析する
- 失敗テストから **エラーシグネチャ** を生成する  
  形式:`<ExceptionClass> | <normalized_message> | <top_app_frame_path>:<line> | Rails 7.2.2.2`
- テスト出力の **Deprecation 警告** を抽出し、`#3 修正計画 JSON` の該当項目へ関連付ける
- 停止せず **FIX/RETEST** に遷移する

## FIX → RETEST(自動ループ:Deprecation 自動修正を含む)
- `#3 修正計画 JSON` の優先度順で未処理の項目を一つ選び、**unified diff を提示 → 直ちに適用** する
- Deprecation は以下のいずれかで解消する  
  - **代替 API への置換**(古いメソッドやオプションを新しいものへ置換)
  - **新設定キーの導入または更新**(new defaults に準拠)
  - **旧挙動フラグの削除**(互換フラグを撤去して標準挙動へ移行)
- すべての差分に **rationale_url** を付与する(CHANGELOG または new defaults の該当箇所)
- 直後に **テストを再実行** し、失敗と Deprecation 警告の有無を評価する
- 同一のエラーシグネチャが 3 回続いた場合は当該項目を `status="stuck"` に更新し、代替方針と人手確認ポイントを記録する
- 失敗と Deprecation 警告が解消されたら **D-CHECK** へ遷移する。残っていれば FIX を継続する

## D-CHECK(Deprecation 完了確認)
- 合格条件  
  - 直近のテストが成功している
  - テスト出力中の Deprecation 警告が 0 である
- 合格した場合のみ **LINT** に遷移する。不合格の場合は **FIX** に戻る

## LINT(AI が実行:D-CHECK 合格後)
- `docker compose run --rm web bundle exec rubocop -A` を実行し、**違反件数サマリ** を記録する
- 直後に **テスト再実行** し、その要約を記録する
- Lint による自動修正でテストが失敗した場合は必要最小の差分で修正し、再度 Lint → テストを繰り返す(上限管理を維持)

## **CLEANUP(最小・自動)**
- 目的:**push不要な一時ファイルを削除**する  
- 対象:`patterns.txt``config/initializers/new_framework_defaults_7_2.rb`(存在すれば)  
- 実施:**unified diff による削除**を提示・適用し、**ワンショットでテスト再実行**。失敗した場合は**即ロールバック**して FINAL で残課題化

## FINAL
- 判定:**全テスト成功 かつ rubocop クリア かつ Deprecation 警告 0 かつ CLEANUP 完了**
- 達成で完了。未達なら残課題と再テスト手順を列挙する

---

## 出力フォーマット
- 先頭に **ランレポート JSON** を出力し、続けて **#1 〜 #7** を順序通りに出力する
- ランレポート JSON の例
```json
{
  "phase": "SCAN|TEST|FIX|RETEST|D-CHECK|LINT|CLEANUP|FINAL",
  "next_actions": ["AIエージェントが直ちに実行する具体手順"],
  "ordered_work_items": ["#3 修正計画 JSON の title を優先順で列挙"],
  "attempt_budget": {"per_error_signature_max": 3, "used": 0}
}
```

---

## SCHEMA(#3 修正計画 JSON)
```SCHEMA
{
  "type": "array",
  "items": {
    "type": "object",
    "required": [
      "component",
      "type",
      "title",
      "rationale_url",
      "priority",
      "fix_strategy"
    ],
    "properties": {
      "component": {"type": "string"},
      "type": {"type": "string", "enum": ["Brk","Dep","Default"]},
      "title": {"type": "string"},
      "rationale_url": {"type": "string", "format": "uri"},
      "priority": {"type": "string", "enum": ["High","Medium","Low"]},
      "dependencies": {"type": "array","items": {"type": "string"}},
      "file_hits_sample": {"type": "array","items": {"type": "string"}},
      "test_failures_linked": {"type": "array","items": {"type": "string"}},
      "fix_strategy": {"type": "string"},
      "risk_notes": {"type": "string"},
      "attempts": {"type": "integer", "minimum": 0},
      "last_error_signature": {"type": "string"},
      "status": {"type": "string", "enum": ["pending","in_progress","fixed","stuck"]}
    },
    "additionalProperties": false
  }
}
```

実行フロー(概要)

  • SCAN
    • Rails7.2CHANGELOGから影響点を抽出し、横断検索パターン修正計画JSONを生成
    • new defaultsconfig/initializers/new_framework_defaults_7_2.rb)を安全取得し、切り替え可能な新しい既定設定(オン/オフの設定項目)を確認
    • 修正計画JSONの各項目と一対一対応の修正diffを作成(空diffは不可)
  • TEST
    • config.load_defaults 7.2を適用してテスト実行
    • Deprecation 警告 を抽出し、修正計画JSONの該当項目へ関連付け
  • FIX/RETEST
    • 失敗やDeprecationに対し、根拠付きのunified diffを順次適用→再テスト
      • 同一エラーが3回続いた場合は、代替方針と確認ポイントを記録する(残課題化)
      • 失敗やDeprecationが解消されたらD-CHECKへ遷移
  • D-CHECK
    • 直近のテスト成功 & テスト出力中の Deprecation警告が0であることを確認
      • 0でない場合はFIXに戻る
  • LINT
    • rubocop -Aを実行→再テスト
      • 自動テストが失敗した場合は、必要最小の差分で修正
        • 再度Lint → テストを繰り返す
  • CLEANUP
    • 一時生成の push 不要ファイル を削除(patterns.txtconfig/initializers/new_framework_defaults_7_2.rb)→ 再テスト
  • FINAL
    • すべて達成で完了
      • 全テスト成功rubocopクリアDeprecation警告 0CLEANUP完了

AIエージェントで実行した時の出力例

GitHub Copilot Pro(AIモデル:Claude Sonnet 4)
{
  "phase": "SCAN",
  "next_actions": [
    "Rails 7.2 CHANGELOG を解析して影響まとめ表を作成",
    "横断検索パターンを生成してpatterns.txtを出力",
    "Deprecation 候補一覧を作成",
    "修正計画JSONをSCHEMA適合で作成",
    "修正diffを生成",
    "TEST フェーズに遷移"
  ],
  "ordered_work_items": [],
  "attempt_budget": {"per_error_signature_max": 3, "used": 0}
}

Rails 7.1.3.4 → 7.2.2.2 アップグレード実行開始

SCAN フェーズ開始

#1 影響まとめ表

Rails 7.2 の主要な変更のうち、当プロジェクトに影響する可能性がある項目:

Component Type Title 影響度 根拠URL
ActiveRecord Default active_job.enqueue_after_transaction_commit High https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md
ActiveRecord Default active_storage.web_image_content_types Medium https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md
ActiveRecord Default active_record.validate_migration_timestamps Medium https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md
ActiveRecord Default active_record.postgresql_adapter_decode_dates Medium https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md
ActiveRecord Default yjit Medium https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md
ActiveRecord Brk connection レンタル方式変更 High https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md
ActiveRecord Dep ActiveRecord::Base.connection 非推奨 High https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md
ActiveRecord Dep enum の キーワード引数定義が非推奨 Medium https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md
ActiveJob Default enqueue_after_transaction_commit High https://github.com/rails/rails/blob/7-2-stable/activejob/CHANGELOG.md
ActiveSupport Dep ActiveSupport::ProxyObject 非推奨 Low https://github.com/rails/rails/blob/7-2-stable/activesupport/CHANGELOG.md

新しいデフォルト設定ファイルを取得して詳細を確認します。

docker compose run --no-deps --rm web sh -lc '
  set -eu
  tmpdir="$(mktemp -d)"
  mkdir -p "$tmpdir/app"
  tar -C .     --exclude=.git     --exclude=node_modules     --exclude=log     --exclude=tmp     --exclude=vendor/cache     -cf - . | tar -C "$tmpdir/app" -xf -
  cd "$tmpdir/app"
  bundle exec rails -v
  bundle exec rails app:update --force
  [ -f config/initializers/new_framework_defaults_7_2.rb ] && cat config/initializers/new_framework_defaults_7_2.rb || { echo "new_framework_defaults_7_2.rb not found" >&2; exit 1; }
'

#2 横断検索パターン生成

patterns.txt が作成されました

Deprecation 候補一覧

項目名 根拠URL 推奨代替手段 検出用キーワード
ActiveRecord::Base.connection https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md ActiveRecord::Base.with_connection ActiveRecord::Base.connection
enum キーワード引数定義 https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md enum :status, [:active, :inactive] enum status: [:values], option:
ActiveSupport::ProxyObject https://github.com/rails/rails/blob/7-2-stable/activesupport/CHANGELOG.md Ruby の BasicObject ActiveSupport::ProxyObject

#3 修正計画 JSON

現在のコードベースを調査して具体的な修正計画を作成します。

現在の設定を確認できました。修正計画JSONを作成します:

[
  {
    "component": "Rails Application",
    "type": "Default",
    "title": "config.load_defaults を 7.2 に更新",
    "rationale_url": "https://railsguides.jp/7_2_release_notes.html",
    "priority": "High",
    "dependencies": [],
    "file_hits_sample": ["config/application.rb:31"],
    "test_failures_linked": [],
    "fix_strategy": "config.load_defaults 7.0 を config.load_defaults 7.2 に置換して Rails 7.2 のデフォルト設定を有効化",
    "risk_notes": "新しいデフォルト設定により既存の挙動が変更される可能性",
    "attempts": 0,
    "last_error_signature": "",
    "status": "fixed"
  },
  {
    "component": "Active Job",
    "type": "Default",
    "title": "enqueue_after_transaction_commit のデフォルト設定追加",
    "rationale_url": "https://github.com/rails/rails/blob/7-2-stable/activejob/CHANGELOG.md",
    "priority": "Medium",
    "dependencies": ["config.load_defaults を 7.2 に更新"],
    "file_hits_sample": [],
    "test_failures_linked": [],
    "fix_strategy": "新しいデフォルト設定 config.active_job.enqueue_after_transaction_commit = :default を適用(Rails 7.2 の new_framework_defaults に含まれる)",
    "risk_notes": "トランザクション処理のタイミングが変更されジョブの実行タイミングに影響",
    "attempts": 0,
    "last_error_signature": "",
    "status": "pending"
  },
  {
    "component": "Active Storage",
    "type": "Default",
    "title": "WebP サポートのデフォルト設定追加",
    "rationale_url": "https://github.com/rails/rails/blob/7-2-stable/activestorage/CHANGELOG.md",
    "priority": "Low",
    "dependencies": ["config.load_defaults を 7.2 に更新"],
    "file_hits_sample": [],
    "test_failures_linked": [],
    "fix_strategy": "config.active_storage.web_image_content_types に WebP サポートを追加(Rails 7.2 の new_framework_defaults に含まれる)",
    "risk_notes": "WebP 画像の処理方法が変更される可能性",
    "attempts": 0,
    "last_error_signature": "",
    "status": "pending"
  },
  {
    "component": "Active Record",
    "type": "Default", 
    "title": "migration timestamp validation のデフォルト設定追加",
    "rationale_url": "https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md",
    "priority": "Medium",
    "dependencies": ["config.load_defaults を 7.2 に更新"],
    "file_hits_sample": [],
    "test_failures_linked": [],
    "fix_strategy": "config.active_record.validate_migration_timestamps = true を適用(Rails 7.2 の new_framework_defaults に含まれる)",
    "risk_notes": "既存のマイグレーションファイルのタイムスタンプが検証されエラーの可能性",
    "attempts": 0,
    "last_error_signature": "",
    "status": "pending"
  },
  {
    "component": "Active Record",
    "type": "Default",
    "title": "PostgreSQL adapter の日付デコード設定追加",
    "rationale_url": "https://github.com/rails/rails/blob/7-2-stable/activerecord/CHANGELOG.md",
    "priority": "Medium",
    "dependencies": ["config.load_defaults を 7.2 に更新"],
    "file_hits_sample": [],
    "test_failures_linked": [],
    "fix_strategy": "config.active_record.postgresql_adapter_decode_dates = true を適用(Rails 7.2 の new_framework_defaults に含まれる)",
    "risk_notes": "PostgreSQL での日付クエリの戻り値の型が変更される可能性",
    "attempts": 0,
    "last_error_signature": "",
    "status": "pending"
  },
  {
    "component": "Rails Runtime",
    "type": "Default",
    "title": "YJIT デフォルト有効化設定追加",
    "rationale_url": "https://railsguides.jp/7_2_release_notes.html",
    "priority": "Low",
    "dependencies": ["config.load_defaults を 7.2 に更新"],
    "file_hits_sample": [],
    "test_failures_linked": [],
    "fix_strategy": "config.yjit = true を適用(Rails 7.2 の new_framework_defaults に含まれる)",
    "risk_notes": "YJIT 有効化によりメモリ使用量が増加する可能性",
    "attempts": 0,
    "last_error_signature": "",
    "status": "pending"
  }
]

#4 修正 diff

diff 1: config.load_defaults7.2 に更新

上記の diff を直ちに適用します:

application.rb+1-1  

TEST フェーズ開始

Rails 7.2 のデフォルト設定でテストを実行します:

docker compose run --rm web rails test  

テスト結果を分析します:

1. LoadError | cannot load such file -- search_client_container | app/services/search/* | Rails 7.2.2.2  
2. ArgumentError | assert_enqueued_with requires the Active Job test adapter, you're using ActiveJob::QueueAdapters::SidekiqAdapter | test/*job*test.rb | Rails 7.2.2.2  

Deprecation 警告:
DEPRECATION WARNING: Defining enums with keyword arguments is deprecated
複数の enum 定義で発生

FIX → RETEST フェーズ開始

1. enumkeyword argumentspositional arguments に修正

enum の定義を含むファイルを確認します:
該当する enum 定義を発見しました。

Rails 8.0 の Deprecation 警告を解消するため、keyword argumentspositional arguments に変更します。

diff 2: Title モデルの enum 修正

title.rb+2-2  

他の enum 定義も検索して修正します:

すべての enum 定義を修正します。まず、主要なモデルから:
...

残りのAdmin モデルの enum を修正:

2. Active Job テストアダプターの問題修正

Active Job のテストアダプターが Sidekiq に設定されているためにテストが失敗しています。テスト環境でのみ Active Job のテストアダプターを使用するよう設定します:

テスト環境に Active Job のテストアダプター設定を追加します:

diff 10: テスト環境での Active Job テストアダプター設定

3. Search クライアントコンテナの問題修正

Search関連のテストが LoadError で失敗しています。DIコンテナが正しく設定されていない可能性があります:

テスト環境で Search クライアントのモックが適切に設定されているか確認します:

4. テスト再実行

enum の Deprecation 警告とテストアダプターの問題を修正したので、テストを再実行します:

docker compose run --rm web rails test

良い進展です!enum の Deprecation 警告はすべて解消されました。
残っているのは Search クライアントコンテナの LoadError のみです。

DIコンテナの require 文を相対パスに変更します:

diff 12: Searchサービスの require 文修正

5. 最終テスト実行

すべての修正を適用したので、最終テストを実行します:

docker compose run --rm web rails test

6. テスト再実行(最終)

docker compose run --rm web rails test

🎉 D-CHECK 合格!

テスト結果:

1161 tests, 3632 assertions, 0 failures, 0 errors, 0 skips

Deprecation 警告:0件(enum キーワード引数の警告はすべて解消済み)

LINT フェーズ開始

D-CHECK に合格したので、Rubocop を実行します:

Rubocop が成功しました!違反はありません。

次にテストを再実行して、Lint による変更でテストが破綻していないか確認します:

docker compose run --rm web rails test

CLEANUP フェーズ開始

テストが成功したので、不要な一時ファイルを削除します:

diff 14: patterns.txt ファイルの削除

patterns.txt
--- a/patterns.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-# Rails 7.2 アップグレード 横断検索パターン
-
-## Breaking Changes
-validates_associated
-- 命中例: validates_associated :association_name
-- 除外条件: コメント内での記述
-- 誤検知注意: メソッド定義内での使用
-
-database_exists?
-- 命中例: ActiveRecord::Base.connection.database_exists?
-- 除外条件: テストコード内での stub/mock
-- 誤検知注意: カスタムメソッド名での使用
-
-## Deprecation Warnings
-ActiveSupport::Deprecation.*reset
-- 命中例: ActiveSupport::Deprecation.reset_callbacks
-- 除外条件: 既に新しい API に置換済み
-- 誤検知注意: 文字列内での記述
-
-## Configuration Defaults
-config.load_defaults
-- 命中例: config.load_defaults "7.1"
-- 除外条件: 既に 7.2 に更新済み
-- 誤検知注意: コメント内での記述
-
-to_time_preserves_timezone
-- 命中例: config.active_support.to_time_preserves_timezone
-- 除外条件: 既に明示的に設定済み
-- 誤検知注意: 文字列内での記述
-
-raise_on_missing_callback_actions
-- 命中例: config.action_controller.raise_on_missing_callback_actions
-- 除外条件: 既に明示的に設定済み
-- 誤検知注意: 文字列内での記述
-
-sanitizer_vendor
-- 命中例: config.action_view.sanitizer_vendor
-- 除外条件: 既に明示的に設定済み
-- 誤検知注意: 文字列内での記述
-
-enqueue_after_transaction_commit
-- 命中例: config.active_job.enqueue_after_transaction_commit
-- 除外条件: 既に明示的に設定済み
-- 誤検知注意: 文字列内での記述
-
-web_image_content_types
-- 命中例: config.active_storage.web_image_content_types
-- 除外条件: 既に明示的に設定済み
-- 誤検知注意: 文字列内での記述
-
-validate_migration_timestamps
-- 命中例: config.active_record.validate_migration_timestamps
-- 除外条件: 既に明示的に設定済み
-- 誤検知注意: 文字列内での記述
-
-postgresql_adapter_decode_dates
-- 命中例: config.active_record.postgresql_adapter_decode_dates
-- 除外条件: 既に明示的に設定済み
-- 誤検知注意: 文字列内での記述
-
-yjit
-- 命中例: config.yjit
-- 除外条件: 既に明示的に設定済み
-- 誤検知注意: 文字列内での記

FINAL フェーズ

🎉 Rails 7.1.3.4 → 7.2.2.2 アップグレード完了!

最終結果:

  • 全テスト成功: 1161 tests, 3631 assertions, 0 failures, 0 errors, 0 skips
  • Rubocop クリア: 587 files inspected, no offenses detected
  • Deprecation 警告 0: enum 関連の警告をすべて解消
  • CLEANUP 完了: 不要ファイル削除済み

完了サマリー

成功した修正項目:

config.load_defaults7.2 に更新 - Rails 7.2 のデフォルト設定を有効化
enumkeyword argumentspositional arguments に修正 - 16箇所の enum 定義を修正し、Rails 8.0 Deprecationを解消
Active Job テストアダプター設定 - テスト環境で適切なアダプターを設定
✅ Search DI コンテナrequire 文修正 - 相対パスによる正しい読み込みを実現
DI コンテナautoload path 追加 - Rails のクラス読み込み設定を改善
Rubocop 自動修正実行 - コードスタイルを最新に更新
✅ 不要ファイル削除 - patterns.txt を削除してクリーンアップ

修正された Deprecation 警告:

DEPRECATION WARNING: Defining enums with keyword arguments is deprecated (16箇所)
修正されたエラー:

  • LoadError: cannot load such file -- search_client_container (10箇所)
  • ArgumentError: assert_enqueued_with requires the Active Job test adapter (5箇所)

Rails 7.2 準拠確認:

  • Rails 7.2.2.2 で動作確認済み
  • 新しいデフォルト設定(config.load_defaults 7.2)適用済み
  • すべての Deprecation 警告解消済み

次のステップ(オプション):

  • Rails 7.2 の新機能(Active Job transaction commit、WebP サポート等)の本格活用を検討

Rails 7.2.2.2 への移行が正常に完了しました。


※本節では diff の詳細は割愛しています。具体的な差分は、後述の実際に適用された主な差分をご参照ください。

今回、AIモデルはClaude Sonnet 4で実行しました。
GPT-4等の相対的に弱いモデルでは、実行結果の安定性に欠ける場合があるのでご注意ください。

設計プロンプトをAIエージェントで渡した時に、50%くらいの確率で同じような結果になることを確認しました。

実際に適用された主な差分

ここでは代表的な変更のみを掲載します。
実際の修正は、同様の内容を含む複数ファイルに及びます。

Railsの既定挙動を7.2へ

config/application.rb
 module Myapp
   class Application < Rails::Application
-    config.load_defaults 7.0
+    config.load_defaults 7.2

schemaのバージョン更新

db/schema.rb
- ActiveRecord::Schema[7.1].define(version: 2025_07_11_085209) do
+ ActiveRecord::Schema[7.2].define(version: 2025_07_11_085209) do

ActiveJobのテストアダプターをtestに

config/environments/test.rb
+  # Use test queue adapter for Active Job assertions
+  config.active_job.queue_adapter = :test

enum: キーワード引数 → 位置引数

app/models/user.rb
-  enum role: {
+  enum :role, {
     guest: 0,
     member: 1,
     admin: 2
   }

-  enum status: {
+  enum :status, {
     active: 0,
     suspended: 1
   }

Rails 8 でdeprecated予定の警告を先取り解消

require_relative化(テスト時のLoadError対策)

app/services/search/create_index_service.rb
- require "search_client_container"
+ require_relative "../../di_containers/search_client_container"

今後の課題

  • プロンプトの分割・精度向上
    • 今回はマイナーアップデートかつ修正が少なかったため 単一プロンプトで完走できたが、メジャーアップデートに備え、 SCAN / TEST / FIX / D-CHECK / LINT / CLEANUP を段階プロンプト化し、各プロンプトの精度と再現性を高める必要がある
  • バージョン指定で自動アップデートを実現
    • AIエージェントに プロンプト対象バージョン を渡すだけで、CHANGELOG解析→修正→テスト→CLEANUP まで完了する半自律フローを目標にする(失敗時はシグネチャで自動分岐)
  • AIモデルの適材適所
    • 解析・提案・コード修正・リライトなどの工程ごとに、モデル特性を活かして使い分けできるよう、各モデルの強み・弱みを継続的に検証し知識を深める
  • 設計(プロンプト)の管理方式と運用ルールの整備
    • プロンプトをリポジトリ管理し、バージョニング・変更履歴・レビュー/承認フローを行う。併せて、禁止事項(秘匿情報/外部ソースの制限)・根拠URL必須・一論点=一差分・ログ/メトリクス採取などの運用基準をドキュメント化する
  • 汎用化
    • Rails に限らず、Nuxt / Node / ライブラリ更新にも適用できるような汎用プロンプトに拡張する

最後に

エンジニアに限らず、業務で AI を使いこなす力が求められる時代です。
そのための有効な手段のひとつが プロンプト設計だと考えています。
任せたい対応を明確に言語化し、いつ実行しても期待する結果に近づける必要があります。
今回の取り組みは、その第一歩となりました。

今後も設計の精度を高め、プロンプト設計をブラッシュアップしていければと思います。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?