# Releasing and publishing the SDK

While the release process can be handled manually, `cargo-release` has been
configured to make it more convenient.

By default, [`cargo-release`](https://github.com/crate-ci/cargo-release) assumes
that no pull request is required to cut a release. However, since the SDK
repo is set up so that each push requires a pull request, we need to slightly
deviate from the default workflow. A `cargo-xtask` has been created to make the
process as smooth as possible.

The procedure is as follows:

1. Switch to a release branch:

   ```bash
   git switch -c release-x.y.z
   ```

2. Prepare the release. This will update the `README.md`, set the versions in
   the `CHANGELOG.md` file, and bump the version in the `Cargo.toml` file.

   ```bash
   cargo xtask release prepare --execute minor|patch|rc
   ```

3. Double-check and edit the `CHANGELOG.md` and `README.md` if necessary. Once
   you are satisfied, push the branch and open a PR.

   ```bash
   git push --set-upstream origin/release-x.y.z
   ```

4. Pass the review and merge the branch as you would with any other branch.
5. Create tags for your new release, publish the release on crates.io and push
   the tags:

   ```bash
   # Switch to main first.
   git switch main
   # Pull in the now-merged release commit(s).
   git pull
   # Create tags, publish the release on crates.io, and push the tags.
   cargo xtask release publish --execute
   ```

   For more information on cargo-release:
   [https://github.com/crate-ci/cargo-release][https-github-com-crate-ci-cargo-release]

[https-github-com-crate-ci-cargo-release]: https://github.com/crate-ci/cargo-release
