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側の書き方の問題ならこのファイルを直して再実行する。