rtic/.github/workflows/build.yml
Román Cárdenas Rodríguez 4542367fc9 Configure CI for new backends
2025-03-12 19:41:40 +00:00

903 lines
26 KiB
YAML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: Build
on:
merge_group:
pull_request:
push:
branches:
- master
env:
CARGO_TERM_COLOR: always
DEV_VERSION: 2
STABLE_VERSION: 2
OLDSTABLE_VERSION: 1
OLDOLDSTABLE_VERSION: 0.5
OLDOLDOLDSTABLE_VERSION: 0.4
QEMU_VERSION: 8.2.0
QEMU_URL: https://download.qemu.org/qemu-8.2.0.tar.xz
QEMU_ESP: qemu_esp
QEMU_ESP_URL: https://github.com/espressif/qemu/releases/download/esp-develop-8.2.0-20240122/qemu-riscv32-softmmu-esp_develop_8.2.0_20240122-x86_64-linux-gnu.tar.xz
jobs:
# Run cargo xtask format-check
formatcheck:
name: cargo fmt
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- name: cargo xtask fmt
run: cargo xtask --verbose fmt -c
# Compilation check (lm3s6965)
checklm3s6965:
name: check (lm3s6965)
runs-on: ubuntu-22.04
strategy:
matrix:
backend:
- thumbv7
- thumbv6
- thumbv8-base
- thumbv8-main
toolchain:
- stable
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Rust ${{ matrix.toolchain }}
run: |
rustup override set ${{ matrix.toolchain }}
- name: Configure Rust target (v6, v7, v8.b v8.m)
run: |
rustup target add thumbv7m-none-eabi
rustup target add thumbv6m-none-eabi
rustup target add thumbv8m.base-none-eabi
rustup target add thumbv8m.main-none-eabi
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- run: cargo xtask --deny-warnings --platform lm3s6965 --backend ${{ matrix.backend }} check
# Compilation check (hifive1) TODO
# checkhifive1:
# Clippy (lm3s6965)
clippylm3s6965:
name: clippy (lm3s6965)
runs-on: ubuntu-22.04
strategy:
matrix:
backend:
- thumbv7
- thumbv6
- thumbv8-base
- thumbv8-main
toolchain:
- stable
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Rust ${{ matrix.toolchain }}
run: |
rustup override set ${{ matrix.toolchain }}
- name: Configure Rust target (v6, v7, v8.b v8.m)
run: |
rustup target add thumbv7m-none-eabi
rustup target add thumbv6m-none-eabi
rustup target add thumbv8m.base-none-eabi
rustup target add thumbv8m.main-none-eabi
- name: Add Rust component clippy
run: rustup component add clippy
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- run: cargo xtask --deny-warnings --platform lm3s6965 --backend ${{ matrix.backend }} clippy
# Clippy (hifive1) TODO
# clippyhifive1:
# Platform lm3s6965: verify all examples, checks
checkexampleslm3s6965:
name: check examples (lm3s6965)
runs-on: ubuntu-22.04
strategy:
matrix:
backend:
- thumbv7
- thumbv6
- thumbv8-base
- thumbv8-main
toolchain:
- stable
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Rust ${{ matrix.toolchain }}
run: |
rustup override set ${{ matrix.toolchain }}
- name: Configure Rust target (v6, v7, v8.b v8.m)
run: |
rustup target add thumbv7m-none-eabi
rustup target add thumbv6m-none-eabi
rustup target add thumbv8m.base-none-eabi
rustup target add thumbv8m.main-none-eabi
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- name: Check the examples
if: ${{ matrix.backend == 'thumbv8-base' }}
run: cargo xtask --platform lm3s6965 --backend ${{ matrix.backend }} --exampleexclude pool example-check
- name: Check the examples
if: ${{ matrix.backend != 'thumbv8-base' }}
run: cargo xtask --platform lm3s6965 --backend ${{ matrix.backend }} example-check
# Platform hifive1: verify all examples, checks
checkexampleshifive1:
name: check examples (hifive1)
runs-on: ubuntu-22.04
strategy:
matrix:
backend:
- riscv32-imc-clint
- riscv32-imc-mecall
toolchain:
- stable
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Rust ${{ matrix.toolchain }}
run: |
rustup override set ${{ matrix.toolchain }}
- name: Configure Rust target
run: |
rustup target add riscv32imc-unknown-none-elf
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- name: Check the examples
run: cargo xtask --platform hifive1 --backend ${{ matrix.backend }} example-check
# Platform esp32c3: verify all examples, checks
checkexamplesesp32c3:
name: check examples (esp32c3)
runs-on: ubuntu-22.04
strategy:
matrix:
backend:
- riscv-esp32-c3
toolchain:
- nightly
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Rust ${{ matrix.toolchain }}
run: |
rustup toolchain install nightly-2023-11-14 --component rust-src --target riscv32imc-unknown-none-elf
- name: Configure Rust target
run: |
rustup target add riscv32imc-unknown-none-elf
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- name: Check the examples
run: cargo xtask --platform esp32-c3 --backend ${{ matrix.backend }} example-check
buildqemu:
name: Get modern QEMU, build and store
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Cache QEMU build
id: cache-qemu
uses: actions/cache@v4
with:
path: qemu-${{ env.QEMU_VERSION }}/build
key: ${{ runner.OS }}-qemu-${{ env.QEMU_VERSION }}
restore-keys: |
${{ runner.OS }}-qemu-${{ env.QEMU_VERSION }}
${{ runner.OS }}-qemu-
- name: Install QEMU to get dependencies
run: |
sudo apt update
sudo apt install -y qemu-system-arm qemu-system-riscv32
sudo apt install -y git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build
- if: ${{ steps.cache-qemu.outputs.cache-hit != 'true' }}
name: Download QEMU
run: wget "${{ env.QEMU_URL }}"
- if: ${{ steps.cache-qemu.outputs.cache-hit != 'true' }}
name: Extract QEMU
run: tar xvJf qemu-${{ env.QEMU_VERSION }}.tar.xz
- if: ${{ steps.cache-qemu.outputs.cache-hit != 'true' }}
name: Configure QEMU
run: |
cd qemu-${{ env.QEMU_VERSION }}
./configure --target-list=arm-softmmu,riscv32-softmmu
- if: ${{ steps.cache-qemu.outputs.cache-hit != 'true' }}
name: Build QEMU
run: |
cd qemu-${{ env.QEMU_VERSION }}
ninja -C build
- name: Download ESP32 QEMU
run: wget "${{ env.QEMU_ESP_URL }}" --output-document=${{ env.QEMU_ESP}}.tar.xz
- name: Extract ESP32 QEMU
run: |
mkdir -p qemu-${{ env.QEMU_VERSION }}/build/esp32
tar --strip-components=1 -xvJf ${{ env.QEMU_ESP }}.tar.xz -C qemu-${{ env.QEMU_VERSION }}/build/esp32 qemu
- name: Archive QEMU build
run: |
cd qemu-${{ env.QEMU_VERSION }}/build
tar -cf $GITHUB_WORKSPACE/qemu.tar *
- name: Store QEMU build
uses: actions/upload-artifact@v4
with:
name: qemu
path: qemu.tar
# Platform lm3s6965: verify the example output with run-pass tests
testexampleslm3s6965:
name: QEMU run (lm3s6965)
needs: buildqemu
runs-on: ubuntu-22.04
strategy:
matrix:
backend:
- thumbv7
- thumbv6
toolchain:
- stable
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Rust ${{ matrix.toolchain }}
run: |
rustup set profile minimal
rustup override set ${{ matrix.toolchain }}
- name: Configure Rust target (v6, v7)
run: |
rustup target add thumbv7m-none-eabi
rustup target add thumbv6m-none-eabi
- name: Add Rust component llvm-tools-preview
run: rustup component add llvm-tools-preview
# Use precompiled binutils
- name: Install cargo-binutils
uses: taiki-e/install-action@v2
with:
tool: cargo-binutils
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- name: Install QEMU to get dependencies
run: |
sudo apt update
sudo apt install -y qemu-system-arm
- name: Download built QEMU
uses: actions/download-artifact@v4
with:
name: qemu
- name: Extract QEMU into local path
run: tar -xf qemu.tar -C /usr/local/bin
- name: Check which QEMU is used
run: |
which qemu-system-arm
which qemu-system-riscv32
- name: Run-pass tests
run: cargo xtask --deny-warnings --platform lm3s6965 --backend ${{ matrix.backend }} qemu
# Platform hifive1: verify the example output with run-pass tests
testexampleshifive1:
name: QEMU run (hifive1)
needs: buildqemu
runs-on: ubuntu-22.04
strategy:
matrix:
backend:
- riscv32-imc-clint
- riscv32-imc-mecall
toolchain:
- stable
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Rust ${{ matrix.toolchain }}
run: |
rustup set profile minimal
rustup override set ${{ matrix.toolchain }}
- name: Configure Rust target
run: |
rustup target add riscv32imc-unknown-none-elf
- name: Add Rust component llvm-tools-preview
run: rustup component add llvm-tools-preview
# Use precompiled binutils
- name: Install cargo-binutils
uses: taiki-e/install-action@v2
with:
tool: cargo-binutils
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- name: Install QEMU to get dependencies
run: |
sudo apt update
sudo apt install -y qemu-system-riscv32
- name: Download built QEMU
uses: actions/download-artifact@v4
with:
name: qemu
- name: Extract QEMU into local path
run: tar -xf qemu.tar -C /usr/local/bin
- name: Check which QEMU is used
run: |
which qemu-system-arm
which qemu-system-riscv32
- name: Run-pass tests
run: cargo xtask --deny-warnings --platform hifive1 --backend ${{ matrix.backend }} qemu
# Platform esp32c3: verify the example output with run-pass tests
testexamplesesp32c3:
name: QEMU run (esp32c3)
needs: buildqemu
runs-on: ubuntu-22.04
strategy:
matrix:
toolchain:
- stable
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Rust ${{ matrix.toolchain }}
run: |
rustup set profile minimal
rustup override set ${{ matrix.toolchain }}
- name: Configure Rust target
run: |
rustup target add riscv32imac-unknown-none-elf
rustup target add riscv32imc-unknown-none-elf
- name: Add Rust component llvm-tools-preview
run: rustup component add llvm-tools-preview
- name: Install libudev espflash dependency
run: |
sudo apt update
sudo apt install -y libudev-dev
# Use precompiled binutils
- name: Install cargo-binutils
uses: taiki-e/install-action@v2
with:
tool: cargo-binutils
# Use precompiled if possible
- name: Install espflash
run: cargo install espflash --version 3.1.0 --force
# uses: taiki-e/install-action@v2
# with:
# tool: espflash
- name: Install esptool.py
run: pip install esptool
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- name: Install QEMU to get dependencies
run: |
sudo apt update
sudo apt install -y qemu-system-riscv32
- name: Download built QEMU
uses: actions/download-artifact@v4
with:
name: qemu
- name: Extract ESP32 QEMU into local path
run: sudo tar --strip-components=1 -xf qemu.tar -C /usr/local/ esp32/
- name: Check which QEMU is used
run: |
which qemu-system-riscv32
- name: Run-pass tests
run: cargo xtask -v --platform esp32-c3 qemu
# Run test suite
tests:
name: tests
runs-on: ubuntu-22.04
strategy:
fail-fast: false
matrix:
backend:
- thumbv7
- thumbv6
- thumbv8-base
- thumbv8-main
package:
- rtic
- rtic-common
- rtic-macros
- rtic-monotonics
- rtic-sync
- rtic-time
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Cache Dependencies
uses: Swatinem/rust-cache@v2
- name: Configure Rust target (v6, v7, v8.b v8.m)
run: |
rustup target add thumbv7m-none-eabi
rustup target add thumbv6m-none-eabi
rustup target add thumbv8m.base-none-eabi
rustup target add thumbv8m.main-none-eabi
- name: Run cargo test
run: cargo xtask --deny-warnings --backend ${{ matrix.backend }} test ${{ matrix.package }}
# Build documentation, check links
docs:
name: build docs
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install lychee
uses: taiki-e/install-action@v2
with:
tool: lychee
- name: Build docs
run: cargo xtask doc
- name: Check links
run: |
td=$(mktemp -d)
cp -r target/doc $td/api
echo rtic
lychee --offline --format detailed $td/api/rtic/
echo rtic_common
lychee --offline --format detailed $td/api/rtic_common/
echo rtic_macros
lychee --offline --format detailed $td/api/rtic_macros/
echo rtic_monotonics
lychee --offline --format detailed $td/api/rtic_monotonics/
echo rtic_sync
lychee --offline --format detailed $td/api/rtic_sync/
echo rtic_time
lychee --offline --format detailed $td/api/rtic_time/
- name: Archive the API docs
run: |
cp -r target/doc apidocs
tar -cf apidocs.tar apidocs
- name: Store the API docs
uses: actions/upload-artifact@v4
with:
name: apidocs
path: apidocs.tar
# Build the books
mdbook:
name: build mdbook
needs: docs
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install lychee
uses: taiki-e/install-action@v2
with:
tool: lychee
- name: Install mdbook
uses: taiki-e/install-action@v2
with:
tool: mdbook
- name: Install mdbook-mermaid
uses: taiki-e/install-action@v2
with:
tool: mdbook-mermaid
- name: Build book in English
run: cargo xtask book
- name: Download built API docs
uses: actions/download-artifact@v4
with:
name: apidocs
- name: Extract the API docs
run: tar -xf apidocs.tar
- name: Check links
run: |
td=$(mktemp -d)
mkdir $td/book
cp -r book/en/book $td/book/en
cp LICENSE-* $td/book/en
cp -r apidocs/ $td/api
lychee --offline --format detailed $td/book/en/
mv $td bookroot
- name: Archive the book + API docs
run: |
tar -cf book.tar bookroot
- name: Store the Book + API docs
uses: actions/upload-artifact@v4
with:
name: book
path: book.tar
mdbookold:
name: build docs and mdbook for older releases
needs: pushtostablebranch
runs-on: ubuntu-22.04
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install mdbook
uses: taiki-e/install-action@v2
with:
tool: mdbook
- name: Install mdbook-mermaid
uses: taiki-e/install-action@v2
with:
tool: mdbook-mermaid
- name: Remove cargo-config
run: rm -f .cargo/config
- name: Prepare output folder
run: mkdir -p mdbookold
- name: Fetch and build books for older versions
run: |
# The latest stable must be the first element in the array
vers=( "${{ env.STABLE_VERSION }}" "${{ env.OLDSTABLE_VERSION }}" )
langs=( en )
root=$(pwd)
webroot=$(pwd)/mdbookold
for ver in ${vers[@]}; do
mkdir -p src/$ver
src=$root/src/$ver
curl -L https://github.com/rtic-rs/rtic/archive/release/v${ver}.tar.gz | tar xz --strip-components 1 -C $src
pushd $src
rm -f .cargo/config
# Version 1 and below uses cargo doc directly
if [[ $ver -gt 1 ]]
then
# Version 2 and above
cargo xtask doc
else
cargo doc || cargo doc --features timer-queue
fi
mkdir -p $webroot/$ver/book
cp -r target/doc $webroot/$ver/api
sed 's|URL|rtic/index.html|g' $root/redirect.html > $webroot/$ver/api/index.html
popd
for lang in ${langs[@]}; do
cargo xtask book build $src/book/$lang
cp -r $src/book/$lang/book $webroot/$ver/book/$lang
cp LICENSE-* $webroot/$ver/book/$lang/
done
# using master branch redirect file
sed 's|URL|book/en|g' $root/redirect.html > $webroot/$ver/index.html
rm -rf $src
done
- name: Archive the old books
run: |
tar -cf mdbookold.tar mdbookold
- name: Store the old API docs
uses: actions/upload-artifact@v4
with:
name: mdbookold
path: mdbookold.tar
parseversion:
name: Parse the master branch RTIC version
runs-on: ubuntu-22.04
outputs:
branch: ${{ steps.parseversion.outputs.branch }}
versionmajor: ${{ steps.parseversion.outputs.versionmajor }}
version: ${{ steps.parseversion.outputs.version }}
steps:
- uses: actions/checkout@v4
- name: Get crate version and print output branch release/vX
id: parseversion
# Parse metadata for version number, extract the Semver Major
run: |
VERSION=$(cargo metadata --format-version 1 --no-deps --offline | jq -r '.packages[] | select(.name =="rtic") | .version')
VERSIONMAJOR=${VERSION%.*.*}
echo "branch=release/v$VERSIONMAJOR" >> "$GITHUB_OUTPUT"
echo "versionmajor=$VERSIONMAJOR" >> "$GITHUB_OUTPUT"
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
# Update stable branch
#
# This is only valid when current stable resides in
# master branch.
# As master moves on to development, the work on the
# stable version will happen in release/v"stable_version".
# Thus, no need to push changes
#
# This needs to run before book is built, as bookbuilding fetches from the branch
pushtostablebranch:
name: Also push branch into release/vX when pushing to master
runs-on: ubuntu-22.04
needs:
- ci-success
- parseversion
env:
branch: ${{ needs.parseversion.outputs.branch }}
versionmajor: ${{ needs.parseversion.outputs.versionmajor }}
version: ${{ needs.parseversion.outputs.version }}
# Only run this when pushing to master branch
if: github.ref == 'refs/heads/master'
steps:
- uses: actions/checkout@v4
- name: Push to stable release branch if master contains stable version
if: ${{ env.versionmajor == env.STABLE_VERSION }}
run: |
# Get the full history of the branch leading up to current commit
git fetch --unshallow
# Make git aware of the release branch
git fetch -u origin ${{ env.branch }}
# Push the full history into the release branch
git push -u origin master:${{ env.branch }}
- name: Else case, master did not contain the stable version
if: ${{ env.versionmajor != env.STABLE_VERSION }}
run: echo "Master branch contains a development release, no git push performed"
# Only runs when pushing to master branch
# If all tests pass, then deploy stage is run
deploy:
name: deploy
runs-on: ubuntu-22.04
needs:
- pushtostablebranch
- docs
- mdbookold
- mdbook
# Only run this when pushing to master branch
if: github.ref == 'refs/heads/master'
steps:
- uses: actions/checkout@v4
- name: Install lychee
uses: taiki-e/install-action@v2
with:
tool: lychee
- name: Install mdbook-mermaid
uses: taiki-e/install-action@v2
with:
tool: mdbook-mermaid
- name: mdBook Action
uses: peaceiris/actions-mdbook@v2
with:
mdbook-version: 'latest'
- name: Remove cargo-config
run: rm -f .cargo/config
- name: Download built dev-ver book and API docs
uses: actions/download-artifact@v4
with:
name: book
- name: Extract the dev-version book and API docs
run: |
tar -xf book.tar
- name: Download built old versions of books and API docs
uses: actions/download-artifact@v4
with:
name: mdbookold
- name: Extract the old version books and API docs
run: |
tar -xf mdbookold.tar
- name: Prepare books
shell: 'script --return --quiet --command "bash {0}"'
run: |
langs=( en )
devver=( dev )
# The latest stable must be the first element in the array
vers=( "${{ env.STABLE_VERSION }}" "${{ env.OLDSTABLE_VERSION }}" )
# All releases start with "v"
# followed by MAJOR.MINOR.PATCH, see semver.org
# Store first in array as stable
stable=${vers}
crateversion=${{ env.versionmajor }}
echo "Latest stable version: $stable"
echo "Current crate version: $crateversion"
# Create directories
td=$(mktemp -d)
mkdir -p $td/$devver/
cp -r bookroot/* $td/$devver/
# Redirect rtic.rs/meeting/index.html to hackmd
mkdir $td/meeting
sed "s|URL|https://hackmd.io/c_mFUZL-Q2C6614MlrrxOg|g" redirect.html > $td/meeting/index.html
sed -i "s|Page Redirection|RTIC Meeting|" $td/meeting/index.html
sed -i "s|If you|Redirecting to RTIC HackMD. If you|" $td/meeting/index.html
# Redirect the main site to the stable release
sed "s|URL|$stable|g" redirect.html > $td/index.html
# Create the redirects for dev-version
# If the current stable and the version being built differ,
# then there is a dev-version and the links should point to it.
if [[ "$stable" != "$crateversion" ]];
then
sed 's|URL|rtic/index.html|g' redirect.html > $td/$devver/api/index.html
sed 's|URL|book/en|g' redirect.html > $td/$devver/index.html
else
# If the current stable and the "dev" version in master branch
# share the same major version, redirect dev/ to stable book
# This makes sense, preferable to have doc/book updates going live directly to rtic.rs
sed 's|URL|rtic.rs/$stable/api/rtic|g' redirect.html > $td/$devver/api/index.html
sed 's|URL|rtic.rs/$stable|g' redirect.html > $td/$devver/index.html
fi
# Package older versions, including stable
# Copy the stable book to the stable alias
cp -r mdbookold/${{ env.STABLE_VERSION }} $td/stable
# Copy the stable book to the webroot
cp -r mdbookold/${{ env.STABLE_VERSION }} $td/
# Copy the old stable book to the webroot
cp -r mdbookold/${{ env.OLDSTABLE_VERSION }} $td/
# Forward CNAME file
cp CNAME $td/
mv $td/ bookstodeploy
- name: Archive the webroot
run: |
tar -cf bookstodeploy.tar bookstodeploy
- name: Store the books
uses: actions/upload-artifact@v4
with:
name: bookstodeploy
path: bookstodeploy.tar
ghapages:
name: Publish rtic.rs
runs-on: ubuntu-22.04
needs:
- deploy
steps:
- name: Download books
uses: actions/download-artifact@v4
with:
name: bookstodeploy
- name: Extract the books
run: |
tar -xf bookstodeploy.tar
- name: Deploy to GH-pages
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./bookstodeploy
force_orphan: true
# ALL THE PREVIOUS JOBS NEEDS TO BE ADDED TO THE `needs` SECTION OF THIS JOB!
ci-success:
name: ci
if: github.event_name == 'push' && success()
needs:
- formatcheck
- checklm3s6965
# - checkhifive1 # TODO
- clippylm3s6965
# - clippyhifive1 # TODO
- checkexampleslm3s6965
- checkexampleshifive1
- checkexamplesesp32c3
- testexampleslm3s6965
- testexampleshifive1
- testexamplesesp32c3
- tests
- docs
- mdbook
runs-on: ubuntu-22.04
steps:
- name: Mark the job as a success
run: exit 0