name: CI on: push: # Run in PRs and for bors, but not on master. branches: - 'auto' - 'try' pull_request: branches: - 'master' schedule: - cron: '6 6 * * *' # At 6:06 UTC every day. env: CARGO_UNSTABLE_SPARSE_REGISTRY: 'true' jobs: build: runs-on: ${{ matrix.os }} env: RUST_BACKTRACE: 1 HOST_TARGET: ${{ matrix.host_target }} strategy: fail-fast: false matrix: include: - os: ubuntu-latest host_target: x86_64-unknown-linux-gnu - os: macos-latest host_target: x86_64-apple-darwin - os: windows-latest host_target: i686-pc-windows-msvc steps: - uses: actions/checkout@v3 - name: Set the tag GC interval to 1 on linux if: runner.os == 'Linux' run: echo "MIRIFLAGS=-Zmiri-tag-gc=1" >> $GITHUB_ENV # Cache the global cargo directory, but NOT the local `target` directory which # we cannot reuse anyway when the nightly changes (and it grows quite large # over time). - name: Add cache for cargo id: cache uses: actions/cache@v3 with: path: | # Taken from . ~/.cargo/bin ~/.cargo/registry/index ~/.cargo/registry/cache ~/.cargo/git/db # contains package information of crates installed via `cargo install`. ~/.cargo/.crates.toml ~/.cargo/.crates2.json key: ${{ runner.os }}-cargo-reset20230315-${{ hashFiles('**/Cargo.lock') }} restore-keys: ${{ runner.os }}-cargo-reset20230315 - name: Install rustup-toolchain-install-master if: ${{ steps.cache.outputs.cache-hit != 'true' }} shell: bash run: | cargo install -f rustup-toolchain-install-master - name: Install "master" toolchain shell: bash run: | if [[ ${{ github.event_name }} == 'schedule' ]]; then echo "Building against latest rustc git version" git ls-remote https://github.com/rust-lang/rust/ HEAD | cut -f 1 > rust-version fi ./miri toolchain --host ${{ matrix.host_target }} - name: Show Rust version run: | rustup show rustc -Vv cargo -V - name: Test run: bash ./ci.sh style: name: style checks runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 # This is exactly duplicated from above. GHA is pretty terrible when it comes # to avoiding code duplication. # Cache the global cargo directory, but NOT the local `target` directory which # we cannot reuse anyway when the nightly changes (and it grows quite large # over time). - name: Add cache for cargo id: cache uses: actions/cache@v3 with: path: | # Taken from . ~/.cargo/bin ~/.cargo/registry/index ~/.cargo/registry/cache ~/.cargo/git/db # contains package information of crates installed via `cargo install`. ~/.cargo/.crates.toml ~/.cargo/.crates2.json key: ${{ runner.os }}-cargo-reset20230315-${{ hashFiles('**/Cargo.lock') }} restore-keys: ${{ runner.os }}-cargo-reset20230315 - name: Install rustup-toolchain-install-master if: ${{ steps.cache.outputs.cache-hit != 'true' }} shell: bash run: | cargo install -f rustup-toolchain-install-master - name: Install "master" toolchain shell: bash run: | ./miri toolchain - name: Show Rust version run: | rustup show rustc -Vv cargo -V - name: rustfmt run: ./miri fmt --check - name: clippy run: ./miri clippy -- -D warnings - name: rustdoc run: RUSTDOCFLAGS="-Dwarnings" cargo doc --document-private-items # These jobs doesn't actually test anything, but they're only used to tell # bors the build completed, as there is no practical way to detect when a # workflow is successful listening to webhooks only. # # ALL THE PREVIOUS JOBS NEED TO BE ADDED TO THE `needs` SECTION OF THIS JOB! # (`fmt` is deliberately not listed, we want bors to ignore it.) end-success: name: bors build finished runs-on: ubuntu-latest needs: [build, style] if: github.event.pusher.name == 'bors' && success() steps: - name: mark the job as a success run: exit 0 end-failure: name: bors build finished runs-on: ubuntu-latest needs: [build, style] if: github.event.pusher.name == 'bors' && (failure() || cancelled()) steps: - name: mark the job as a failure run: exit 1 # Send a Zulip notification when a cron job fails cron-fail-notify: name: cronjob failure notification runs-on: ubuntu-latest needs: [build, style] if: github.event_name == 'schedule' && (failure() || cancelled()) steps: - name: Install zulip-send run: pip3 install zulip - name: Send Zulip notification shell: bash env: ZULIP_BOT_EMAIL: ${{ secrets.ZULIP_BOT_EMAIL }} ZULIP_API_TOKEN: ${{ secrets.ZULIP_API_TOKEN }} run: | ~/.local/bin/zulip-send --stream miri --subject "Cron Job Failure (miri, $(date -u +%Y-%m))" \ --message 'Dear @*T-miri*, It would appear that the Miri cron job build failed. Would you mind investigating this issue? Thanks in advance! Sincerely, The Miri Cronjobs Bot' \ --user $ZULIP_BOT_EMAIL --api-key $ZULIP_API_TOKEN --site https://rust-lang.zulipchat.com