name: Build on: pull_request: push: branches: - master - staging - trying - bors/staging - bors/trying env: CARGO_TERM_COLOR: always jobs: # Run cargo fmt --check, includes macros/ style: name: style runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Fail on warnings run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: cargo fmt --check run: cargo fmt --all -- --check # Compilation check check: name: check runs-on: ubuntu-22.04 strategy: matrix: target: - thumbv7m-none-eabi - thumbv6m-none-eabi - x86_64-unknown-linux-gnu toolchain: - stable steps: - name: Checkout uses: actions/checkout@v3 - name: Install Rust ${{ matrix.toolchain }} run: | rustup set profile minimal rustup override set ${{ matrix.toolchain }} - name: Configure Rust target (${{ matrix.target }}) run: rustup target add ${{ matrix.target }} - name: Fail on warnings run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: cargo check run: cargo check --target=${{ matrix.target }} # Clippy clippy: name: Cargo clippy runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Fail on warnings run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: Add Rust component clippy run: rustup component add clippy - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: cargo clippy run: cargo clippy # Verify all examples, checks checkexamples: name: checkexamples runs-on: ubuntu-22.04 strategy: matrix: target: - thumbv7m-none-eabi - thumbv6m-none-eabi - thumbv8m.base-none-eabi - thumbv8m.main-none-eabi toolchain: - stable steps: - name: Checkout uses: actions/checkout@v3 - name: Install Rust ${{ matrix.toolchain }} run: | rustup set profile minimal rustup override set ${{ matrix.toolchain }} - name: Configure Rust target (${{ matrix.target }}) run: rustup target add ${{ matrix.target }} - name: Add Rust component llvm-tools-preview run: rustup component add llvm-tools-preview - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: Check the examples run: cargo check --examples --target=${{ matrix.target }} # Verify the example output with run-pass tests testexamples: name: testexamples runs-on: ubuntu-22.04 strategy: matrix: target: - thumbv7m-none-eabi - thumbv6m-none-eabi toolchain: - stable steps: - name: Checkout uses: actions/checkout@v3 - name: Install Rust ${{ matrix.toolchain }} run: | rustup set profile minimal rustup override set ${{ matrix.toolchain }} - name: Configure Rust target (${{ matrix.target }}) run: rustup target add ${{ matrix.target }} - name: Add Rust component llvm-tools-preview run: rustup component add llvm-tools-preview # Use precompiled binutils - name: cargo install cargo-binutils run: cargo install cargo-binutils - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: Install QEMU run: | sudo apt update sudo apt install -y qemu-system-arm - name: Fail on warnings run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: Run-pass tests run: cargo xtask --target ${{ matrix.target }} # Check the correctness of macros/ crate checkmacros: name: checkmacros runs-on: ubuntu-22.04 strategy: matrix: target: - x86_64-unknown-linux-gnu toolchain: - stable steps: - name: Checkout uses: actions/checkout@v3 - name: Install Rust ${{ matrix.toolchain }} run: | rustup set profile minimal rustup override set ${{ matrix.toolchain }} - name: Configure Rust target (${{ matrix.target }}) run: rustup target add ${{ matrix.target }} - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: Fail on warnings run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: cargo check run: cargo check --manifest-path macros/Cargo.toml --target=${{ matrix.target }} # Run the macros test-suite testmacros: name: testmacros runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: Fail on warnings run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: cargo check run: cargo test --manifest-path macros/Cargo.toml # Run test suite tests: name: tests runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: Fail on warnings run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: Run cargo test run: cargo test --test tests # Build documentation, check links docs: name: docs runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Cache pip installed linkchecker uses: actions/cache@v2 with: path: ~/.cache/pip key: ${{ runner.os }}-pip restore-keys: | ${{ runner.os }}-pip- - name: Set up Python 3.x uses: actions/setup-python@v4 with: # Semantic version range syntax or exact version of a Python version python-version: '3.x' # You can test your matrix by printing the current Python version - name: Display Python version run: python -c "import sys; print(sys.version)" - name: Install dependencies run: pip install git+https://github.com/linkchecker/linkchecker.git - name: Remove cargo-config run: rm -f .cargo/config - name: Fail on warnings run: sed -i 's,//deny_warnings_placeholder_for_ci,#![deny(warnings)],' src/lib.rs macros/src/lib.rs - name: Build docs run: cargo doc - name: Check links run: | td=$(mktemp -d) cp -r target/doc $td/api linkchecker $td/api/rtic/ linkchecker $td/api/cortex_m_rtic_macros/ # Build the books mdbook: name: mdbook runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Set up Python 3.x uses: actions/setup-python@v4 with: # Semantic version range syntax or exact version of a Python version python-version: '3.x' # You can test your matrix by printing the current Python version - name: Display Python version run: python -c "import sys; print(sys.version)" - name: Install dependencies run: pip install git+https://github.com/linkchecker/linkchecker.git - name: mdBook Action uses: peaceiris/actions-mdbook@v1 with: mdbook-version: 'latest' - name: Build book in English shell: 'script --return --quiet --command "bash {0}"' run: cd book/en && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi - name: Build book in Russian shell: 'script --return --quiet --command "bash {0}"' run: cd book/ru && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then echo "Russian book needs updating!"; else exit 0; fi - name: Check links run: | td=$(mktemp -d) mkdir $td/book cp -r book/en/book $td/book/en cp -r book/ru/book $td/book/ru cp LICENSE-* $td/book/en cp LICENSE-* $td/book/ru linkchecker $td/book/en/ linkchecker $td/book/ru/ # Update stable branch # # This needs to run before book is built mergetostablebranch: name: If CI passes, merge master branch into release/vX runs-on: ubuntu-22.04 needs: - style - check - clippy - checkexamples - testexamples - checkmacros - testmacros - tests - docs - mdbook # Only run this when pushing to master branch if: github.ref == 'refs/heads/master' steps: - uses: actions/checkout@v3 - name: Get crate version and print output branch release/vX id: crateversionbranch # Parse metadata for version number, extract the Semver Major run: | VERSION=$(cargo metadata --format-version 1 --no-deps --offline | jq -r '.packages[] | select(.name =="cortex-m-rtic") | .version') VERSIONMAJOR=${VERSION%.*.*} echo "branch=release/v$VERSIONMAJOR" >> $GITHUB_ENV echo "versionmajor=$VERSIONMAJOR" >> $GITHUB_ENV echo "version=$VERSION" >> $GITHUB_ENV - uses: everlytic/branch-merge@1.1.2 with: github_token: ${{ github.token }} source_ref: 'master' target_branch: ${{ env.branch }} commit_message_template: '[Bors] Merged {source_ref} into target {target_branch}' # Only runs when pushing to master branch # Bors run CI against staging branch, # if that succeeds Borst tries against master branch # If all tests pass, then deploy stage is run deploy: name: deploy runs-on: ubuntu-22.04 needs: mergetostablebranch # Only run this when pushing to master branch if: github.ref == 'refs/heads/master' steps: - uses: actions/checkout@v3 - name: Set up Python 3.x uses: actions/setup-python@v4 with: # Semantic version range syntax or exact version of a Python version python-version: '3.x' # You can test your matrix by printing the current Python version - name: Display Python version run: python -c "import sys; print(sys.version)" - name: mdBook Action uses: peaceiris/actions-mdbook@v1 with: mdbook-version: 'latest' - name: Get crate version id: crateversion # Parse metadata for version number, extract the Semver Major run: | VERSION=$(cargo metadata --format-version 1 --no-deps --offline | jq -r '.packages[] | select(.name =="cortex-m-rtic") | .version') VERSIONMAJOR=${VERSION%.*.*} echo "branch=release/v$VERSIONMAJOR" >> $GITHUB_ENV echo "versionmajor=$VERSIONMAJOR" >> $GITHUB_ENV echo "version=$VERSION" >> $GITHUB_ENV - name: Remove cargo-config run: rm -f .cargo/config - name: Build docs run: cargo doc - name: Build books shell: 'script --return --quiet --command "bash {0}"' run: | langs=( en ru ) devver=( dev ) # The latest stable must be the first element in the array vers=( "1" "0.5" "0.4" ) # 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/book/ cp -r target/doc $td/$devver/api # 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 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 # Build books for lang in ${langs[@]}; do ( cd book/$lang && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi ) cp -r book/$lang/book $td/$devver/book/$lang cp LICENSE-* $td/$devver/book/$lang/ done # Build older versions, including stable root=$(pwd) for ver in ${vers[@]}; do prefix=${ver} mkdir -p $td/$prefix/book src=$(mktemp -d) curl -L https://github.com/rtic-rs/cortex-m-rtic/archive/release/v${ver}.tar.gz | tar xz --strip-components 1 -C $src pushd $src rm -f .cargo/config cargo doc || cargo doc --features timer-queue cp -r target/doc $td/$prefix/api sed 's|URL|rtic/index.html|g' $root/redirect.html > $td/$prefix/api/index.html for lang in ${langs[@]}; do ( cd book/$lang && if mdbook build |& tee /dev/tty | grep "\[ERROR\]"; then exit 1; else exit 0; fi ) cp -r book/$lang/book $td/$prefix/book/$lang cp LICENSE-* $td/$prefix/book/$lang/ done sed 's|URL|book/en|g' $root/redirect.html > $td/$prefix/index.html popd rm -rf $src done # Copy the stable book to the stable alias cp -r $td/$stable $td/stable # Forward CNAME file cp CNAME $td/ mv $td/ bookstodeploy - name: Deploy to GH-pages uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./bookstodeploy force_orphan: true # Refs: https://github.com/rust-lang/crater/blob/9ab6f9697c901c4a44025cf0a39b73ad5b37d198/.github/workflows/bors.yml#L125-L149 # # 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: - style - check - clippy - checkexamples - testexamples - checkmacros - testmacros - tests - docs - mdbook runs-on: ubuntu-22.04 steps: - name: Mark the job as a success run: exit 0