Skip to content

Release and its automated processes

Ruslan Lesiutin edited this page Mar 27, 2023 · 11 revisions

This page contains relevant information about automated processes / utilities that can be used in a release cycle.

Finding all packages that have unpublished changes

Use case

  1. You want to identify each package with unpublished (on npm) changes and update its version. This can be used in release cycle if you have merged some fixes to *-stable branch.
  2. You want to force-bump each public package to the next minor version. This happens usually before release branch cutoff. In this case, please specify release-branch-cutoff argument before executing the script.

How to execute

npm run bump-all-updated-packages or npm run bump-all-updated-packages --release-branch-cutoff

Pseudocode

check that no git changes are present

for each package:
    if package is private -> skip

    if release-branch-cutoff argument is provided:
        bump package version to the next minor
        return

    grep id of the last commit that changed package
    grep id of the last commit that changed version of the package

    if these ids are different:
        bump package version (minor or patch)

align packages versions across whole monorepo
commit changes if required

Notes

At the final step you will be asked if you want to commit all these changes. Always confirm committing if you want these packages to be published then on CircleCI, because the workflow that does this will check that commit has a tag inside its message.

Updated versions will also be updated in packages consumers. This means if @react-native/x has @react-native/y as a dependency and we bump version of @react-native/y, then @react-native/x will have updated version of @react-native/y specified.

Publishing an updated package to npm

We have a CircleCI workflow, which runs only on main or stable-* branches.

Pseudocode

for each package:
    if last commit contains version change:
        if this commit has specific message:
            publish package to npm

Notes

This workflow explicitly checks that commit has a specific tag inside its message. This is used to prevent accidental publishes. To create such specific commit you should use script from above.

If you want to bump package version and publish it to npm registry, your version change should be exactly in the last commit. This is because of two things:

  1. If multiple commits are merged to main branch at the same time, CircleCI will execute workflows only once on top of the latest commit.
  2. To determine that version was changed we evaluate the difference between HEAD and HEAD~1.

Example script output, where no package versions were changed: Screenshot 2023-01-03 at 12 21 01

Align package versions across monorepo

Side note: We do not anticipate that this script might be useful in future. With current monorepo setup, all packages versions should be updated and aligned by using bump-all-updated-packages script, both in main and *-stable branches.

Use case

You (or someone from release cycle team) want to verify that the latest versions of @react-native/* packages are specified across monorepo, including template.

How to execute

npm run align-package-versions

Pseudocode

check that no git changes are present

for each package x:
   for each package y:
       if y has x as dependency:
           validate that y uses the latest version of x