CI #870
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
permissions: | |
contents: read | |
on: | |
pull_request: | |
push: | |
branches: | |
- main | |
- dev | |
schedule: | |
- cron: '0 2 * * *' | |
workflow_dispatch: | |
env: | |
CARGO_INCREMENTAL: 0 | |
CARGO_NET_GIT_FETCH_WITH_CLI: true | |
CARGO_NET_RETRY: 10 | |
CARGO_TERM_COLOR: always | |
RUST_BACKTRACE: 1 | |
RUSTDOCFLAGS: -D warnings | |
RUSTFLAGS: -D warnings | |
RUSTUP_MAX_RETRIES: 10 | |
SEMIHOSTING_DENY_WARNINGS: 1 | |
# NB: sync with miri/msrv/tidy jobs' --features option and package.metadata.docs.rs.features field in Cargo.toml | |
TEST_FEATURES: alloc,stdio,fs,args,time | |
defaults: | |
run: | |
shell: bash --noprofile --norc -CeEuxo pipefail {0} | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} | |
cancel-in-progress: true | |
jobs: | |
check-external-types: | |
uses: taiki-e/github-actions/.github/workflows/check-external-types.yml@main | |
deny: | |
uses: taiki-e/github-actions/.github/workflows/deny.yml@main | |
docs: | |
uses: taiki-e/github-actions/.github/workflows/docs.yml@main | |
miri: | |
uses: taiki-e/github-actions/.github/workflows/miri.yml@main | |
with: | |
# We don't support x86_64, so use aarch64-unknown-linux-gnu instead. | |
target: aarch64-unknown-linux-gnu | |
# NB: sync with env.TEST_FEATURES | |
args: --features alloc,stdio,fs,args,time | |
msrv: | |
uses: taiki-e/github-actions/.github/workflows/msrv.yml@main | |
with: | |
event_name: ${{ github.event_name }} | |
# We don't support x86_64, so use aarch64-unknown-linux-gnu instead. | |
target: aarch64-unknown-linux-gnu | |
# NB: sync with env.TEST_FEATURES | |
args: --features alloc,stdio,fs,args,time | |
tidy: | |
uses: taiki-e/github-actions/.github/workflows/tidy.yml@main | |
permissions: | |
contents: read | |
pull-requests: write # for gh pr edit --add-assignee | |
repository-projects: read # for gh pr edit --add-assignee | |
secrets: inherit | |
with: | |
# We don't support x86_64, so use aarch64-unknown-linux-gnu instead. | |
target: aarch64-unknown-linux-gnu #,mips64-unknown-linux-muslabi64 # TODO: there is no tier 2 MIPS targets | |
# NB: sync with env.TEST_FEATURES | |
args: --features alloc,stdio,fs,args,time | |
# We have some platform-independent code, so test them. | |
test: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
# We don't support x86_64, so use aarch64-unknown-linux-gnu instead. | |
- rust: nightly | |
target: aarch64-unknown-linux-gnu | |
- rust: nightly | |
target: mips64-unknown-linux-gnuabi64 | |
runs-on: ubuntu-latest | |
timeout-minutes: 60 | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- uses: taiki-e/github-actions/install-rust@main | |
with: | |
toolchain: ${{ matrix.rust }} | |
- uses: taiki-e/install-action@cargo-hack | |
- uses: taiki-e/install-action@cargo-minimal-versions | |
- uses: taiki-e/install-action@cargo-careful | |
if: startsWith(matrix.rust, 'nightly') | |
- uses: taiki-e/setup-cross-toolchain-action@v1 | |
with: | |
target: ${{ matrix.target }} | |
- run: cargo test --workspace --features "${TEST_FEATURES}" --target "${{ matrix.target }}" ${DOCTEST_XCOMPILE:-} ${BUILD_STD:-} | |
- run: cargo test --workspace --features "${TEST_FEATURES}" --release --target "${{ matrix.target }}" ${DOCTEST_XCOMPILE:-} ${BUILD_STD:-} | |
- run: cargo careful test --workspace --features "${TEST_FEATURES}" --target "${{ matrix.target }}" ${DOCTEST_XCOMPILE:-} ${BUILD_STD:-} | |
if: startsWith(matrix.rust, 'nightly') | |
- run: cargo hack build --workspace --no-private --feature-powerset --depth 2 --optional-deps=portable-atomic --exclude-features panic-unwind,backtrace,trap-hlt,openocd-semihosting --target "${{ matrix.target }}" ${BUILD_STD:-} | |
- run: cargo minimal-versions build --workspace --no-private --detach-path-deps=skip-exact --features "${TEST_FEATURES}" --target "${{ matrix.target }}" ${BUILD_STD:-} | |
- run: cargo minimal-versions build --workspace --no-private --detach-path-deps=skip-exact --features "${TEST_FEATURES}" --target "${{ matrix.target }}" ${BUILD_STD:-} --direct | |
no-std: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- rust: '1.64' | |
- rust: stable | |
- rust: beta | |
- rust: nightly | |
# The behavior of semihosting somewhat depends on the behavior of the host system. | |
- rust: nightly | |
os: macos-latest | |
- rust: nightly | |
os: windows-latest | |
runs-on: ${{ matrix.os || 'ubuntu-latest' }} | |
timeout-minutes: 60 | |
steps: | |
- uses: taiki-e/checkout-action@v1 | |
- run: | | |
retry() { | |
for i in {1..10}; do | |
if "$@"; then | |
return 0 | |
else | |
sleep "${i}" | |
fi | |
done | |
"$@" | |
} | |
retry sudo apt-get -o Acquire::Retries=10 -qq update | |
retry sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends \ | |
qemu-system-arm \ | |
qemu-system-mips \ | |
qemu-system-misc | |
if [[ "${{ matrix.rust }}" == "1.64" ]]; then | |
# pre-17 LLD doesn't support big-endian arm | |
retry sudo apt-get -o Acquire::Retries=10 -o Dpkg::Use-Pty=0 install -y --no-install-recommends \ | |
binutils-arm-none-eabi | |
fi | |
# APT's qemu package doesn't provide firmware for riscv32 and mips: | |
# https://packages.ubuntu.com/en/jammy/all/qemu-system-data/filelist | |
OPENSBI_VERSION=1.5.1 # https://github.com/riscv-software-src/opensbi/releases | |
retry curl --proto '=https' --tlsv1.2 -fsSL --retry 10 --retry-connrefused "https://github.com/riscv-software-src/opensbi/releases/download/v${OPENSBI_VERSION}/opensbi-${OPENSBI_VERSION}-rv-bin.tar.xz" \ | |
| tar xJf - | |
sudo mv -- "opensbi-${OPENSBI_VERSION}-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.bin" /usr/share/qemu/opensbi-riscv32-generic-fw_dynamic.bin | |
sudo mv -- "opensbi-${OPENSBI_VERSION}-rv-bin/share/opensbi/ilp32/generic/firmware/fw_dynamic.elf" /usr/share/qemu/opensbi-riscv32-generic-fw_dynamic.elf | |
rm -rf -- "opensbi-${OPENSBI_VERSION}-rv-bin" | |
retry git clone --depth 1 --filter=tree:0 --no-checkout https://github.com/qemu/qemu.git | |
cd -- qemu | |
git sparse-checkout init | |
printf '!/*\n' >>.git/info/sparse-checkout | |
printf '/pc-bios/\n' >>.git/info/sparse-checkout | |
git checkout | |
sudo mv -- pc-bios/{efi-pcnet.rom,vgabios-cirrus.bin} /usr/share/qemu/ | |
cd -- .. | |
rm -rf -- qemu | |
# https://github.com/taiki-e/dockerfiles/pkgs/container/qemu-user | |
retry docker create --name qemu-user ghcr.io/taiki-e/qemu-user:8.1 # TODO: "qemu-armeb: Error mapping file: Operation not permitted" error in 8.2-9.1 | |
mkdir -p -- qemu-user | |
docker cp -- qemu-user:/usr/bin qemu-user/bin | |
docker rm -f -- qemu-user >/dev/null | |
sudo mv -- qemu-user/bin/qemu-* /usr/bin/ | |
rm -rf -- ./qemu-user | |
qemu-system-arm --version | |
qemu-arm --version | |
if: startsWith(matrix.os, 'ubuntu') || matrix.os == '' | |
- run: | | |
brew install qemu | |
qemu-system-arm --version | |
if: startsWith(matrix.os, 'macos') | |
- run: | | |
C:/msys64/usr/bin/pacman -S --noconfirm mingw-w64-ucrt-x86_64-qemu | |
printf '%s\n' 'C:\msys64\ucrt64\bin' >>"${GITHUB_PATH}" | |
C:/msys64/ucrt64/bin/qemu-system-arm --version | |
if: startsWith(matrix.os, 'windows') | |
- uses: taiki-e/github-actions/install-rust@main | |
with: | |
toolchain: ${{ matrix.rust }} | |
- uses: taiki-e/install-action@espup | |
if: startsWith(matrix.rust, 'nightly') && (startsWith(matrix.os, 'ubuntu') || matrix.os == '') | |
- run: espup install --targets esp32 | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
if: startsWith(matrix.rust, 'nightly') && (startsWith(matrix.os, 'ubuntu') || matrix.os == '') | |
- run: tools/no-std.sh | |
- run: TEST_RUNNER=qemu-user tools/no-std.sh | |
if: startsWith(matrix.os, 'ubuntu') || matrix.os == '' | |
- run: cargo +esp build --target xtensa-esp32-none-elf -Z build-std=core,alloc --features "${TEST_FEATURES},openocd-semihosting" | |
if: startsWith(matrix.rust, 'nightly') && (startsWith(matrix.os, 'ubuntu') || matrix.os == '') |