The day I broke React Native

Rate this content
Bookmark

4th November 2022 - It was just a regular day for the "release crew" as we were approaching to prepare the first release candidate for React Native 0.71. Little did we know how an innocuous release could have triggered a domino effect resulting in failing builds for nearly every React Native developer out there.


With the wisdom of hindsight, we'll walk through what happened, what are our lessons learned and the lowlights of this incident. We'll have the opportunity to look through the internals of React Native, discover our incident-response culture, and learn how we're hardening our ecosystem to protect us against similar events in the future.  


Join me as we revive this incident, and don't miss this opportunity to gain insights, be inspired, and embrace the lessons learned from the day I broke React Native.

This talk has been presented at React Day Berlin 2023, check out the latest edition of this React Conference.

Watch video on a separate page

FAQ

The Starbucks Reserve Roastery in Seattle is renowned for its unique coffee tasting experience.

The React Native builds broke due to an issue related to an unstable release candidate version of React Native, specifically version 0.71.0.rc0, which was inadvertently picked up by projects because of a '+ dependency' in Gradle configurations.

The React Native release crew is responsible for crafting new releases of React Native every four to six months, launching the initial release candidate versions, and managing the version updates.

The decision to move Android artifacts from NPM to Maven Central was made because the NPM package for React Native was becoming too large, exceeding the size limits for NPM packages.

The issue was resolved by releasing patches for all affected versions of React Native down to version 0.63 and by requesting the removal of the problematic version from Maven Central.

Key lessons included the removal of '+ dependencies' in project configurations, improvements in incident response times, and the establishment of a release support window to better manage supported versions and patches.

In Android development, a '+ dependency' refers to a dynamic version specifier in Gradle that automatically uses the highest version available. This can lead to unpredictable builds if a new, possibly unstable version is released.

Post-incident, React Native emphasized better practices in library creation, including a standardized template for new libraries to prevent similar issues and ensure stability and resilience in builds.

Nicola Corti
Nicola Corti
30 min
08 Dec, 2023

Comments

Sign in or register to post your comment.

Video Summary and Transcription

The Talk discusses an incident where a React Native release caused broken builds and how it was fixed. The incident occurred due to the NPM package becoming too big, leading to the move of Android artifacts to Maven central. The use of dynamic versions and the plus dependency in React Native were identified as contributing factors to the problem. Lessons learned include the importance of removing plus dependencies and the need for better recommendations for creating resilient libraries.
Available in Español: El día que rompí React Native

1. The Day I Broke React Native

Short description:

Hi, everyone. Today I want to tell you a story of a rainy November day from last year in Seattle. People started reporting broken React native builds, and we discovered an upcoming version of React native causing the issue. I, Nicola Corti, an Android engineer at Meta, will walk you through the incident and how we fixed it.

Hi, everyone. So today I want to tell you a story. It's a story of a rainy November day from last year. I was in Seattle. If you have ever been to Seattle, please make sure you check out the Starbucks Reserve Roastery. It's a special Starbucks where they do coffee tasting. If you're into coffee, you definitely want to check it out. And I was there. I was checking my email, checking my GitHub notifications. And yeah, everything looked great. But then people started messaging me that for some reason their builds, their React native builds were broken. And well, I was on Discord. So let me check what actually is going on.

And on React native, you will run Android to run the Android app. And people started reporting like error messages out of the blue, in a really terrible way. Like imagine your build was working one minute ago, then you build again, you don't make any code changes and your build is broken. This is terrible from the developer experience point of view. And obviously it should not happen. Then we started looking into like, hey, why those builds are actually breaking? And we realized that in the error message, there was a mention of an upcoming version of React native, like 0.710.rc0. And even for users that were on previous versions of React native, like on 68 and 69 and so on. At that point, we realized, yeah, I think we have a problem. And I personally had a really big problem because I was supposed to fly back to London in a couple of hours. So okay, how do we fix it?

So my name is Nicola Corti. I work as an Android engineer in the React native team at Meta. And today I'm excited to tell the story of the day when I broke React native. So to fully understand what was this, I will walk you through what happened, like what was the real incident, why it broke and how we actually fixed it. So the disclaimer here is, well, the incident was an Android, but we effectively broke the build for everyone. So well, not many people here use React native, but trust me, there is a lot of lessons learned that applies to any technology out there. So let's start from what happened. So inside React native and inside the React native team, we have this group of people called the release crew.

2. React Native Release Process

Short description:

The team responsible for React Native releases launches the Bump.OSS version script with the upcoming version. The first release candidate, RC0, is sent out for testing. In 0.71, the NPM package became too big, leading to the move of Android artifacts to Maven central.

They're responsible for crafting new releases of React Native every four to six months. They launch the script called Bump.OSS version from the console with the upcoming version they intend to release. When a new branch is cut, they do the RC0, which is the first release candidate. The first release candidate is generally unstable and is sent out to the market for testing. In 0.71, there were a lot of changes, including the RFC 508, which provided an alternative solution for React Native artifacts. The NPM package of React Native was getting too big, so the Android artifacts were moved to Maven central, where Android libraries are distributed.