diff options
Diffstat (limited to 'src/tools/rust-analyzer/.github/workflows/ci.yaml')
| -rw-r--r-- | src/tools/rust-analyzer/.github/workflows/ci.yaml | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/src/tools/rust-analyzer/.github/workflows/ci.yaml b/src/tools/rust-analyzer/.github/workflows/ci.yaml new file mode 100644 index 00000000000..08ad10c2971 --- /dev/null +++ b/src/tools/rust-analyzer/.github/workflows/ci.yaml @@ -0,0 +1,256 @@ +# Please make sure that the `needs` fields for both `end-success` and `end-failure` +# are updated when adding new jobs! + +name: CI +on: + pull_request: + push: + branches: + - auto + - try + - automation/bors/try + +env: + CARGO_INCREMENTAL: 0 + CARGO_NET_RETRY: 10 + CI: 1 + RUST_BACKTRACE: short + RUSTFLAGS: "-D warnings -W unreachable-pub -W bare-trait-objects" + RUSTUP_MAX_RETRIES: 10 + +jobs: + changes: + runs-on: ubuntu-latest + permissions: + pull-requests: read + outputs: + typescript: ${{ steps.filter.outputs.typescript }} + proc_macros: ${{ steps.filter.outputs.proc_macros }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@1441771bbfdd59dcd748680ee64ebd8faab1a242 + id: filter + with: + filters: | + typescript: + - 'editors/code/**' + proc_macros: + - 'crates/proc-macro-api/**' + - 'crates/proc-macro-srv/**' + - 'crates/proc-macro-srv-cli/**' + + rust: + needs: changes + if: github.repository == 'rust-lang/rust-analyzer' + name: Rust + runs-on: ${{ matrix.os }} + env: + CC: deny_c + RUST_CHANNEL: "${{ needs.changes.outputs.proc_macros == 'true' && 'nightly' || 'stable' }}" + USE_SYSROOT_ABI: "${{ needs.changes.outputs.proc_macros == 'true' && '--features sysroot-abi' || '' }}" + + strategy: + fail-fast: false + 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 ${{ env.RUST_CHANNEL }} + rustup component add --toolchain ${{ env.RUST_CHANNEL }} rustfmt rust-src + rustup default ${{ env.RUST_CHANNEL }} + # 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@640a22190e7a783d4c409684cea558f081f92012 + with: + key: ${{ env.RUST_CHANNEL }} + + - name: Bump opt-level + if: matrix.os == 'ubuntu-latest' + run: sed -i '/\[profile.dev]/a opt-level=1' Cargo.toml + + - name: Codegen checks (rust-analyzer) + run: cargo codegen --check + + - name: Compile (tests) + run: cargo test --no-run --locked ${{ env.USE_SYSROOT_ABI }} + + # It's faster to `test` before `build` ¯\_(ツ)_/¯ + - name: Compile (rust-analyzer) + if: matrix.os == 'ubuntu-latest' + run: cargo build --quiet ${{ env.USE_SYSROOT_ABI }} + + - name: Test + if: matrix.os == 'ubuntu-latest' || github.event_name == 'push' + run: cargo test ${{ env.USE_SYSROOT_ABI }} -- --nocapture --quiet + + - name: Switch to stable toolchain + run: | + rustup update --no-self-update stable + rustup component add --toolchain stable rust-src clippy + rustup default stable + + - name: Run analysis-stats on rust-analyzer + if: matrix.os == 'ubuntu-latest' + run: target/${{ matrix.target }}/debug/rust-analyzer analysis-stats . + + - name: Run analysis-stats on rust std library + if: matrix.os == 'ubuntu-latest' + env: + RUSTC_BOOTSTRAP: 1 + run: target/${{ matrix.target }}/debug/rust-analyzer analysis-stats --with-deps $(rustc --print sysroot)/lib/rustlib/src/rust/library/std + + - name: clippy + if: matrix.os == 'windows-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 + + - name: rustfmt + if: matrix.os == 'ubuntu-latest' + run: cargo fmt -- --check + + # Weird targets to catch non-portable code + rust-cross: + if: github.repository == 'rust-lang/rust-analyzer' + name: Rust Cross + runs-on: ubuntu-latest + + env: + targets: "powerpc-unknown-linux-gnu x86_64-unknown-linux-musl" + # The rust-analyzer binary is not expected to compile on WASM, but the IDE + # crate should + targets_ide: "wasm32-unknown-unknown" + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Rust toolchain + run: | + rustup update --no-self-update stable + rustup target add ${{ env.targets }} ${{ env.targets_ide }} + + - name: Cache Dependencies + uses: Swatinem/rust-cache@640a22190e7a783d4c409684cea558f081f92012 + + - name: Check + run: | + for target in ${{ env.targets }}; do + cargo check --target=$target --all-targets + done + for target in ${{ env.targets_ide }}; do + cargo check -p ide --target=$target --all-targets + done + + typescript: + needs: changes + if: github.repository == 'rust-lang/rust-analyzer' + name: TypeScript + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + if: needs.changes.outputs.typescript == 'true' + + - name: Install Nodejs + uses: actions/setup-node@v4 + with: + node-version: 18 + if: needs.changes.outputs.typescript == 'true' + + - name: Install xvfb + if: matrix.os == 'ubuntu-latest' && needs.changes.outputs.typescript == 'true' + run: sudo apt-get install -y xvfb + + - run: npm ci + working-directory: ./editors/code + if: needs.changes.outputs.typescript == 'true' + + # - 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 + if: needs.changes.outputs.typescript == 'true' + + # You may fix the code automatically by running `npm run lint:fix` if this steps fails. + - run: npm run lint + working-directory: ./editors/code + if: needs.changes.outputs.typescript == 'true' + + # To fix this steps, please run `npm run format`. + - run: npm run format:check + working-directory: ./editors/code + if: needs.changes.outputs.typescript == 'true' + + - name: Run VS Code tests (Linux) + if: matrix.os == 'ubuntu-latest' && needs.changes.outputs.typescript == 'true' + env: + VSCODE_CLI: 1 + run: xvfb-run npm test + working-directory: ./editors/code + + - name: Run VS Code tests (Windows) + if: matrix.os == 'windows-latest' && needs.changes.outputs.typescript == 'true' + env: + VSCODE_CLI: 1 + run: npm test + working-directory: ./editors/code + + - run: npm run package --scripts-prepend-node-path + working-directory: ./editors/code + if: needs.changes.outputs.typescript == 'true' + + typo-check: + name: Typo Check + runs-on: ubuntu-latest + timeout-minutes: 10 + env: + FORCE_COLOR: 1 + TYPOS_VERSION: v1.18.0 + 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 + + end-success: + name: bors build finished + if: github.event.pusher.name == 'bors' && success() + runs-on: ubuntu-latest + needs: [rust, rust-cross, typescript, typo-check] + steps: + - name: Mark the job as successful + run: exit 0 + + end-failure: + name: bors build finished + if: github.event.pusher.name == 'bors' && !success() + runs-on: ubuntu-latest + needs: [rust, rust-cross, typescript, typo-check] + steps: + - name: Mark the job as a failure + run: exit 1 |
