← CLAUDE-PENGIN-TOOLS
DOCUMENT · 12.7 KB

qa/e2e-commands.md

Workspace snapshot · 09/04 13:33

E2E 実行手順(コピペ用)— WordPress Migration Skill

e2e-plan.md の11手順を、そのまま貼れるコマンドに落としたもの。 実行者はこのAgentでも植木さんでも構わない。出力を e2e-result.md に貼れば判定できる。

このファイル自体は未実行。 想定どおり動かない箇所があるはずなので、 詰まったらブロック単位で結果を書き残してほしい。それも成果になる。

前提: Node.js 20.18 以上。Docker・MySQL・Apache は使わない。 作業は新規の使い捨てディレクトリ内だけで完結し、終わったら丸ごと消す。


Block 0. 能力ゲート(ここが通らなければ先へ進めない)

Playground は MySQL ではなく SQLite で動く。移行手順が依存する wp db export / wp db import / wp search-replace が SQLite 環境で使えるかは未確認。 最初にここだけ確かめる。使えないと分かった時点で中止し、MySQLが使える使い捨て環境へ切り替える。

mkdir -p ~/wpmig-e2e && cd ~/wpmig-e2e

cat > gate.json <<'JSON'
{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "steps": [
    { "step": "wp-cli", "command": "wp option get siteurl --no-color" },
    { "step": "wp-cli", "command": "wp db export /tmp/gate.sql --no-color" },
    { "step": "wp-cli", "command": "wp search-replace http://a.example http://b.example --all-tables-with-prefix --precise --report-changed-only --dry-run --no-color" }
  ]
}
JSON

npx @wp-playground/cli@latest run-blueprint --blueprint=gate.json

判定:

結果次にやること
3コマンドすべて成功Block 1 へ進む
wp db export が失敗中止。 MySQLが使える使い捨て環境が必要(結果に出力を貼って報告)
wp search-replace が失敗中止。 同上
npx がパッケージを取得できない中止。 ネットワーク制限の内容を報告

Block 1. 移行元サイトを作る(型C の移行元)

投稿・固定ページ・シリアライズ値・検索避けを仕込む。あとで壊れたかどうかを見るための材料。

cd ~/wpmig-e2e

cat > old-site.json <<'JSON'
{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "steps": [
    { "step": "wp-cli", "command": "wp option update siteurl http://127.0.0.1:9400 --no-color" },
    { "step": "wp-cli", "command": "wp option update home http://127.0.0.1:9400 --no-color" },
    { "step": "wp-cli", "command": "wp rewrite structure /%postname%/ --hard --no-color" },
    { "step": "wp-cli", "command": "wp post create --post_title=記事1 --post_status=publish --post_content='<a href=\"http://127.0.0.1:9400/about/\">内部リンク</a> <img src=\"http://127.0.0.1:9400/wp-content/uploads/sample.png\">' --no-color" },
    { "step": "wp-cli", "command": "wp post create --post_title=記事2 --post_status=publish --post_content='本文に http://127.0.0.1:9400 を含む' --no-color" },
    { "step": "wp-cli", "command": "wp post create --post_type=page --post_title=About --post_name=about --post_status=publish --no-color" },
    { "step": "wp-cli", "command": "wp option update pengin_test_serialized --format=json '{\"url\":\"http://127.0.0.1:9400/path\",\"nested\":{\"json_escaped\":\"http:\\/\\/127.0.0.1:9400\\/x\"}}' --no-color" },
    { "step": "wp-cli", "command": "wp option update blog_public 0 --no-color" }
  ]
}
JSON

npx @wp-playground/cli@latest server \
  --port=9400 --site-url=http://127.0.0.1:9400 \
  --blueprint=old-site.json --mount=./old-data:/wordpress/wp-content --skip-browser &
sleep 30
curl -sI http://127.0.0.1:9400/ | head -n 3

PASS条件: HTTP 200 が返る。blog_public は 0(意図的に検索避けを残した状態にしてある)。


Block 2. Step 2 相当 — 読み取りのみの現状調査

