# Main CI workflow to validate that files are formatted correctly, pass tests, # and pass lints. # # CI workflow was based on a lot of work from other people: # - https://github.com/heim-rs/heim/blob/master/.github/workflows/ci.yml # - https://github.com/BurntSushi/ripgrep/blob/master/.github/workflows/ci.yml # - https://www.reillywood.com/blog/rust-faster-ci/ # - https://matklad.github.io/2021/09/04/fast-rust-builds.html # # Supported platforms run the following tasks: # - Format # - Test (built/test in separate steps) # - Clippy (apparently faster to do it after the build/test) # # Unsupported platforms run the following tasks: # - Clippy name: ci on: workflow_dispatch: pull_request: push: branches: - main env: RUST_BACKTRACE: 1 CARGO_INCREMENTAL: 0 CARGO_PROFILE_DEV_DEBUG: 0 CARGO_HUSKY_DONT_INSTALL_HOOKS: true COMPLETION_DIR: "target/tmp/bottom/completion/" MANPAGE_DIR: "target/tmp/bottom/manpage/" concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.event_name == 'pull_request' || github.repository != 'ClementTsang/bottom' }} jobs: # Check if things should be skipped. pre-job: runs-on: ubuntu-latest outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - name: Check if this action should be skipped id: skip_check uses: fkirc/skip-duplicate-actions@f75f66ce1886f00957d99748a42c724f4330bdcf # v5.3.1 with: skip_after_successful_duplicate: "true" paths: '[".cargo/**", ".github/workflows/ci.yml", "sample_configs/**", "src/**", "tests/**", "build.rs", "Cargo.lock", "Cargo.toml", "clippy.toml", "rustfmt.toml", "Cross.toml"]' do_not_skip: '["workflow_dispatch", "push"]' # Runs rustfmt + tests + clippy on the main supported platforms. # # TODO: In the future, when ARM runners are available on github, switch ARM targets off of cross. supported: needs: pre-job if: ${{ needs.pre-job.outputs.should_skip != 'true' }} runs-on: ${{ matrix.info.os }} timeout-minutes: 12 strategy: fail-fast: false matrix: info: - { os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu", cross: false, } - { os: "ubuntu-latest", target: "aarch64-unknown-linux-gnu", cross: true, } - { os: "macos-13", target: "x86_64-apple-darwin", cross: false } - { os: "macos-14", target: "aarch64-apple-darwin", cross: false } - { os: "windows-2019", target: "x86_64-pc-windows-msvc", cross: false, } features: ["--all-features", "--no-default-features"] steps: - name: Checkout repository uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Rust toolchain uses: dtolnay/rust-toolchain@21dc36fb71dd22e3317045c0c31a3f4249868b17 with: toolchain: stable components: rustfmt, clippy target: ${{ matrix.info.target }} - name: Enable Rust cache uses: Swatinem/rust-cache@9bdad043e88c75890e36ad3bbc8d27f0090dd609 # 2.7.3 if: ${{ github.event_name != 'pull_request' || ! github.event.pull_request.head.repo.fork }} # If it is a PR, only if not a fork with: key: ${{ matrix.info.target }} cache-all-crates: true - name: Check cargo fmt run: cargo fmt --all -- --check - name: Build tests uses: ClementTsang/cargo-action@v0.0.5 with: command: test args: --no-run --locked ${{ matrix.features }} --target=${{ matrix.info.target }} use-cross: ${{ matrix.info.cross }} cross-version: 0.2.5 env: RUST_BACKTRACE: full - name: Run tests uses: ClementTsang/cargo-action@v0.0.5 with: command: test args: --no-fail-fast ${{ matrix.features }} --target=${{ matrix.info.target }} -- --nocapture --quiet use-cross: ${{ matrix.info.cross }} cross-version: 0.2.5 env: RUST_BACKTRACE: full - name: Run clippy uses: ClementTsang/cargo-action@v0.0.5 with: command: clippy args: ${{ matrix.features }} --all-targets --workspace --target=${{ matrix.info.target }} -- -D warnings use-cross: ${{ matrix.info.cross }} cross-version: 0.2.5 env: RUST_BACKTRACE: full # Try running cargo build on all other platforms. # # TODO: Maybe some of these should be allowed to fail? If so, I guess we can add back the "unofficial" MSRV, # I would also put android there. other-check: needs: pre-job runs-on: ${{ matrix.info.os }} if: ${{ needs.pre-job.outputs.should_skip != 'true' }} timeout-minutes: 12 strategy: fail-fast: false matrix: info: # x86 or x86-64 - { os: "ubuntu-latest", target: "i686-unknown-linux-gnu", cross: true, } - { os: "ubuntu-latest", target: "x86_64-unknown-linux-musl", cross: false, } - { os: "ubuntu-latest", target: "i686-unknown-linux-musl", cross: true, } - { os: "windows-2019", target: "i686-pc-windows-msvc", cross: false } - { os: "windows-2019", target: "x86_64-pc-windows-gnu", cross: false, } # Beta - { os: "ubuntu-latest", target: "x86_64-unknown-linux-gnu", cross: false, rust: "beta", } - { os: "macos-14", target: "aarch64-apple-darwin", cross: false, rust: "beta", } - { os: "windows-2019", target: "x86_64-pc-windows-msvc", cross: false, rust: "beta", } # armv7 - { os: "ubuntu-latest", target: "armv7-unknown-linux-gnueabihf", cross: true, } # armv6 - { os: "ubuntu-latest", target: "arm-unknown-linux-gnueabihf", cross: true, } # PowerPC 64 LE - { os: "ubuntu-latest", target: "powerpc64le-unknown-linux-gnu", cross: true, } # Risc-V 64gc # Note: seems like this breaks with tests? - { os: "ubuntu-latest", target: "riscv64gc-unknown-linux-gnu", cross: true, } # Android ARM64 - { os: "ubuntu-latest", target: "aarch64-linux-android", cross: true, cross-version: "git:cabfc3b02d1edec03869fabdabf6a7f8b0519160", no-default-features: true, no-clippy: true, } steps: - name: Checkout repository uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - name: Set up Rust toolchain uses: dtolnay/rust-toolchain@21dc36fb71dd22e3317045c0c31a3f4249868b17 with: toolchain: ${{ matrix.info.rust || 'stable' }} target: ${{ matrix.info.target }} components: "clippy" - name: Enable Rust cache uses: Swatinem/rust-cache@9bdad043e88c75890e36ad3bbc8d27f0090dd609 # 2.7.3 if: ${{ github.event_name != 'pull_request' || ! github.event.pull_request.head.repo.fork }} # If it is a PR, only if not a fork with: key: ${{ matrix.info.target }} cache-all-crates: true - name: Clippy (default features) uses: ClementTsang/cargo-action@v0.0.5 if: ${{ matrix.info.no-default-features != true }} with: command: clippy args: --all-targets --workspace --target=${{ matrix.info.target }} --locked use-cross: ${{ matrix.info.cross }} cross-version: ${{ matrix.info.cross-version || '0.2.5' }} - name: Clippy (no features enabled) uses: ClementTsang/cargo-action@v0.0.5 if: ${{ matrix.info.no-default-features == true }} with: command: clippy args: --all-targets --workspace --target=${{ matrix.info.target }} --locked --no-default-features use-cross: ${{ matrix.info.cross }} cross-version: ${{ matrix.info.cross-version || '0.2.5' }} vm-check: name: "Test using VMs" needs: pre-job if: ${{ needs.pre-job.outputs.should_skip != 'true' }} runs-on: "ubuntu-latest" timeout-minutes: 15 strategy: fail-fast: false matrix: info: # Seems like cross' FreeBSD image is a bit broken? I get build errors, may be related to this issue: # https://github.com/cross-rs/cross/issues/1291 # # Alas, that's why we do it with VMs. - { type: "freebsd", os_release: "15.0", target: "x86_64-unknown-freebsd", } - { type: "freebsd", os_release: "14.1", target: "x86_64-unknown-freebsd", } - { type: "freebsd", os_release: "13.3", target: "x86_64-unknown-freebsd", } steps: - name: Checkout repository uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 with: fetch-depth: 1 - name: Enable Rust cache uses: Swatinem/rust-cache@9bdad043e88c75890e36ad3bbc8d27f0090dd609 # 2.7.3 if: ${{ github.event_name != 'pull_request' || ! github.event.pull_request.head.repo.fork }} # If it is a PR, only if not a fork with: key: ${{ matrix.info.target }}-${{ matrix.info.os_release }} cache-all-crates: true - name: Clippy (FreeBSD) if: ${{ matrix.info.type == 'freebsd' }} uses: vmactions/freebsd-vm@debf37ca7b7fa40e19c542ef7ba30d6054a706a4 # v1.1.5 with: release: "${{ matrix.info.os_release }}" envs: "RUST_BACKTRACE CARGO_INCREMENTAL CARGO_PROFILE_DEV_DEBUG CARGO_HUSKY_DONT_INSTALL_HOOKS" usesh: true prepare: | pkg install -y curl bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs --output rustup.sh sh rustup.sh --default-toolchain stable -y run: | . "$HOME/.cargo/env" cargo clippy --all-targets --workspace -- -D warnings completion: name: "CI Pass Check" needs: [supported, other-check, vm-check] if: ${{ needs.supported.result != 'skipped' && needs.other-check.result != 'skipped' && needs.vm-check.result != 'skipped' }} runs-on: "ubuntu-latest" steps: - name: CI Passed if: ${{ needs.supported.result == 'success' && needs.other-check.result == 'success' && needs.vm-check.result == 'success' }} run: | echo "CI workflow completed successfully."; - name: CI Failed if: ${{ needs.supported.result == 'failure' && needs.other-check.result == 'failure' && needs.vm-check.result == 'failure' }} run: | echo "CI workflow failed."; exit 1; - name: CI Cancelled if: ${{ needs.supported.result == 'cancelled' && needs.other-check.result == 'cancelled' && needs.vm-check.result == 'cancelled' }} run: | echo "CI workflow was cancelled."; exit 1;