Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: update rust toolchain and rework ci workflows #322

Merged
merged 6 commits into from
Sep 16, 2024

Conversation

bitwalker
Copy link
Contributor

This PR updates our Rust toolchain to a recent nightly (same date as the recent 1.81.0 stable release, 08-06), updates dependencies, and takes the opportunity to address some outstanding improvements/fixes to our GitHub Actions workflows.

See the commit description for the commit that modifies the workflows for details on what the changes are and the rationale behind them.

This closes out #256, and makes rust-toolchain.toml the canonical source for the Rust toolchain that will be used both locally and in CI. If we need to add targets or components to the "base" installation of our toolchain, they should be added there, rather than performed manually. For things like Cargo extensions that we use, cargo-make handles installing them for us, so we don't need manually-defined tasks for those items, except when we need to do something special. For example, we currently install a pinned version of cargo-component, which requires us to define a task to control that.

Since the workflow changes won't take effect until this is merged (IIRC), we may have to iterate on them a bit to fix any issues that come up. Let's prioritize addressing those when they come up, so we can rely on CI being stable.

* Replace unmaintained actions-rs steps with manual steps
* Rely on rust-toolchain.toml file for installing required toolchain,
  targets and components. This also cleans up Makefile.toml a bit
* Improve the way we handle build caches using Swatinem/rust-cache. See
  below for details.
* Restructure jobs to run lint/formatter checks and tests in parallel,
  but introduce some ordering in those groups to improve cache coherency
  and reuse, and in some cases, to avoid running expensive actions which
  are very likely to fail anyway. The main difference here is that
  amongst the test group, the unit test job is run first, followed by
  the midenc and cargo-miden integration test jobs. Previously only the
  cargo-miden integration tests were split out into a separate job. By
  breaking apart unit and integration tests, we can fail fast when unit
  tests are broken, and avoid running the expensive integration tests
  when they are very likely to fail if the unit tests are broken.
* Update the `book.yml` workflow to publish our new mkdocs-based
  documentation, rather than the old mdbook-based docs. This was causing
  the workflow to fail, it should now start working again.

RE: caching in CI. See https://github.com/Swatinem/rust-cache for
details on how the caching step works, particularly _what_ is cached,
how it is keyed, and _when_ it is cached.

The changes in this commit cache the results of a successful run _only_
when a push to the 'next' branch occurs, i.e. when a PR is merged. Thus,
all PR runs will use the cache associated with the last successful build
of `next` as a base, and build off of that.

Furthermore, there are three different caches:

* The cache shared by non-test jobs in the `ci.yml` workflow
* The cache shared by test jobs in the `ci.yml` workflow
* The cache used by the release job in the `release.yml` workflow

Previous to this commit, each job had its own cache, and the cache would
be updated on every successful build, causing a fair amount of cache
instability, and resulting in very little reuse.

This commit is more conservative about updating the cache, but shares it
more broadly across jobs, and the more conservative baseline means that
the cache is hit more frequently across all PRs.

The choice to not share the cache between non-test and test jobs in the
`ci.yml` workflow is because we want to maximize the number of jobs that
run in parallel, but to reuse the cache, we must ensure that only one
job is responsible for maintaining it. If we maximized cache reuse, we'd
run all jobs in sequence, but this would be slow. Instead, we break up
the workflow into non-test checks, and tests, and pick a baseline job in
both groups to handle maintaining the cache for that group. These groups
can then be run in parallel, and after the job that maintains the cache
is run, all remaining jobs in that group can be run in parallel.
@bitwalker bitwalker self-assigned this Sep 13, 2024
@bitwalker
Copy link
Contributor Author

Correction: looks like the workflow updates are actually run as part of the PR, so that's great, I can work out the kinks here before we merge

wrap_comments does not interact well with complex Markdown lists, of
which we have multiple. In general it is still an unstable feature and
not totally reliable, so disabling for now
@bitwalker
Copy link
Contributor Author

@bobbinth If you have a moment, and can skim this and review, I'd like to try and get this merged so I can test the interaction with our other PRs and in particular the caching behavior, and then I can get #319 merged as well, and get things unblocked for Denys and I. Not a big deal if you aren't available, but figured its worth a ping 😅

Copy link
Contributor

@bobbinth bobbinth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a pretty shallow review from me - but looks good! I left one minor comment inline.

Also, in other repos we use simple make rather than cargo-make, but if you prefer cargo-make, that's fine too.

rustfmt.toml Show resolved Hide resolved
@bitwalker
Copy link
Contributor Author

Thanks @bobbinth!

Also, in other repos we use simple make rather than cargo-make, but if you prefer cargo-make, that's fine too.

We're using cargo-make because it's portable, while make isn't, but it also has several nice features which automate some things in a way that is less fragile as the project evolves. For example, we don't need to explicitly install Cargo extensions we depend on as a pre-requisite, as cargo-make will automatically install any referenced extensions if they are not yet installed. There are a number of other nice-to-have features that will come in handy as the toolchain grows in complexity, but for now things are still relatively simple.

@bitwalker bitwalker merged commit dfc7f84 into next Sep 16, 2024
5 checks passed
@bitwalker bitwalker deleted the bitwalker/rust-toolchain branch September 16, 2024 06:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants