2022-04-18 03:09:48 +08:00
name : Setup Rust Toolchain for GitHub CI
description : |
2022-04-21 04:24:25 +08:00
Setup specific Rust versions with caching pre-configured.
It provides problem matchers for cargo and rustfmt issues.
2022-04-18 03:09:48 +08:00
branding :
icon : "play"
color : "gray-dark"
# Add option to install directly from rust-toolchain file
# Blocked on rustup support: https://github.com/rust-lang/rustup/issues/2686
#
# The action is heavily inspired by https://github.com/dtolnay/rust-toolchain
inputs :
toolchain :
2024-09-22 21:28:43 +08:00
description : "Comma-separated list of Rust toolchain specifications. Last version becomes the default. -- see https://rust-lang.github.io/rustup/concepts/toolchains.html#toolchain-specification"
2022-04-18 03:09:48 +08:00
required : false
target :
description : "Target triple to install for this toolchain"
required : false
components :
description : "Comma-separated list of components to be additionally installed"
required : false
2022-07-31 02:01:03 +08:00
cache :
description : "Automatically configure Rust cache"
required : false
default : "true"
2024-01-13 01:41:01 +08:00
cache-workspaces :
description : "Paths to multiple Cargo workspaces and their target directories, separated by newlines."
required : false
2024-08-18 00:34:59 +08:00
cache-directories :
description : "Additional non workspace directories to be cached, separated by newlines."
required : false
2024-05-25 16:26:47 +08:00
cache-on-failure :
description : "Also cache on workflow failures"
2024-06-08 18:33:50 +08:00
default : "true"
2024-05-25 16:26:47 +08:00
required : false
2024-07-12 15:28:17 +08:00
cache-key :
description : "An additional cache key that is added alongside the automatic `job`-based cache key and can be used to further differentiate jobs."
required : false
2023-11-30 18:42:45 +08:00
matcher :
description : "Enable the Rust problem matcher"
required : false
default : "true"
2023-05-19 18:00:54 +08:00
rustflags :
description : "set RUSTFLAGS environment variable, set to empty string to avoid overwriting build.rustflags"
2023-05-19 18:02:38 +08:00
required : false
2023-05-19 18:00:54 +08:00
default : "-D warnings"
2024-09-22 22:04:02 +08:00
override :
description : "Setup the last installed toolchain as the default via `rustup override`"
required : false
default : "true"
2022-04-18 03:09:48 +08:00
outputs :
rustc-version :
description : "Version as reported by `rustc --version`"
value : ${{steps.versions.outputs.rustc-version}}
cargo-version :
description : "Version as reported by `cargo --version`"
value : ${{steps.versions.outputs.cargo-version}}
rustup-version :
description : "Version as reported by `rustup --version`"
value : ${{steps.versions.outputs.rustup-version}}
2022-07-20 03:00:36 +08:00
cachekey :
description : A short hash of the rustc version, appropriate for use as a cache key. "20220627a831"
value : ${{steps.versions.outputs.cachekey}}
2022-04-18 03:09:48 +08:00
runs :
using : composite
steps :
2023-02-14 06:28:57 +08:00
# The later code uses "newer" bash features, which are not available in the ancient bash 3 (from 2014) of macOS
- name : Unbork mac
if : runner.os == 'macOS'
run : |
brew install bash
shell : bash
2022-04-18 03:09:48 +08:00
- id : flags
2024-01-11 11:01:31 +08:00
env :
targets : ${{inputs.target}}
components : ${{inputs.components}}
shell : bash
2022-04-18 03:09:48 +08:00
run : |
: construct rustup command line
2022-10-15 21:48:55 +08:00
echo "targets=$(for t in ${targets//,/ }; do echo -n ' --target' $t; done)" >> $GITHUB_OUTPUT
echo "components=$(for c in ${components//,/ }; do echo -n ' --component' $c; done)" >> $GITHUB_OUTPUT
2024-09-22 21:28:43 +08:00
echo "downgrade=${{contains(inputs.toolchain, 'nightly') && inputs.components && ' --allow-downgrade' || ''}}" >> $GITHUB_OUTPUT
2024-01-11 11:01:31 +08:00
# The environment variables always need to be set before the caching action
- name : Setting Environment Variables
2022-04-18 03:09:48 +08:00
env :
2024-01-11 11:01:31 +08:00
NEW_RUSTFLAGS : ${{inputs.rustflags}}
2022-04-18 03:09:48 +08:00
shell : bash
2022-07-30 04:28:32 +08:00
run : |
2023-02-14 03:44:18 +08:00
if [[ ! -v CARGO_INCREMENTAL ]]; then
echo "CARGO_INCREMENTAL=0" >> $GITHUB_ENV
fi
if [[ ! -v CARGO_PROFILE_DEV_DEBUG ]]; then
echo "CARGO_PROFILE_DEV_DEBUG=0" >> $GITHUB_ENV
fi
if [[ ! -v CARGO_TERM_COLOR ]]; then
echo "CARGO_TERM_COLOR=always" >> $GITHUB_ENV
fi
if [[ ! -v RUST_BACKTRACE ]]; then
echo "RUST_BACKTRACE=short" >> $GITHUB_ENV
fi
2023-05-30 03:38:39 +08:00
if [[ ( ! -v RUSTFLAGS ) && $NEW_RUSTFLAGS != "" ]]; then
2023-05-19 18:10:05 +08:00
echo "RUSTFLAGS=$NEW_RUSTFLAGS" >> $GITHUB_ENV
2023-02-14 03:44:18 +08:00
fi
2022-08-14 23:09:22 +08:00
# Enable faster sparse index on nightly
2023-02-01 06:15:57 +08:00
# The value is ignored on stable and causes no problems
2022-08-14 23:09:22 +08:00
# https://internals.rust-lang.org/t/call-for-testing-cargo-sparse-registry/16862
2023-02-14 03:44:18 +08:00
if [[ ! -v CARGO_UNSTABLE_SPARSE_REGISTRY ]]; then
echo "CARGO_UNSTABLE_SPARSE_REGISTRY=true" >> $GITHUB_ENV
fi
2023-02-22 05:02:41 +08:00
if [[ ! -v CARGO_REGISTRIES_CRATES_IO_PROTOCOL ]]; then
echo "CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse" >> $GITHUB_ENV
fi
2024-01-11 11:01:31 +08:00
- name : Install Rust Problem Matcher
2023-11-30 18:42:45 +08:00
if : inputs.matcher == 'true'
2022-07-30 04:28:32 +08:00
shell : bash
2024-01-11 11:01:31 +08:00
run : echo "::add-matcher::${{ github.action_path }}/rust.json"
2022-07-30 04:28:32 +08:00
2022-07-20 02:48:19 +08:00
- name : Install rustup, if needed
2024-01-11 11:01:31 +08:00
if : runner.os != 'Windows'
shell : bash
2022-07-20 02:48:19 +08:00
run : |
if ! command -v rustup &> /dev/null ; then
curl --proto '=https' --tlsv1.2 --retry 10 --retry-connrefused -fsSL "https://sh.rustup.rs" | sh -s -- --default-toolchain none -y
2022-09-15 16:56:37 +08:00
echo "${CARGO_HOME:-$HOME/.cargo}/bin" >> $GITHUB_PATH
2022-07-20 02:48:19 +08:00
fi
2024-01-11 11:01:31 +08:00
2023-10-31 20:58:53 +08:00
- name : rustup toolchain install ${{inputs.toolchain || 'stable'}}
2024-01-11 11:01:31 +08:00
env :
toolchain : ${{inputs.toolchain}}
targets : ${{inputs.target}}
components : ${{inputs.components}}
2024-09-22 22:04:02 +08:00
override : ${{inputs.override}}
2024-01-11 11:01:31 +08:00
shell : bash
2022-04-18 03:09:48 +08:00
run : |
2023-10-31 20:58:53 +08:00
if [[ -z "$toolchain" && ( -f "rust-toolchain" || -f "rust-toolchain.toml" ) ]]
2022-07-22 04:35:59 +08:00
then
# Install the toolchain as specified in the file
2024-09-20 06:39:06 +08:00
# rustup show is the old way that implicitly installed a toolchain
# rustup toolchain install is the new explicit way
# https://github.com/rust-lang/rustup/issues/3635#issuecomment-2343511297
rustup show active-toolchain || rustup toolchain install
2023-05-20 22:38:07 +08:00
if [[ -n $components ]]; then
rustup component add ${components//,/ }
fi
if [[ -n $targets ]]; then
rustup target add ${targets//,/ }
fi
2022-07-22 04:35:59 +08:00
else
2023-10-31 20:58:53 +08:00
if [[ -z "$toolchain" ]]
then
toolchain=stable
fi
2024-09-22 21:28:43 +08:00
rustup toolchain install ${toolchain//,/ } ${{steps.flags.outputs.targets}}${{steps.flags.outputs.components}} --profile minimal${{steps.flags.outputs.downgrade}} --no-self-update
# Take the last element from the list
2024-09-22 22:04:02 +08:00
if [[ "$override" == "true" ]]
then
rustup override set ${toolchain//*,/ }
fi
2022-07-22 04:35:59 +08:00
fi
2022-07-20 03:00:36 +08:00
2024-01-11 11:01:31 +08:00
- id : versions
name : Print installed versions
shell : bash
2022-04-18 03:09:48 +08:00
run : |
2022-10-15 21:48:55 +08:00
echo "rustc-version=$(rustc --version)" >> $GITHUB_OUTPUT
2022-07-22 04:35:59 +08:00
rustc --version --verbose
2022-10-15 21:48:55 +08:00
echo "cargo-version=$(cargo --version)" >> $GITHUB_OUTPUT
2022-07-22 04:35:59 +08:00
cargo --version --verbose
2022-10-15 21:48:55 +08:00
echo "rustup-version=$(rustup --version)" >> $GITHUB_OUTPUT
2022-07-22 04:35:59 +08:00
rustup --version
2022-07-20 03:00:36 +08:00
2022-07-22 04:35:59 +08:00
DATE=$(rustc --version --verbose | sed -ne 's/^commit-date : \(20[0-9][0-9]\)-\([01][0-9]\)-\([0-3][0-9]\)$/\1\2\3/p')
HASH=$(rustc --version --verbose | sed -ne 's/^commit-hash : //p')
2022-10-15 21:48:55 +08:00
echo "cachekey=$(echo $DATE$HASH | head -c12)" >> $GITHUB_OUTPUT
2022-04-18 03:09:48 +08:00
2024-01-11 11:01:31 +08:00
- name : Downgrade registry access protocol when needed
shell : bash
2023-02-14 04:00:11 +08:00
run : |
2023-02-22 05:02:41 +08:00
# Not all versions support setting CARGO_REGISTRIES_CRATES_IO_PROTOCOL
# On versions 1.66, 1.67, and 1.68.0-nightly the value "sparse" is still unstable.
2023-02-16 01:48:31 +08:00
# https://github.com/dtolnay/rust-toolchain/pull/69#discussion_r1107268108
2023-02-22 05:02:41 +08:00
# If we detect an incompatible value, set it to "git" which is always supported.
if [[ "${{steps.versions.outputs.rustc-version}}" =~ ^rustc\ (1\.6[67]\.|1\.68\.0-nightly) && "${CARGO_REGISTRIES_CRATES_IO_PROTOCOL}" == "sparse" ]]; then
echo "Downgrade cargo registry protocol to git"
echo "CARGO_REGISTRIES_CRATES_IO_PROTOCOL=git" >> $GITHUB_ENV
2023-02-14 04:00:11 +08:00
fi
2024-01-11 11:01:31 +08:00
- name : Setup Rust Caching
2022-07-31 02:01:03 +08:00
if : inputs.cache == 'true'
2022-07-20 03:01:40 +08:00
uses : Swatinem/rust-cache@v2
2024-01-13 01:41:01 +08:00
with :
workspaces : ${{inputs.cache-workspaces}}
2024-08-18 00:34:59 +08:00
cache-directories : ${{inputs.cache-directories}}
2024-05-25 16:26:47 +08:00
cache-on-failure : ${{inputs.cache-on-failure}}
2024-07-12 15:28:17 +08:00
key : ${{inputs.cache-key}}