Here's how Rust is currently released:
Open a PR bumping the version number in src/version. r+ rollup=never this
PR.
Mark it as rollup=never, because if it lands in a rollup as not the first
PR then other pull requests in that rollup will be incorrectly associated with
the prior release.
Both promotions should happen on Monday. You can open both PRs at the same time, but make sure the stable promotion lands first.
Temporarily turn off GitHub branch protection for the stable branch in
rust-lang/rust repo. In your local Rust repo:
$ git fetch origin
$ git push origin origin/beta:stable -f
# make sure that the release notes file is as fresh as possible
$ git checkout origin/master -- RELEASES.mdRe-enable branch protection for the stable branch. Send a PR to rust-lang/rust
on the stable branch making the following changes:
- Update
src/ci/channeltostable
Once the PR is sent, r+ it and give it a high p=1000.
After the PR is merged you'll need to start a dev release. Obtain AWS CLI credentials and run this command from the simpleinfra repository:
./start-release.py dev stable
As soon as this build is done create a blog post on Inside Rust asking for testing. The index is https://dev-static.rust-lang.org/dist/YYYY-MM-DD/index.html.
Test rustup with:
RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org rustup update stableRun this command in the simpleinfra repository, while in a rust-lang/rust checkout (branch doesn't matter):
../simpleinfra/release-scripts/master-to-beta.shThis script sets up the new rust-lang/cargo branch and force pushes the appropriate commit to rust-lang/rust's beta branch.
Once that's done, send a PR to the freshly created beta branch of rust-lang/rust
which updates src/ci/channel to beta.
Send a PR to the master branch to:
-
Run
./x.py run src/tools/bump-stage0to update the bootstrap compiler to the beta you created yesterday. -
Remove references to the
bootstrapandnot(bootstrap)conditional compilation attributes. You can find all of them by installing ripgrep and running this command:rg '#!?\[.*\(bootstrap' -t rustThe general guidelines (both for
#[]and#![]) are:- Remove any item annotated with
#[cfg(bootstrap)]. - Remove any
#[cfg(not(bootstrap))]attribute while keeping the item. - Remove any
#[cfg_attr(bootstrap, $attr)]attribute while keeping the item. - Replace any
#[cfg_attr(not(bootstrap), doc="$doc")]with$docin the relevant documentation block (or in a new documentation block). - Replace any
#[cfg_attr(not(bootstrap), $attr)]with#[$attr].
- Remove any item annotated with
Decide on a time to do the release, T.
-
T-50m - Run the following command in a shell with AWS credentials in the simpleinfra repository:
./start-release.py prod stableThat'll, in the background, schedule the
promote-releasebinary to run on the production secrets (not the dev secrets). That'll sign everything, upload it, update the html index pages, and invalidate the CDN. Note that this takes about 30 minutes right now. Logs are in/opt/rcs/logs. -
T-10m - Locally, tag the new release and upload it. Use "x.y.z release" as the commit message.
$ git tag -u FA1BE5FE 1.3.0 $COMMIT_SHA $ git push rust-lang 1.3.0After this Update thanks.rust-lang.org by triggering a build on GitHub Actions on the master branch.
-
T-2m - Merge blog post.
-
T - Tweet and post everything!
- Twitter @rustlang
- Users forum
-
T+5m - Release and tag Cargo. From a rust-lang/rust checkout (script will checkout the stable branch automatically), run the following script from simpleinfra.
../simpleinfra/release-scripts/tag-cargo.sh
-
T+1hr Send a PR to the beta branch running
./x.py run src/tools/bump-stage0to bump the boostrap compiler to the stable you just released.
Bask in your success.
If something goes wrong and we need to rebuild the stable artifacts, merge the
PR on the stable branch of the rust-lang/rust repository. Once the commit
is merged, issue the following command in a shell with AWS
credentials on the simpleinfra repository:
./start-release.py dev stable --bypass-startup-checks
Sometimes a PR requires testing how it behaves when downloaded from rustup, for example after a manifest change. In those cases it's possible to publish a new nightly based off that PR on dev-static.rust-lang.org.
Once the try build finishes grab the merge commit SHA and run the following command in a shell with AWS credentials on the simpleinfra repository:
./start-release.py dev nightly $MERGE_COMMIT_SHAWhen the release process end you'll be able to install the new nightly with:
RUSTUP_DIST_SERVER=https://dev-static.rust-lang.org rustup toolchain install nightly