Add PGO support to install #35470
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Please make sure that the `needs` field for the `conclusion` job | |
# are updated when adding new jobs! | |
name: CI | |
on: | |
pull_request: | |
merge_group: | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
cancel-in-progress: true | |
env: | |
CARGO_INCREMENTAL: 0 | |
CARGO_NET_RETRY: 10 | |
CI: 1 | |
RUST_BACKTRACE: short | |
RUSTUP_MAX_RETRIES: 10 | |
jobs: | |
changes: | |
runs-on: ubuntu-latest | |
permissions: | |
pull-requests: read | |
outputs: | |
typescript: ${{ steps.filter.outputs.typescript }} | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: dorny/paths-filter@1441771bbfdd59dcd748680ee64ebd8faab1a242 | |
id: filter | |
with: | |
filters: | | |
typescript: | |
- 'editors/code/**' | |
proc-macro-srv: | |
if: github.repository == 'rust-lang/rust-analyzer' | |
name: proc-macro-srv | |
runs-on: ubuntu-latest | |
env: | |
RUSTFLAGS: "-D warnings" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ github.event.pull_request.head.sha }} | |
- name: Install rustup-toolchain-install-master | |
run: cargo install [email protected] | |
# Install a pinned rustc commit to avoid surprises | |
- name: Install Rust toolchain | |
run: | | |
RUSTC_VERSION=`cat rust-version` | |
rustup-toolchain-install-master ${RUSTC_VERSION} -c rust-src -c rustfmt | |
rustup default ${RUSTC_VERSION} | |
# Emulate a nightly toolchain, because the toolchain installed above does not have "nightly" | |
# in its version string. | |
- name: Emulate a nightly toolchain | |
run: echo "RUSTC_BOOTSTRAP=1" >> $GITHUB_ENV | |
# https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/rust.json | |
- name: Install Rust Problem Matcher | |
run: echo "::add-matcher::.github/rust.json" | |
- name: Test | |
run: cargo test --features sysroot-abi -p proc-macro-srv -p proc-macro-srv-cli -p proc-macro-api -- --quiet | |
- name: Check salsa dependency | |
run: "! (cargo tree -p proc-macro-srv-cli | grep -q salsa)" | |
rust: | |
if: github.repository == 'rust-lang/rust-analyzer' | |
name: Rust | |
runs-on: ${{ matrix.os }} | |
env: | |
RUSTFLAGS: "-Dwarnings" | |
CC: deny_c | |
strategy: | |
matrix: | |
os: [ubuntu-latest, windows-latest, macos-latest] | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ github.event.pull_request.head.sha }} | |
- name: Install Rust toolchain | |
run: | | |
rustup update --no-self-update stable | |
rustup default stable | |
rustup component add --toolchain stable rust-src clippy | |
# We always use a nightly rustfmt, regardless of channel, because we need | |
# --file-lines. | |
rustup toolchain install nightly --profile minimal --component rustfmt | |
# https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/rust.json | |
- name: Install Rust Problem Matcher | |
if: matrix.os == 'ubuntu-latest' | |
run: echo "::add-matcher::.github/rust.json" | |
# - name: Cache Dependencies | |
# uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 | |
# with: | |
# workspaces: | | |
# . -> target | |
# ./crates/proc-macro-srv/proc-macro-test/imp -> target | |
- name: Install nextest | |
uses: taiki-e/install-action@nextest | |
- name: Codegen checks (rust-analyzer) | |
if: matrix.os == 'ubuntu-latest' | |
run: cargo codegen --check | |
- name: Compile tests | |
run: cargo test --no-run | |
- name: Run tests | |
run: cargo nextest run --no-fail-fast --hide-progress-bar --status-level fail | |
- name: Cancel parallel jobs | |
if: failure() | |
run: | | |
# https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#cancel-a-workflow-run | |
curl -L \ | |
-X POST \ | |
-H "Accept: application/vnd.github.v3+json" \ | |
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ | |
-H "X-GitHub-Api-Version: 2022-11-28" \ | |
https://api.github.com/repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/cancel | |
- name: Run Clippy | |
if: matrix.os == 'macos-latest' | |
run: cargo clippy --all-targets -- -D clippy::disallowed_macros -D clippy::dbg_macro -D clippy::todo -D clippy::print_stdout -D clippy::print_stderr | |
analysis-stats: | |
if: github.repository == 'rust-lang/rust-analyzer' | |
runs-on: ubuntu-latest | |
env: | |
RUSTC_BOOTSTRAP: 1 | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Install Rust toolchain | |
run: | | |
rustup update --no-self-update stable | |
rustup default stable | |
rustup component add rustfmt | |
# - name: Cache Dependencies | |
# uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 | |
- name: Bump opt-level | |
run: sed -i '/\[profile.dev]/a opt-level=1' Cargo.toml | |
- run: cargo build -p rust-analyzer | |
- name: ./rust-analyzer | |
run: ./target/debug/rust-analyzer analysis-stats . -q | |
- name: sysroot/lib/rustlib/src/rust/library/ | |
run: ./target/debug/rust-analyzer analysis-stats --with-deps --no-sysroot --no-test $(rustc --print sysroot)/lib/rustlib/src/rust/library/ -q | |
rustfmt: | |
if: github.repository == 'rust-lang/rust-analyzer' | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Install Rust toolchain | |
run: | | |
rustup update --no-self-update stable | |
rustup default stable | |
rustup component add rustfmt | |
- run: cargo fmt -- --check | |
miri: | |
if: github.repository == 'rust-lang/rust-analyzer' | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Install Rust toolchain | |
run: | | |
rustup update --no-self-update nightly | |
rustup default nightly | |
rustup component add miri | |
# - name: Cache Dependencies | |
# uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 | |
- run: cargo miri test -p intern | |
# Weird targets to catch non-portable code | |
rust-cross: | |
if: github.repository == 'rust-lang/rust-analyzer' | |
name: Rust Cross | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
target: [powerpc-unknown-linux-gnu, x86_64-unknown-linux-musl, wasm32-unknown-unknown] | |
include: | |
# The rust-analyzer binary is not expected to compile on WASM, but the IDE | |
# crate should | |
- target: wasm32-unknown-unknown | |
ide-only: true | |
env: | |
RUSTFLAGS: "-Dwarnings" | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Install Rust toolchain | |
run: | | |
rustup update --no-self-update stable | |
rustup target add ${{ matrix.target }} | |
# - name: Cache Dependencies | |
# uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 | |
- run: cargo check --target=${{ matrix.target }} --all-targets -p ide | |
if: ${{ matrix.ide-only }} | |
- run: cargo check --target=${{ matrix.target }} --all-targets | |
if: ${{ !matrix.ide-only }} | |
typescript: | |
needs: changes | |
if: github.repository == 'rust-lang/rust-analyzer' && needs.changes.outputs.typescript == 'true' | |
name: TypeScript | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest, windows-latest] | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Install Nodejs | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 22 | |
- name: Install xvfb | |
if: matrix.os == 'ubuntu-latest' | |
run: sudo apt-get install -y xvfb | |
- run: npm ci | |
working-directory: ./editors/code | |
# - run: npm audit || { sleep 10 && npm audit; } || { sleep 30 && npm audit; } | |
# if: runner.os == 'Linux' | |
# working-directory: ./editors/code | |
# If this steps fails, your code's type integrity might be wrong at some places at TypeScript level. | |
- run: npm run typecheck | |
working-directory: ./editors/code | |
# You may fix the code automatically by running `npm run lint:fix` if this steps fails. | |
- run: npm run lint | |
working-directory: ./editors/code | |
# To fix this steps, please run `npm run format`. | |
- run: npm run format:check | |
working-directory: ./editors/code | |
- name: Run VS Code tests (Linux) | |
if: matrix.os == 'ubuntu-latest' | |
env: | |
VSCODE_CLI: 1 | |
run: xvfb-run npm test | |
working-directory: ./editors/code | |
- name: Run VS Code tests (Windows) | |
if: matrix.os == 'windows-latest' | |
env: | |
VSCODE_CLI: 1 | |
run: npm test | |
working-directory: ./editors/code | |
- run: npm run package --scripts-prepend-node-path | |
working-directory: ./editors/code | |
typo-check: | |
name: Typo Check | |
runs-on: ubuntu-latest | |
timeout-minutes: 10 | |
env: | |
FORCE_COLOR: 1 | |
TYPOS_VERSION: v1.28.3 | |
steps: | |
- name: download typos | |
run: curl -LsSf https://github.com/crate-ci/typos/releases/download/$TYPOS_VERSION/typos-$TYPOS_VERSION-x86_64-unknown-linux-musl.tar.gz | tar zxf - -C ${CARGO_HOME:-~/.cargo}/bin | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
ref: ${{ github.event.pull_request.head.sha }} | |
- name: check for typos | |
run: typos | |
conclusion: | |
needs: [rust, rust-cross, typescript, typo-check, proc-macro-srv, miri, rustfmt, analysis-stats] | |
# We need to ensure this job does *not* get skipped if its dependencies fail, | |
# because a skipped job is considered a success by GitHub. So we have to | |
# overwrite `if:`. We use `!cancelled()` to ensure the job does still not get run | |
# when the workflow is canceled manually. | |
# | |
# ALL THE PREVIOUS JOBS NEED TO BE ADDED TO THE `needs` SECTION OF THIS JOB! | |
if: ${{ !cancelled() }} | |
runs-on: ubuntu-latest | |
steps: | |
# Manually check the status of all dependencies. `if: failure()` does not work. | |
- name: Conclusion | |
run: | | |
# Print the dependent jobs to see them in the CI log | |
jq -C <<< '${{ toJson(needs) }}' | |
# Check if all jobs that we depend on (in the needs array) were successful (or have been skipped). | |
jq --exit-status 'all(.result == "success" or .result == "skipped")' <<< '${{ toJson(needs) }}' |