Skip to content

Experimental: Unified LSP server in rewatch #9518

Experimental: Unified LSP server in rewatch

Experimental: Unified LSP server in rewatch #9518

Workflow file for this run

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