name: CI on: schedule: - cron: "0 2 * * *" push: branches: ["*"] pull_request: branches: [master] env: CARGO_TERM_COLOR: always jobs: build: strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] rust: [nightly, stable, "1.88"] runs-on: ${{ matrix.os }} continue-on-error: ${{ matrix.rust == 'nightly' }} steps: - uses: actions/checkout@v4 - name: Restore cargo cache uses: Swatinem/rust-cache@v2 env: cache-name: ci with: shared-key: ${{ matrix.os }}-${{ env.cache-name }}-${{ matrix.rust }} - name: MacOS Workaround if: matrix.os == 'macos-latest' run: cargo clean -p serde_derive -p thiserror - name: Install Rust uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} components: clippy - name: Override rust toolchain run: rustup override set ${{ matrix.rust }} - name: Rustup Show run: rustup show - uses: taiki-e/install-action@nextest - name: Build Debug run: | cargo build - name: Run tests run: make test - name: Run clippy run: | make clippy - name: Build Release run: make build-release - name: Test Install run: cargo install --path "." --force --locked - name: Binary Size (unix) if: matrix.os != 'windows-latest' run: | ls -l ./target/release/gitui - name: Binary Size (win) if: matrix.os == 'windows-latest' run: | ls -l ./target/release/gitui.exe - name: Binary dependencies (mac) if: matrix.os == 'macos-latest' run: | otool -L ./target/release/gitui - name: Build MSI (windows) if: matrix.os == 'windows-latest' run: | cargo install cargo-wix --version 0.3.3 --locked cargo wix --version cargo wix -p gitui --no-build --nocapture --output ./target/wix/gitui-win.msi ls -l ./target/wix/gitui-win.msi build-linux-musl: runs-on: ubuntu-latest strategy: fail-fast: false matrix: rust: [nightly, stable, "1.88"] continue-on-error: ${{ matrix.rust == 'nightly' }} steps: - uses: actions/checkout@v4 - name: Restore cargo cache uses: Swatinem/rust-cache@v2 env: cache-name: ci with: key: ubuntu-latest-${{ env.cache-name }}-${{ matrix.rust }} - name: Install Rust uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} targets: x86_64-unknown-linux-musl # The build would fail without manually installing the target. # https://github.com/dtolnay/rust-toolchain/issues/83 - name: Manually install target run: rustup target add x86_64-unknown-linux-musl - name: Override rust toolchain run: rustup override set ${{ matrix.rust }} - name: Rustup Show run: rustup show - uses: taiki-e/install-action@nextest - name: Setup MUSL run: | sudo apt-get -qq install musl-tools - name: Build Debug run: | make build-linux-musl-debug ./target/x86_64-unknown-linux-musl/debug/gitui --version - name: Build Release run: | make build-linux-musl-release ./target/x86_64-unknown-linux-musl/release/gitui --version ls -l ./target/x86_64-unknown-linux-musl/release/gitui - name: Test run: | make test-linux-musl - name: Test Install run: cargo install --path "." --force --locked build-linux-arm: runs-on: ubuntu-latest strategy: fail-fast: false matrix: rust: [nightly, stable, "1.88"] continue-on-error: ${{ matrix.rust == 'nightly' }} steps: - uses: actions/checkout@v4 - name: Restore cargo cache uses: Swatinem/rust-cache@v2 env: cache-name: ci with: key: ubuntu-latest-${{ env.cache-name }}-${{ matrix.rust }} - name: Install Rust uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} - name: Override rust toolchain run: rustup override set ${{ matrix.rust }} - name: Setup ARM toolchain run: | rustup target add aarch64-unknown-linux-gnu rustup target add armv7-unknown-linux-gnueabihf rustup target add arm-unknown-linux-gnueabihf curl -o $GITHUB_WORKSPACE/aarch64.tar.xz https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-a/8.2-2018.08/gcc-arm-8.2-2018.08-x86_64-aarch64-linux-gnu.tar.xz curl -o $GITHUB_WORKSPACE/arm.tar.xz https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-a/8.2-2018.08/gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf.tar.xz tar xf $GITHUB_WORKSPACE/aarch64.tar.xz tar xf $GITHUB_WORKSPACE/arm.tar.xz echo "$GITHUB_WORKSPACE/gcc-arm-8.2-2018.08-x86_64-aarch64-linux-gnu/bin" >> $GITHUB_PATH echo "$GITHUB_WORKSPACE/gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf/bin" >> $GITHUB_PATH - name: Rustup Show run: rustup show - name: Build Debug run: | make build-linux-arm-debug - name: Build Release run: | make build-linux-arm-release ls -l ./target/aarch64-unknown-linux-gnu/release/gitui || ls -l ./target/armv7-unknown-linux-gnueabihf/release/gitui || ls -l ./target/arm-unknown-linux-gnueabihf/release/gitui build-apple-x86: runs-on: macos-latest strategy: fail-fast: false matrix: rust: [nightly, stable, "1.88"] continue-on-error: ${{ matrix.rust == 'nightly' }} steps: - uses: actions/checkout@v4 - name: Restore cargo cache uses: Swatinem/rust-cache@v2 env: cache-name: ci with: key: apple-x86-${{ env.cache-name }}-${{ matrix.rust }} - name: Install Rust uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} - name: Override rust toolchain run: rustup override set ${{ matrix.rust }} - name: Setup target run: rustup target add x86_64-apple-darwin - name: Rustup Show run: rustup show - name: Build Debug run: | make build-apple-x86-debug - name: Build Release run: | make build-apple-x86-release ls -l ./target/x86_64-apple-darwin/release/gitui linting: name: Lints runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Restore cargo cache uses: Swatinem/rust-cache@v2 env: cache-name: ci with: key: ubuntu-latest-${{ env.cache-name }}-stable - name: Install Rust uses: dtolnay/rust-toolchain@stable with: components: rustfmt - run: cargo fmt -- --check - name: tombi install uses: tombi-toml/setup-tombi@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: version: '0.9.0' - name: tombi check run: | tombi format --check - name: cargo-deny install run: | cargo install --locked cargo-deny - name: cargo-deny checks run: | cargo deny check udeps: name: udeps runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Restore cargo cache uses: Swatinem/rust-cache@v2 env: cache-name: ci with: key: ubuntu-latest-${{ env.cache-name }}-nightly - name: Install Rust uses: dtolnay/rust-toolchain@nightly - name: build cargo-udeps run: cargo install --git https://github.com/est31/cargo-udeps --locked - name: run cargo-udeps run: cargo +nightly udeps --all-targets log-test: name: Changelog Test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Extract release notes id: extract_release_notes uses: ffurrer2/extract-release-notes@v2 with: release_notes_file: ./release-notes.txt - uses: actions/upload-artifact@v4 with: name: release-notes.txt path: ./release-notes.txt test-homebrew: name: Test Homebrew Formula (macOS) runs-on: macos-latest steps: - name: Set up Homebrew uses: Homebrew/actions/setup-homebrew@master - name: Install stable Rust uses: actions-rs/toolchain@v1 with: toolchain: stable - name: Let Homebrew build gitui from source run: brew install --build-from-source gitui