ClaudeReact NativeJan 27, 2023, 12:00 AM

React Native 0.71-RC0 Android outage postmortem

A condensed section focused on the key takeaways first.

Original Post

Quick Digest

Summary

A condensed section focused on the key takeaways first.

claudeenmodel: claude-sonnet-4-20250514

React Native 0.71-RC0 Android Build Outage Postmortem

Key Points

  • Dynamic version dependencies caused widespread Android build failures
  • Community found workaround in 2 hours, full fix took 4 days
  • Patch releases shipped for all versions back to React Native 0.63

Summary

On November 4th, 2022, the release of React Native 0.71.0-rc0 caused Android build failures across all older React Native versions. The issue was caused by Gradle dynamic versions (+) in build templates that automatically pulled the latest artifacts from Maven Central, creating version mismatches between local builds and remote dependencies.

Key Points

  • Root Cause: Dynamic version dependency com.facebook.react:react-native:+ in build.gradle templates caused older versions to pull 0.71.0-rc0 artifacts
  • Impact: All Android builds on React Native versions prior to 0.71.0-rc0 failed due to version mismatches
  • Resolution Timeline:
    • Community workaround identified within 2 hours
    • Patch releases shipped for versions back to 0.63 over weekend
    • Full resolution on November 8th when artifacts were removed from Maven Central
  • Lessons Learned:
    • Need better incident response strategy for open-source issues
    • Importance of supporting older versions due to ecosystem fragmentation
    • Enhanced testing infrastructure required for release candidates
    • Dynamic version dependencies are antipatterns that should be avoided

Full Translation

Translations

A translation section that keeps the flow of the original article.

claudejamodel: claude-sonnet-4-20250514

React Native 0.71-RC0 Android障害のポストモーテム

0.71が利用可能になった今、2022年11月4日にReact Native & Expo Androidビルドの最初の0.71リリース候補をリリースする際に、すべてのReact NativeバージョンでAndroidビルドを破綻させたインシデントについて、重要な情報を共有したいと思います。このインシデントの対処に協力してくれた貢献者たちは、最近ポストモーテム会議に参加し、何が起こったのか、そこから何を学んだのか、そして将来的に同様の障害を避けるためにどのような行動を取るのかについて詳細に議論しました。

何が起こったか

2022年11月4日、私たちはReact Nativeのバージョン0.71.0-rc0(0.71の最初のリリース候補)を複数の公開リポジトリで公開しました。このリリース候補で行われた主要な変更により、ソースからビルドする代わりにMaven Centralにアーティファクトを公開することで、ビルド時間の改善に貢献しました。これがどのように行われたかの詳細は、RFC#508と関連する議論で確認できます。

残念ながら、テンプレートから新しいプロジェクトを作成する方法のために、これにより古いバージョンのAndroidユーザーは、プロジェクトで使用しているバージョン(0.68.0など)の代わりに0.71.0-rc0の新しいアーティファクトをダウンロードし始めるため、ビルドの失敗が発生しました。

なぜこれが起こったか

React Nativeテンプレートは、Androidアプリをビルドするためのbuild.gradleファイルを提供します。このファイルには、次のようなReact Native Androidライブラリへの依存関係が含まれています:implementation("com.facebook.react:react-native:+")。重要なのは、この依存関係の+部分(Gradle Dynamic version)がGradleに利用可能な最高バージョンのReact Nativeを選択するよう指示することです。

Gradle Dynamic versionsの使用は、再現性の低いビルドにユーザーを晒すため、アンチパターンとされています。私たちは動的バージョンが引き起こす可能性のある問題を認識していたため、0.71では新しいアプリテンプレートをクリーンアップし、すべての+依存関係を削除しました。

しかし、React Nativeの古いバージョンのユーザーは依然として+バージョンを使用していました。これにより、0.71.0-rc.0より前のReact Nativeバージョンでのビルドが、React Nativeの利用可能な最高バージョンをすべてのリポジトリに問い合わせることになりました。Maven Centralに新しく公開された0.71.0-rc.0が利用可能な最高バージョンになったため、0.71.0-rc.0より前のReact Nativeバージョンでのビルドが0.71.0-rc.0のアーティファクトを使用し始めました。

ローカルビルド(例:0.68.0)とMaven Centralのアーティファクト(0.71.0-rc.0)間のReact Nativeバージョンの不一致により、これらのビルドが失敗しました。

このイベントに関するさらなる技術的詳細は、このGitHub issueでも確認できます。

軽減と解決方法

11月4日に問題を特定するとすぐに、コミュニティが問題を修正するための手動回避策を見つけて共有しました。これはReact Nativeを特定のバージョンに固定し、間違いを修正するものでした。

その後、11月5日と6日の週末にかけて、リリースクルーは0.63まで遡ってすべての以前のReact Nativeバージョンのパッチリリースを出荷し、パッチを自動的に適用したため、ユーザーはReact Nativeの修正されたバージョンに更新できました。

同時に、私たちはSonatypeに連絡して、問題のあるアーティファクトの削除を依頼しました。問題は11月8日にアーティファクトがMaven Centralから完全に削除されたときに完全に解決されました。