cat > audit.json <<'JSON'
{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "steps": [
    { "step": "wp-cli", "command": "wp core version --no-color" },
    { "step": "wp-cli", "command": "wp option get siteurl --no-color" },
    { "step": "wp-cli", "command": "wp option get home --no-color" },
    { "step": "wp-cli", "command": "wp option get blog_public --no-color" },
    { "step": "wp-cli", "command": "wp option get permalink_structure --no-color" },
    { "step": "wp-cli", "command": "wp db prefix --no-color" },
    { "step": "wp-cli", "command": "wp plugin list --status=active --no-color" },
    { "step": "wp-cli", "command": "wp post list --post_type=any --format=count --no-color" }
  ]
}
JSON
npx @wp-playground/cli@latest run-blueprint --blueprint=audit.json

PASS条件: 全項目が取得でき、書き込み系コマンドを1回も実行していない(このブロックに含まれていない)。 投稿件数を控える(Block 8 と Block 11 で照合する)。


Block 3-4. バックアップと復元可能性の確認

「取得できた」と「戻せる」は別。 ダンプを取り、別の使い捨てDBへ入れて件数を照合する。

cat > backup.json <<'JSON'
{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "steps": [
    { "step": "wp-cli", "command": "wp db export /wordpress/wp-content/backup-pre-migration.sql --no-color" }
  ]
}
JSON
npx @wp-playground/cli@latest run-blueprint --blueprint=backup.json
ls -l ./old-data/backup-pre-migration.sql
tail -c 200 ./old-data/backup-pre-migration.sql

PASS条件: ファイルが0バイトでなく、末尾まで書けている。

復元可能性の確認(使い捨ての3つ目の環境に入れる。本番相当のDBへ戻さない):

cat > restore-check.json <<'JSON'
{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "steps": [
    { "step": "wp-cli", "command": "wp db import /wordpress/wp-content/backup-pre-migration.sql --no-color" },
    { "step": "wp-cli", "command": "wp post list --post_type=any --format=count --no-color" },
    { "step": "wp-cli", "command": "wp option get siteurl --no-color" }
  ]
}
JSON
npx @wp-playground/cli@latest run-blueprint \
  --blueprint=restore-check.json --mount=./old-data:/wordpress/wp-content

PASS条件: 投稿件数が Block 2 と一致し、siteurl が http://127.0.0.1:9400。 ここで初めて、このダンプがロールバック手段として使えると言える。


Block 5-6. dry-run 6形式と、確認ゲート

移行先は http://127.0.0.1:9401。この段階でDBを書き換えてはいけない。

cat > dryrun.json <<'JSON'
{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "steps": [
    { "step": "wp-cli", "command": ["wp","search-replace","http://127.0.0.1:9400","http://127.0.0.1:9401","--all-tables-with-prefix","--precise","--report-changed-only","--skip-columns=guid","--dry-run","--no-color"] },
    { "step": "wp-cli", "command": ["wp","search-replace","//127.0.0.1:9400","//127.0.0.1:9401","--all-tables-with-prefix","--precise","--report-changed-only","--skip-columns=guid","--dry-run","--no-color"] },
    { "step": "wp-cli", "command": ["wp","search-replace","http:\\/\\/127.0.0.1:9400","http:\\/\\/127.0.0.1:9401","--all-tables-with-prefix","--precise","--report-changed-only","--skip-columns=guid","--dry-run","--no-color"] }
  ]
}
JSON
npx @wp-playground/cli@latest run-blueprint --blueprint=dryrun.json --mount=./old-data:/wordpress/wp-content

(この環境は http のみ・同一ホスト・ポート違いなので、6形式のうち https 系3本は該当なし。 実案件では6本になる。ここで検証するのは「dry-runが先で、件数が提示され、DBが変わらないこと」)

PASS条件:

  • 各コマンドが変更予定件数を報告する
  • 直後に wp option get pengin_test_serialized を取っても値が変わっていない(=DB未変更)
