DevOps / CI/CD 2026年5月7日

2026-05-07 iOS String Catalog(xcstrings) ローカライズ CI ゲートレンタル Apple Silicon クラウド Mac(HK / JP / KR / SG / US

MacXCode エンジニアリングチーム 2026年5月7日 約24分

ストリングのドリフトは App Store 提出の静かな殺し屋です。英語のスクリーンショットは綺麗でも、手元に無い端末で QA が言語を切り替えたときに初めて 省略複数形ルール欠落、古い バリアント が露わになります。Xcode String Catalog.xcstrings)はそれらを集約しますが、香港・東京・ソウル・シンガポール・米国Mac mini M4 をレンタルするチームでも CI 契約 は必要です—PR ごとのカタログ検証、翻訳者向け XLIFF 出力、衝突検知付きインポート、ビジネス上重要なロケールごとの自動 UI パスを最低 1 回。本 2026-05-07 のガイドではリリースノートに無い運用—12 以上 のロケールを足しても xcodebuild を速く保つ方法、並列レーン上限 との整合、ローカライズ資産の再生成で DerivedData が膨らまないようにする ジョブ単位の分離 をまとめます。依存解決が同じホストを共有するなら SwiftPM キャッシュ衛生 と併用し、リリース週にエクスポートとパッケージ解決が同じ NVMe キューを奪い合わないようにしてください。

ローカライズがパイプラインの最後で壊れる理由

機能テストは英語で通ります。マーケは repo に触れないコピーで承認します。翻訳ベンダーには返す頃には古い ZIP が届きます。String Catalog がプロセスを魔法のように直すわけではなく—Git で diff できる 単一アーティファクト を与えます。CI の仕事は、欠落キー・不正な複数形・不正プレースホルダをコンパイルエラー並みに騒がしくすることです。

アンカー:PR で導入されたキーに対し、必須ロケールのいずれかが訳を欠くならマージをブロック—単体テスト失敗と同じ扱い。

xcstrings と散在する .strings / stringsdict

レガシー構成では翻訳が数十ファイルに分裂し、削除をレビューが見逃します。.xcstrings はメタデータ・状態・バリアントを束ね自動化しやすくしますがマージ衝突の表面積は増えます。移行中はインフラ repo にどのターゲットがまだレガシーを食うかの 互換マトリクス を残してください。二重ソースは早めに廃止—同じキーで並列フォーマットは git blame を混乱させます。

GitHub/GitLab で強制できる品質ゲート

  • 構文検証 — リリースと同じ DEVELOPER_DIR でカタログをコンパイル。
  • キー網羅 — ティア 1 リストのロケールで NEW_KEY の状態が translated でないなら失敗。
  • プレースホルダ整合%@%d、位置指定パラメータの不一致を拒否。
  • スクリーンショット Lint — 任意だがスクリーンショットテストを使うなら英語以外を夜間に 1 ロケール。

ヘッドレス ビルダー向けインポート / エクスポート手順

SSH のみを想定し、GUI ではなく再現可能なコマンドを使います:

xcodebuild -exportLocalizations -project YourApp.xcodeproj -localizationPath ./exports xcodebuild -importLocalizations -project YourApp.xcodeproj -localizationPath ./imports

エクスポートは IPA エクスポートと ASC アップロード と同じ NVMe ボリュームに置き、署名とローカライズ自動化で権限と umask を揃えます。常に専用 CI ユーザーで実行し、root は使わず TCC の判断を保ちます。

XLIFF 往復の衛生

翻訳者には安定した ID が必要で、エンジニアには決定的なインポートが要ります。XLIFF は Git かオブジェクトストアに チェックサム タグ 付きで保管。ベースカタログに無いキーを変えるインポートは拒否し、レビューが頼る note を剥がすファイルも拒否。複数地域がバリアントを足す場合(例 zh-Hanszh-Hant)、CI が推測しないようビジネスルールを YAML にします。

マージのコツ:XLIFF の衝突はコードと同様—プレースホルダを調整せず「両方取り」しない。UI クラッシュは App Store レビューより予防が安い。

複数形・デバイス・幅バリアント

現代アプリは watch のコンプリケーション、Dynamic Type のスクショ、Shortcuts 文字列など デバイス固有 の幅を要します。カタログはバリアントをサポートしますが QA マトリクスに載っていなければ意味がありません。どのバリアントが 必須 でどれが 努力目標 か文書化し CI 閾値に反映—さもないとエンジニアはマージを急いですべて needs_review にします。

ホストを溶かさず並列ロケール行列

ロケールを足すたびに UI フローを XCTest すると資産作業が倍増します。ホストごとの同時実行先は 並列 xcodebuild ジョブ と同じキュー規律で上限してください。シャーディング を推奨:レーン A が東アジア、B が欧州、C が RTL スモーク。シャードごとの実時間を記録し、p95 が四半期で 25% 超増なら翻訳チームに近い地理へレンタル ノードを追加。

ディスク、DerivedData、ローカライズキャッシュ

エクスポートとインポートは数千の小ファイルを触れ—APFS メタデータを忙しくさせます。フルエクスポート前にビルダー卷に少なくとも 18% の空きを確保し、過去の XLIFF をコールドストレージへ退避して DerivedData 横に溜めない。TMPDIR と xcresult の分離 に従い、ローカライズ ジョブが別パイプラインの成果物を消せないようにします。

社内公開できる数値目標

  • リリース候補タグ前にティア 1 ロケール 100% 網羅。
  • カタログで stale14 日超未解決が 0
  • 典型的 PR の増分ローカライズ検証が 12 分未満

ストリング凍結前の九ステップ

  1. プロダクト文言を凍結し、コミット SHA を添えてベンダーへ通知。
  2. リリースブランチからベースライン XLIFF をエクスポート。
  3. App Store ビルドと同じ Xcode でカタログ検証。
  4. ベンダーファイルを捨てブランチへインポートし JSON 状態を diff。
  5. LTR・RTL・CJK の ロケールで UI スモーク。
  6. アプリ内文言と同期しているなら App Store メタデータも確認。
  7. du -sh でローカライズディレクトリをスナップショットし NVMe 退行を追跡。
  8. マージをタグしコンプライアンス用チェックサム一覧を添付。
  9. needs_review の発売後監査をスケジュール。

FAQ:App Store レビュー、CI ユーザー、ハイブリッド Pod

質問 実務的回答(2026-05-07)
CocoaPods と SPM のハイブリッド repo は追加手順が要るか はい—依存解決の後にローカライズし生成バンドルが揃ってから。順序は SwiftPM と CocoaPods を参照。
タイポ修正だけなら UI テストを省略できるか ポリシー bot が空白のみと証明できる場合のみ—さもなくば英語以外スモークを最低 1 回。

ローカライズ負荷が高い CI に Mac mini M4・1–2 TB が合う理由

ローカライズ パイプラインは メタデータランダム:無数の小ファイルが、すでに xcodebuild test を載せているのと同じ NVMe コントローラを叩きます。MacXCode のベアメタル Mac mini M4 ノードは遅延を一定に保ち、ゲートが翻訳スループットを測り—隣のテナント騒音ではありません。キャパシティ計画が別ビルダーを要するときは HK / JP / KR / SG / US地域別料金 を引用し、ベンダーの SSH をリリースエンジニアと並べる手順は ヘルプ に。

次のローカライズ波の前に NVMe に余裕を

Mac mini M4 · HK / JP / KR / SG / US · SSH / optional VNC