イベントのタイムライン

このセクションには、イベントの簡単なタイムラインが含まれています。すべての時間はGMT/UTC +0です。

  • 11月4日 - 5:06 PM: 0.71-RC0がリリース
  • 11月4日 - 6:20 PM: ビルド問題の最初の報告が開かれる
  • 11月4日 - 7:45 PM: コミュニティによって問題が特定される
  • 11月4日 - 9:39 PM: 回避策が伝達され、Expoがすべてのユーザーに修正をデプロイ
  • 11月5日 - 03:04 AM: ステータスと回避策を伝達するための新しいissueが開かれる
  • 11月6日 - 04:11 PM: アーティファクトの削除を求めるSonaTypeへのチケットが開かれる
  • 11月6日 - 04:40 PM: @reactnativeからの確認とissueへのリンクを含む最初のツイート
  • 11月6日 - 07:05 PM: 0.63まで遡ってReact Nativeバージョンにパッチを適用する決定
  • 11月7日 - 12:47 AM: 最後のパッチリリース0.63.5がリリース
  • 11月8日 - 08:04 PM: Maven Central上のアーティファクトが完全に削除
  • 11月10日 - 11:51 AM: インシデントに関するissueがクローズ

学んだ教訓

このインシデントを引き起こす条件は多くの点でReact Native 0.12.0以来存在していましたが、今後React Nativeを開発・リリースする基盤がより強固になることを確実にしたいと考えています。以下は学んだ教訓と、将来的により迅速かつ強力に対応するためにプロセスとインフラストラクチャをどのように適応させるかについての実行可能な項目です。

インシデント対応戦略

このインシデントは、React Nativeに関連するオープンソースの問題に対するインシデント対応戦略のギャップを浮き彫りにしました。コミュニティは2時間未満で迅速に回避策を見つけました。この問題の影響範囲に対する可視性の欠如と、古いバージョンでの修正に必要な複雑さのため、私たちは影響を受けた人々がGitHub issueで回避策を発見することに依存していました。

この問題のより大きな範囲を認識し、すべての人がGitHub issueを見つけることに依存できないことを理解するのに48時間かかりました。私たちは、人々のプロジェクトを自動的に修正するより複雑な積極的な軽減策を優先する必要がありました。

私たちは、開発者が適用する回避策と自動的にデプロイできる修正のどちらに依存するかのプロセスを見直します。また、エコシステムの健全性についてより良いライブパルスを得るためのオプションも検討します。

リリースサポートポリシー

rn-versionsツールで視覚化されているように、インシデント時のReact Native開発者ベースの90%以上をカバーするために、バージョン0.63まで遡ってパッチをリリースする必要がありました。これは、歴史的に摩擦に満ちたReact Nativeのアップグレード体験が原因であると考えています。私たちは現在、エコシステムのこの断片化を軽減するために、アップグレード体験をよりスムーズで迅速にする方法を検討しています。

React Nativeの新しいバージョンをリリースすることが、古いバージョンのユーザーに影響を与えることは決してあってはならず、ワークフローに引き起こした混乱についてお詫び申し上げます。同様に、私たちが導入した改善と保護措置の恩恵を受けるために、依存関係とReact Nativeの最新バージョンを最新の状態に保つことの重要性も強調したいと思います。

このインシデントは、公式のリリースサポートポリシーが定義されつつあり、まだ放送や実施されていない時期に発生しました。将来的には、コミュニケーションチャネルを通じてサポートポリシーを伝達し、npmでReact Nativeの古いバージョンを非推奨にすることを検討します。

サードパーティライブラリのテストとベストプラクティスの改善

このインシデントは、より良いリリーステストとサードパーティライブラリへのより良いガイダンスの重要性を浮き彫りにしました。テスト面では、安定リリースのために現在整備されている自動化とテストの不足により、0.63.xまでのバージョンリリースが困難であることが判明しました。私たちはリリースとテストインフラストラクチャの重要性を認識しており、将来的にさらに投資していきます。

具体的には、react nativeのリリースの一部として、サードパーティライブラリのテストを奨励・サポートしています。また、Core Contributors Discord Serverに新しいチャネルと役割を追加しています。

これに加えて、create-react-native-libraryのメンテナーであるCallstackとの密接な協力を開始し、ライブラリテンプレートを改善し、React Nativeプロジェクトと統合するために必要なすべてのベストプラクティスに従うことを確実にしています。create-react-native-libraryの新しいバージョンは、後方互換性を提供しながら0.71プロジェクトと完全に互換性があります。

結論

世界中の開発者のワークフローに引き起こした混乱についてお詫び申し上げます。上記で強調したように、私たちはすでに基盤を強化するための行動を開始しており、さらなる作業が必要です。これらの洞察を共有することで、皆さんがこのインシデントをよりよく理解し、私たちの学習を活用して自分のツールやプロジェクトでより良いプラクティスを適用できることを願っています。

最後に、アーティファクトの削除を支援してくれたSonatype、私たちのコミュニティ、そして可能な限り迅速にこれに対処するために絶え間なく働いたリリースクルーに改めて感謝したいと思います。