Experimental: Unified LSP server in rewatch #9518
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
| name: CI | |
| on: | |
| push: | |
| branches: [master, 11.0_release, rewatch-lsp] | |
| # See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#filter-pattern-cheat-sheet | |
| tags: | |
| - "v[0-9]+.[0-9]+.[0-9]+" | |
| - "v[0-9]+.[0-9]+.[0-9]+-*" | |
| pull_request: | |
| branches: [master, 11.0_release] | |
| concurrency: | |
| group: ci-${{ github.ref }}-1 | |
| # Cancel previous builds for pull requests only. | |
| cancel-in-progress: ${{ github.event_name == 'pull_request' }} | |
| env: | |
| OCAMLRUNPARAM: b | |
| RUST_BACKTRACE: "1" | |
| RUSTFLAGS: "-Dwarnings" | |
| jobs: | |
| build-compiler: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-24.04 # x64 | |
| ocaml_compiler: ocaml-variants.5.3.0+options,ocaml-option-static | |
| node-target: linux-x64 | |
| rust-target: x86_64-unknown-linux-musl | |
| - os: ubuntu-24.04-arm # ARM | |
| ocaml_compiler: ocaml-variants.5.3.0+options,ocaml-option-static | |
| node-target: linux-arm64 | |
| rust-target: aarch64-unknown-linux-musl | |
| - os: macos-15-intel # x64 | |
| ocaml_compiler: 5.3.0 | |
| node-target: darwin-x64 | |
| rust-target: x86_64-apple-darwin | |
| - os: macos-15 # ARM | |
| ocaml_compiler: 5.3.0 | |
| node-target: darwin-arm64 | |
| rust-target: aarch64-apple-darwin | |
| - os: windows-2025 | |
| ocaml_compiler: 5.3.0 | |
| node-target: win32-x64 | |
| rust-target: x86_64-pc-windows-gnu | |
| exe-suffix: ".exe" | |
| # Verify that the compiler still builds with the oldest OCaml version we support. | |
| - os: ubuntu-24.04 | |
| ocaml_compiler: ocaml-variants.5.0.0+options,ocaml-option-static | |
| node-target: linux-x64 | |
| rust-target: x86_64-unknown-linux-musl | |
| runs-on: ${{matrix.os}} | |
| env: | |
| # When changing the setup-ocaml version, also adjust it in the setup step further below. | |
| SETUP_OCAML_VERSION: 3.4.6 # OPAM <2.6.0 | |
| steps: | |
| - name: "Windows: Set git config" | |
| if: runner.os == 'Windows' | |
| run: | | |
| git config --system core.autocrlf false | |
| git config --system core.eol lf | |
| git config --system core.longpaths true | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| - name: Use Node.js | |
| uses: actions/setup-node@v6 | |
| with: | |
| cache: yarn | |
| node-version-file: .nvmrc | |
| - name: Install npm packages | |
| run: yarn install | |
| - name: Install dependencies (Linux) | |
| if: runner.os == 'Linux' | |
| uses: awalsh128/cache-apt-pkgs-action@v1.4.3 | |
| with: | |
| # https://github.com/ocaml/setup-ocaml/blob/2f57267f071bc8547dfcb9433ff21d44fffef190/packages/setup-ocaml/src/unix.ts#L48 | |
| # plus OPAM wants cmake | |
| packages: bubblewrap darcs g++-multilib gcc-multilib mercurial musl-tools rsync cmake | |
| version: v4 | |
| - name: Restore rewatch build cache | |
| id: rewatch-build-cache | |
| uses: actions/cache@v5 | |
| with: | |
| path: rewatch/target | |
| key: rewatch-build-v3-${{ matrix.rust-target }}-${{ hashFiles('rewatch/src/**', 'rewatch/Cargo.lock') }} | |
| - name: Determine Rust toolchain version | |
| id: rust-version | |
| shell: bash | |
| run: | | |
| version="$(awk -F '"' '/^rust-version[[:space:]]*=/ { print $2; exit }' rewatch/Cargo.toml)" | |
| if [ -z "$version" ]; then | |
| echo "rust-version missing in rewatch/Cargo.toml" >&2 | |
| exit 1 | |
| fi | |
| echo "version=${version}" >> "$GITHUB_OUTPUT" | |
| - name: Install rust toolchain | |
| if: steps.rewatch-build-cache.outputs.cache-hit != 'true' | |
| uses: dtolnay/rust-toolchain@master | |
| with: | |
| toolchain: ${{ steps.rust-version.outputs.version }} | |
| targets: ${{ matrix.rust-target }} | |
| components: clippy, rustfmt | |
| - name: Build rewatch | |
| if: steps.rewatch-build-cache.outputs.cache-hit != 'true' | |
| run: | | |
| cargo build --manifest-path rewatch/Cargo.toml --target ${{ matrix.rust-target }} --release | |
| - name: Lint rewatch | |
| if: steps.rewatch-build-cache.outputs.cache-hit != 'true' | |
| run: | | |
| cargo clippy --manifest-path rewatch/Cargo.toml --all-targets --all-features | |
| - name: Run rewatch unit tests | |
| if: steps.rewatch-build-cache.outputs.cache-hit != 'true' | |
| run: | | |
| cargo test --manifest-path rewatch/Cargo.toml --release | |
| - name: Copy rewatch binary | |
| run: | | |
| cp rewatch/target/${{ matrix.rust-target }}/release/rescript${{ matrix.exe-suffix }} rescript | |
| mkdir -p rewatch/target/release | |
| cp rewatch/target/${{ matrix.rust-target }}/release/rescript${{ matrix.exe-suffix }} rewatch/target/release | |
| ./scripts/copyExes.js --rewatch | |
| shell: bash | |
| # matrix.ocaml_compiler may contain commas | |
| - name: Get OPAM cache key | |
| shell: bash | |
| run: echo "opam_cache_key=opam-env-v8-${{ matrix.os }}-${{ env.SETUP_OCAML_VERSION }}-${{ matrix.ocaml_compiler }}-${{ hashFiles('*.opam') }}" | sed 's/,/-/g' >> $GITHUB_ENV | |
| - name: Restore OPAM environment | |
| id: cache-opam-env | |
| uses: actions/cache/restore@v5 | |
| with: | |
| path: | | |
| ${{ runner.tool_cache }}/opam | |
| ~/.opam | |
| _opam | |
| .opam-path | |
| C:\cygwin | |
| C:\.opam | |
| key: ${{ env.opam_cache_key }} | |
| - name: Use OCaml ${{matrix.ocaml_compiler}} | |
| uses: ocaml/setup-ocaml@v3.4.8 | |
| if: steps.cache-opam-env.outputs.cache-hit != 'true' | |
| with: | |
| ocaml-compiler: ${{matrix.ocaml_compiler}} | |
| opam-pin: false | |
| - name: Get OPAM executable path | |
| if: steps.cache-opam-env.outputs.cache-hit != 'true' | |
| uses: actions/github-script@v8 | |
| with: | |
| script: | | |
| const opamPath = await io.which('opam', true); | |
| console.log('opam executable found: %s', opamPath); | |
| const fs = require('fs/promises'); | |
| await fs.writeFile('.opam-path', opamPath, 'utf-8'); | |
| console.log('stored path to .opam-path'); | |
| - name: Install OPAM dependencies | |
| if: steps.cache-opam-env.outputs.cache-hit != 'true' | |
| run: opam install . --deps-only --with-test | |
| - name: Cache OPAM environment | |
| if: steps.cache-opam-env.outputs.cache-hit != 'true' | |
| uses: actions/cache/save@v5 | |
| with: | |
| path: | | |
| ${{ runner.tool_cache }}/opam | |
| ~/.opam | |
| _opam | |
| .opam-path | |
| C:\cygwin | |
| C:\.opam | |
| key: ${{ env.opam_cache_key }} | |
| - name: Use cached OPAM environment | |
| if: steps.cache-opam-env.outputs.cache-hit == 'true' | |
| run: | | |
| # https://github.com/ocaml/setup-ocaml/blob/v3.4.6/packages/setup-ocaml/src/installer.ts | |
| echo "OPAMCOLOR=always" >> "$GITHUB_ENV" | |
| echo "OPAMCONFIRMLEVEL=unsafe-yes" >> "$GITHUB_ENV" | |
| echo "OPAMDOWNLOADJOBS=4" >> "$GITHUB_ENV" | |
| echo "OPAMERRLOGLEN=0" >> "$GITHUB_ENV" | |
| echo "OPAMEXTERNALSOLVER=builtin-0install" >> "$GITHUB_ENV" | |
| echo "OPAMPRECISETRACKING=1" >> "$GITHUB_ENV" | |
| echo "OPAMRETRIES=10" >> "$GITHUB_ENV" | |
| echo "OPAMSOLVERTIMEOUT=600" >> "$GITHUB_ENV" | |
| echo "OPAMYES=1" >> "$GITHUB_ENV" | |
| echo "CLICOLOR_FORCE=1" >> "$GITHUB_ENV" | |
| if [[ "$RUNNER_OS" != "Windows" ]]; then | |
| echo "OPAMROOT=$HOME/.opam" >> "$GITHUB_ENV" | |
| else | |
| echo "OPAMROOT=C:\\.opam" >> "$GITHUB_ENV" | |
| fi | |
| OPAM_PATH="$(cat .opam-path)" | |
| chmod +x "$OPAM_PATH" | |
| dirname "$OPAM_PATH" >> "$GITHUB_PATH" | |
| if [[ "$RUNNER_OS" == "Windows" ]]; then | |
| fsutil behavior query SymlinkEvaluation | |
| fsutil behavior set symlinkEvaluation R2L:1 R2R:1 | |
| fsutil behavior query SymlinkEvaluation | |
| echo "HOME=$USERPROFILE" >> "$GITHUB_ENV" | |
| echo "MSYS=winsymlinks:native" >> "$GITHUB_ENV" | |
| echo "CYGWIN=winsymlinks:native" >> "$GITHUB_ENV" | |
| echo "BASH_ENV=C:\\cygwin\\bash_env" >> "$GITHUB_ENV" | |
| fi | |
| shell: bash | |
| - name: Compiler build state key | |
| id: compiler-build-state-key | |
| shell: bash | |
| run: | | |
| echo "value=compiler-build-state-v1-${{ matrix.os }}-${{ env.SETUP_OCAML_VERSION }}-${{ matrix.ocaml_compiler }}-${{ hashFiles('*.opam') }}" \ | |
| | sed 's/,/-/g' >> "$GITHUB_OUTPUT" | |
| - name: Restore compiler build state | |
| if: github.base_ref == 'master' || github.ref == 'refs/heads/master' | |
| id: compiler-build-state | |
| uses: actions/cache/restore@v5 | |
| with: | |
| path: | | |
| C:\.cache\dune | |
| ~/.cache/dune | |
| _build | |
| key: ${{ steps.compiler-build-state-key.outputs.value }} | |
| - name: Build compiler | |
| if: runner.os != 'Linux' | |
| run: opam exec -- dune build --display quiet --profile release | |
| - name: Build compiler (Linux static) | |
| if: runner.os == 'Linux' | |
| run: opam exec -- dune build --display quiet --profile static | |
| - name: Delete stable compiler build state | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/master' | |
| shell: bash | |
| run: | | |
| gh extension install actions/gh-actions-cache | |
| gh actions-cache delete ${{ steps.compiler-build-state-key.outputs.value }} \ | |
| -R ${{ github.repository }} \ | |
| -B "$GITHUB_REF" \ | |
| --confirm || echo "not exist" | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| - name: Save compiler build state | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/master' | |
| uses: actions/cache/save@v5 | |
| with: | |
| path: | | |
| C:\.cache\dune | |
| ~/.cache/dune | |
| _build | |
| key: ${{ steps.compiler-build-state-key.outputs.value }} | |
| - name: Copy compiler exes to platform bin dir | |
| run: node scripts/copyExes.js --compiler | |
| - name: Build @rescript/runtime | |
| run: yarn workspace @rescript/runtime build | |
| shell: bash | |
| - name: Check for changes in @rescript/runtime/lib | |
| run: git diff --exit-code lib/js lib/es6 | |
| working-directory: packages/@rescript/runtime | |
| - name: Version Check | |
| run: yarn constraints | |
| - name: Run tests | |
| run: node scripts/test.js -all | |
| - name: Check for diffs in tests folder | |
| run: git diff --ignore-cr-at-eol --exit-code tests | |
| - name: Run analysis / tools tests | |
| if: runner.os != 'Windows' && runner.os != 'Linux' | |
| run: opam exec -- make -C tests/analysis_tests test && make -C tests/tools_tests test | |