Closed
Description
The current release process is convoluted. I think we agreed that we won’t be maintaining stable
branches from now on, and will release from master. This means breaking changes land behind a flag. In this issue I am documenting the new master-based release process. It is intended to be exhaustive so let me know if something is missing.
If we agree on this, I’ll be deleting the existing documentation and point it to this issue instead. This issue is in checklist format to be copy-pasteable for specific release issues (h/t @flarnie for the tip). Ideally we should automate some parts of this, potentially by fixing RRM to work with this model.
So You Want to Cut a Release...
Ensure all commits in master were tested at Facebook.
- Check that they were a part of the latest internal sync.
- For stable releases, prefer that they’ve been landed for a week or so.
- Only skip this step if you really know what you’re doing!
Verify that you have npm permissions.
- You’re in
npm owner ls react
- You’re in
npm owner ls react-art
- You’re in
npm owner ls react-dom
- You’re in
npm owner ls react-test-renderer
- If not, ping someone on the team!
Ensure your React is fresh.
- Ensure you’re on
master
- Do a
git pull
- Is master green on CI? Check the most recent commits.
- Check that your local
git log
output matches the commit list. - Run
yarn
in the repo root.
Ensure runtime dependencies match what users would get.
- For
fbjs
:- Look at the version range of
fbjs
in rootpackage.json
. - Ensure all
packages/*/package.json
depending onfbjs
specify the same range.
- Look at the version range of
- For
object-assign
:- Look at the version range of
object-assign
in rootpackage.json
. - Ensure all
packages/*/package.json
depending onobject-assign
specify the same range.
- Look at the version range of
- For
prop-types
:- Look at the version range of
prop-types
in rootpackage.json
. - Ensure all
packages/*/package.json
depending onprop-types
specify the same range.
- Look at the version range of
- Run
yarn upgrade object-assign prop-types fbjs
- This might change the lockfile. This should not change any
package.json
. - Commit the changes, if any.
Do the local sanity checks in the repo root.
- Run
yarn test
in the repo root. - Run
yarn lint
in the repo root. - Run
yarn flow
in the repo root.
STABLE RELEASE ONLY: Update error codes.
- Run
yarn build -- --extract-errors
in the repo root. - If
scripts/error-codes/codes.json
changes,git commit -am 'Update error codes'
- Maybe: If we still have a separate
*-stable
branch for docs when you’re reading this, we need to cherry-pick that commit to that branch. This makes sure the website decoder knows about the updated error codes. But ideally we should just change docs to serve from master.
STABLE RELEASE ONLY: Write the changelog.
- Open
CHANGELOG.md
and add release notes in the same format as earlier. - Make sure the changes are easy to understand. Friendly one-liners are better than PR titles.
- Make sure all contributors are credited, just like before.
- Verify that the markup isn’t messed up by previewing it in the online editor.
Update the version.
- Update
version
in rootpackage.json
- Update export in
src/ReactVersion.js
- Update both
version
and React version inpeerDependencies
in allpackages/*/package.json
:-
packages/react/package.json
-
packages/react-art/package.json
-
packages/react-dom/package.json
-
packages/react-noop-renderer/package.json
-
packages/react-test-renderer/package.json
- If you see any other packages, update this list :-)
-
- Run
yarn version-check
to verify your changes. -
git commit -am "<version number>"
Build it!
- Run
yarn build
in the repo root.
Run fast packaging smoke test.
- Open
fixtures/packaging/babel-standalone/dev.html
in the browser for a smoke test. - It should say “Hello world!”
Run slow packaging smoke test.
- Go to
cd fixtures/packaging
and runnode build-all.js
-
npm install -g serve
- Go to the repo root and run
serve -s .
- Open http://localhost:5000/fixtures/packaging/ and verify every iframe shows “Hello World!”
Release!
- Run
git push
- Run
git push --tags
- Go to
build/packages
- For every subfolder:
- For non-stable versions: Run
npm publish --tag next
in the subfolder. - For stable versions: Run
npm publish
in the subfolder.
- For non-stable versions: Run
- For every subfolder:
- Run
npm info <package> dist-tags
to verify that things were published as you expect. - FIXME: We should really automate this part because it’s currently not atomic.
STABLE RELEASE ONLY: Create GitHub Release.
- Open New Release page on GitHub.
- Choose the tag version you just pushed in the dropdown so that it says “Existing tag”.
- Paste the new release notes from
CHANGELOG.md
. - Attach all files in
build/dist/*.js
exceptreact-art.*
to the release. - Press “Publish release”!
STABLE RELEASE ONLY: Update the version reported on the website.
- Open
docs/_config.yml
- Change
react_version
in it to the newly published version. -
git commit -am "Update the reported React version on the website"
- Maybe: If we still have a separate
*-stable
branch for docs when you’re reading this, we need to cherry-pick that commit to that branch. This makes sure the website knows about the updated config. But ideally we should just change docs to serve from master.
STABLE RELEASE ONLY: Update Bower.
- Clone the Bower repo outside of main repo:
git clone https://github.com/reactjs/react-bower.git
- Make sure it’s on
master
and you didgit pull
- Delete all JS files from the Bower repo and copy all
build/dist/*.js
from React repo into it. - In the Bower repo,
git commit -am "<version number>"
- In the Bower repo,
git tag -a v<version number>
(Don’t miss thev
!) - In the Bower repo,
git push
andgit push --tags
STABLE RELEASE ONLY: Try it out!
-
npm i -g create-react-app
-
create-react-app myapp
-
cd myapp
-
npm start
STABLE RELEASE ONLY: Reach out to DOM team.
- Reach out to the DOM team (@nhunzaker @jquense @aweary) in case they would like to go through DOM fixtures. (This doesn’t block the release.)