cat > confirm-gate.json <<'JSON'
{ "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "steps": [ { "step": "wp-cli", "command": "wp option get pengin_test_serialized --format=json --no-color" } ] }
JSON
npx @wp-playground/cli@latest run-blueprint --blueprint=confirm-gate.json --mount=./old-data:/wordpress/wp-content

PASS条件: 値が 9400 のまま。1文字でも 9401 に変わっていたらここでE2Eは失敗。


Block 7. 同意後に実行(再ダンプしてから)

cat > replace.json <<'JSON'
{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "steps": [
    { "step": "wp-cli", "command": "wp db export /wordpress/wp-content/pre-replace.sql --no-color" },
    { "step": "wp-cli", "command": ["wp","search-replace","http://127.0.0.1:9400","http://127.0.0.1:9401","--all-tables-with-prefix","--precise","--report-changed-only","--skip-columns=guid","--no-color"] },
    { "step": "wp-cli", "command": ["wp","search-replace","//127.0.0.1:9400","//127.0.0.1:9401","--all-tables-with-prefix","--precise","--report-changed-only","--skip-columns=guid","--no-color"] },
    { "step": "wp-cli", "command": ["wp","search-replace","http:\\/\\/127.0.0.1:9400","http:\\/\\/127.0.0.1:9401","--all-tables-with-prefix","--precise","--report-changed-only","--skip-columns=guid","--no-color"] },
    { "step": "wp-cli", "command": "wp cache flush --no-color" },
    { "step": "wp-cli", "command": "wp rewrite flush --hard --no-color" },
    { "step": "wp-cli", "command": "wp option get pengin_test_serialized --format=json --no-color" },
    { "step": "wp-cli", "command": "wp db search 127.0.0.1:9400 --all-tables-with-prefix --stats --no-color" }
  ]
}
JSON
npx @wp-playground/cli@latest run-blueprint --blueprint=replace.json --mount=./old-data:/wordpress/wp-content

PASS条件:

  • pengin_test_serialized が 壊れずに 9401 へ変わっている(JSONとして読め、入れ子のエスケープ形も置換済み)
  • wp db search の残存が 0件

Block 8-10. 移行先で起動して検証

kill %1 2>/dev/null   # 9400 を止める
cp -r ./old-data ./new-data

npx @wp-playground/cli@latest server \
  --port=9401 --site-url=http://127.0.0.1:9401 \
  --mount=./new-data:/wordpress/wp-content --skip-browser &
sleep 30

curl -sI  http://127.0.0.1:9401/ | head -n 5
curl -sIL http://127.0.0.1:9401/ | grep -i '^location'
curl -s   http://127.0.0.1:9401/ | grep -Eio 'noindex|127\.0\.0\.1:9400' | sort -u
curl -s   http://127.0.0.1:9401/robots.txt
curl -sI  http://127.0.0.1:9401/about/ | head -n 1
curl -sI  http://127.0.0.1:9401/wp-login.php | head -n 1

PASS条件:

  • トップと /about/ が 200(パーマリンクが機能している)
  • location の連鎖にループが無い
  • 本文に 127.0.0.1:9400(旧ドメイン)が残っていない
  • wp-login.php が 200

そして 型Dの主役:

cat > public-check.json <<'JSON'
{ "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "steps": [ { "step": "wp-cli", "command": "wp option get blog_public --no-color" } ] }
JSON
npx @wp-playground/cli@latest run-blueprint --blueprint=public-check.json --mount=./new-data:/wordpress/wp-content

PASS条件: 0 のままであることを検出できること。 このE2Eでは意図的に検索避けを残してあるので、robots.txt に Disallow: / が出るのが正しい。 「手順どおりに確認すれば気づける」ことの確認であって、1になっていることの確認ではない。


Block 11. ロールバック

cat > rollback.json <<'JSON'
{
  "$schema": "https://playground.wordpress.net/blueprint-schema.json",
  "steps": [
    { "step": "wp-cli", "command": "wp db import /wordpress/wp-content/pre-replace.sql --no-color" },
    { "step": "wp-cli", "command": "wp option get siteurl --no-color" },
    { "step": "wp-cli", "command": "wp post list --post_type=any --format=count --no-color" }
  ]
}
JSON
npx @wp-playground/cli@latest run-blueprint --blueprint=rollback.json --mount=./new-data:/wordpress/wp-content

PASS条件: siteurl が http://127.0.0.1:9400 に戻り、投稿件数が Block 2 と一致する。


後片付け(必ず実行)

kill %1 2>/dev/null
cd ~ && rm -rf ~/wpmig-e2e
rm -rf ~/.wordpress-playground/sites/* 2>/dev/null   # 他用途で使っている場合は該当サイトのみ削除

判定と報告

workspace/qa/e2e-result.md に、ブロックごとに次を書く。

  • 実行したコマンド / 実際の出力の要点 / PASS・FAIL・SKIP(理由)

全ブロックPASSで初めて SKILL_PUBLISH を申請する。 FAILがあれば、それが手順の欠陥なら SKILL.md か RUNBOOK.md を直し、 E2E側の書き方の問題ならこのファイルを直して再実行する。