# Publishing a new version of `@mdn/browser-compat-data`

New releases of the [`@mdn/browser-compat-data`](https://www.npmjs.com/package/@mdn/browser-compat-data) NPM package are usually published once per week or more often around browser releases.

The release process is mostly automated using two GitHub workflows:

1. The [`release-pr` workflow](https://github.com/mdn/browser-compat-data/blob/main/.github/workflows/release-pr.yml) manages a pull request that bumps the `package.json` version and updates the release notes.
2. The [`release` workflow](https://github.com/mdn/browser-compat-data/blob/main/.github/workflows/release.yml) creates the GitHub release and tag, publishes the release on NPM, and triggers MDN deployment.

The release itself is triggered manually, to help ensure that as many ready pull requests make it into the release.

## Performing a release

Any project owner (or release designee) can complete the following steps to publish a new version.

To publish a release:

1. _If this is a major or minor release_: Align with project owners on the release notes entries, i.e. "Breaking changes" for major releases, and "Notable changes" for major/minor releases.
2. Mark the release pull request (titled `Release vX.Y.Z`) as ready for review.
3. Ensure that the pull request is up-to-date, i.e. that all checks have passed on the latest `main` commit, and that no other pull request is merged right before.
4. _If this is a major or minor release_: Add the release notes entries manually to the `RELEASE_NOTES.md` on the `release` branch (_below_ the release date).
5. Merge the pull request.

## Behind the scenes

The release pull request is managed by the [`release-pr` workflow](https://github.com/mdn/browser-compat-data/blob/main/.github/workflows/release-pr.yml), which runs `npm run release` with a personal access token (PAT) that is owned by [@mdn-bot](https://github.com/mdn-bot), and has read and write access to code and pull requests on the repository.

The [release script](https://github.com/mdn/browser-compat-data/tree/main/scripts/release) performs the following steps:

1. Fetches the latest `main` branch.
2. Determines the previous release version.
3. Determines whether a major or minor version bump is needed, based on pull requests with the `semver-major-bump` or `semver-minor-bump` label merged since the previous release.
4. Updates the `package.json` by running `npm version`.
5. Updates the `RELEASE_NOTES.md` by determining release notes based on the following input:
   - Release and repository statistics.
   - List of added and removed features, determined by iterating over all merged pull requests since the previous release, and enumerating all features before and after the merge commit.
6. Commits and pushes the changes to the `release` branch.
7. Creates or updates the release pull request accordingly.

Merging the release pull request yields the following result:

1. The merge commit triggers the `create-release` job of the [`release` workflow](https://github.com/mdn/browser-compat-data/blob/main/.github/workflows/release.yml) workflow.
2. The `create-release` job publishes a [GitHub release](https://github.com/mdn/browser-compat-data/releases) and [tag](https://github.com/mdn/browser-compat-data/tags) based on the updated `package.json` and release notes.
3. The published GitHub release triggers the `publish-release` job of the `release` workflow.
4. The `publish-release` job performs the following steps:
   - Builds the release.
   - Publishes the release to NPM.
   - Adds the `data.json` as an asset to the GitHub release.
   - Dispatches a `bcd_release` event on the [mdn/bcd-utils](https://github.com/mdn/bcd-utils) repository, which triggers the deployment of the new BCD release on MDN.
