name: CI on: pull_request: push: branches: - master - dev workflow_run: workflows: - Sync channels types: - completed permissions: contents: read jobs: # TODO: `nix flake check` costs too much time and memory for GitHub Actions machines. check-sync-script: name: Check sync script is deterministic runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Install Nix uses: cachix/install-nix-action@v25 with: nix_path: nixpkgs=channel:nixpkgs-unstable - name: Clean the latest version of each channel run: | for channel in stable beta nightly; do version=$(sed -nE 's/.*latest = "(.*?)".*/\1/p' "./manifests/$channel/default.nix") echo "Remove $channel $version" rm "./manifests/$channel/default.nix" if [[ "$channel" == "stable" ]]; then rm "./manifests/$channel/$version.nix" else rm "./manifests/$channel/${version%%-*}/$version.nix" fi done - name: Re-fetch latest stable env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./scripts/fetch.py stable - name: Re-fetch latest beta env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./scripts/fetch.py beta - name: Re-fetch latest nightly env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./scripts/fetch.py nightly - name: Verify file changes run: | short_status=$(git status --short) echo "$short_status" shopt -s extglob while read -r change; do case "$change" in # Okay if there is no change. "" ) ;; "?? "manifests/@(stable|nightly|beta)/* ) ;; "M "manifests/@(renames.nix|targets.nix) ) ;; "M "manifests/@(stable|nightly|beta)/default.nix ) ;; * ) echo "Unexpected change: $change" exit 1 esac done <<<"$short_status" test-rust: name: Test Rust strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] rust-channel: [stable, beta, nightly] profile: [minimal, default] nixpkgs-channel: [nixpkgs-unstable, nixos-23.05] include: # The legacy package, used by compatible functions. - os: ubuntu-latest rust-channel: stable profile: rust nixpkgs-channel: nixpkgs-unstable runs-on: ${{ matrix.os }} env: NIX_SHELL_CMD: nix-shell --pure --argstr channel ${{ matrix.rust-channel }} --argstr profile ${{ matrix.profile }} steps: - name: Checkout uses: actions/checkout@v4 - name: Install Nix uses: cachix/install-nix-action@v25 with: nix_path: nixpkgs=channel:${{ matrix.nixpkgs-channel }} install_url: ${{ matrix.nix_install_url }} # Workaround for https://github.com/oxalica/rust-overlay/issues/54 - name: Don't let ~/.cargo/bin mess things up run: rm -rf ~/.cargo/bin - name: Prepare nix-shell run: | cd examples/hello-world $NIX_SHELL_CMD --command true - name: Test cargo build run: | cd examples/hello-world set -o pipefail $NIX_SHELL_CMD --command "make run" | tee out [[ "$(< out)" == *"Hello, world!"* ]] - name: Test cargo fmt if: matrix.profile == 'default' || matrix.profile == 'rust' run: | cd examples/hello-world $NIX_SHELL_CMD --command "cargo fmt -- --check" - name: Test cargo clippy if: matrix.profile == 'default' || matrix.profile == 'rust' run: | cd examples/hello-world set -o pipefail $NIX_SHELL_CMD --command "cargo clippy -- --cap-lints=warn" 2>&1 | tee out [[ "$(< out)" == *"warning: this loop never actually loops"* ]] test-cross-examples: runs-on: ubuntu-latest strategy: fail-fast: false matrix: example: [cross-aarch64, cross-wasi, cross-mingw] kind: [shell] include: - example: cross-aarch64 kind: flake name: Test cross compilation examples (${{ matrix.kind }}) steps: - name: Checkout uses: actions/checkout@v4 - name: Install Nix uses: cachix/install-nix-action@v25 with: nix_path: nixpkgs=channel:nixpkgs-unstable # Workaround for https://github.com/oxalica/rust-overlay/issues/54 - name: Don't let ~/.cargo/bin mess things up run: rm -rf ~/.cargo/bin - name: Prepare dev env run: | cd examples/${{ matrix.example }} if [[ ${{ matrix.kind }} == 'shell' ]]; then nix-shell --pure --command true else nix develop --ignore-environment --override-input rust-overlay ../.. fi - name: Build and run example run: | cd examples/${{ matrix.example }} set -o pipefail if [[ ${{ matrix.kind }} == 'shell' ]]; then # No --pure since it requires CA cert access for crates downloading. nix-shell --pure --command "make run" | tee out else nix develop --ignore-environment --override-input rust-overlay ../.. --command make run | tee out fi [[ "$(< out)" == *"Hello, world!"* ]]