name: Build on: pull_request: push: branches: - master - staging - trying - bors/staging - bors/trying env: CARGO_TERM_COLOR: always DEV_VERSION: 2 STABLE_VERSION: 2 OLDSTABLE_VERSION: 1 OLDOLDSTABLE_VERSION: 0.5 OLDOLDOLDSTABLE_VERSION: 0.4 jobs: # Run cargo xtask format-check formatcheck: name: cargo fmt runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: cargo xtask fmt run: cargo xtask --verbose fmt -c # Compilation check check: name: check runs-on: ubuntu-22.04 strategy: matrix: backend: - thumbv7 - thumbv6 - thumbv8-base - thumbv8-main toolchain: - nightly steps: - name: Checkout uses: actions/checkout@v3 - 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 --backend ${{ matrix.backend }} check # Clippy clippy: name: clippy runs-on: ubuntu-22.04 strategy: matrix: backend: - thumbv7 - thumbv6 - thumbv8-base - thumbv8-main toolchain: - nightly steps: - name: Checkout uses: actions/checkout@v3 - 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 --backend ${{ matrix.backend }} clippy # Verify all examples, checks checkexamples: name: check examples runs-on: ubuntu-22.04 strategy: matrix: backend: - thumbv7 - thumbv6 - thumbv8-base - thumbv8-main toolchain: - nightly steps: - name: Checkout uses: actions/checkout@v3 - 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 --backend ${{ matrix.backend }} --exampleexclude pool example-check - name: Check the examples if: ${{ matrix.backend != 'thumbv8-base' }} run: cargo xtask --backend ${{ matrix.backend }} example-check # Check that the usage examples build usageexamples: name: Build usage examples runs-on: ubuntu-22.04 strategy: matrix: toolchain: - nightly 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 (v6, v7) run: | rustup target add thumbv7m-none-eabi rustup target add thumbv6m-none-eabi rustup component add rust-src - name: Cache Dependencies uses: Swatinem/rust-cache@v2 - name: Check the examples run: cargo xtask usage-example-build # Verify the example output with run-pass tests testexamples: name: QEMU run runs-on: ubuntu-22.04 strategy: matrix: backend: - thumbv7 - thumbv6 toolchain: - nightly 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 (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 run: | sudo apt update sudo apt install -y qemu-system-arm - name: Run-pass tests run: cargo xtask --deny-warnings --backend ${{ matrix.backend }} 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@v3 - 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@v3 - name: Install lychee uses: taiki-e/install-action@v2 with: tool: lychee - name: Remove cargo-config run: rm -f .cargo/config.toml - name: Build docs # TODO: Any difference between backends? run: cargo doc --features thumbv7-backend - 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@v3 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@v3 - 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@v3 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@v3 with: name: book path: book.tar mdbookold: name: build docs and mdbook for older releases needs: mergetostablebranch runs-on: ubuntu-22.04 steps: - name: Checkout uses: actions/checkout@v3 - 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@v3 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@v3 - 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 mergetostablebranch: name: Merge 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@v3 - name: Push to stable release branch if master contains stable version if: ${{ env.versionmajor == env.STABLE_VERSION }} run: git push -u origin ${{ env.branch }} - name: Else case, master did not contain the stable version 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 # 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 - docs - mdbookold - mdbook # Only run this when pushing to master branch if: github.ref == 'refs/heads/master' steps: - uses: actions/checkout@v3 - 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@v1 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@v3 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@v3 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@v3 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@v3 with: name: bookstodeploy - name: Extract the books run: | tar -xf bookstodeploy.tar - 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: - formatcheck - check - clippy - checkexamples - testexamples - tests - docs - mdbook runs-on: ubuntu-22.04 steps: - name: Mark the job as a success run: exit 0