move Lazy module to Stdlib #6514
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] | |
# 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 | |
jobs: | |
build-rewatch: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: macos-13 # x64 | |
rust-target: x86_64-apple-darwin | |
- os: macos-14 # ARM | |
rust-target: aarch64-apple-darwin | |
- os: ubuntu-24.04 # x64 | |
rust-target: x86_64-unknown-linux-musl | |
- os: ubuntu-24.04-arm # ARM | |
rust-target: aarch64-unknown-linux-musl | |
- os: windows-latest | |
rust-target: x86_64-pc-windows-gnu | |
runs-on: ${{matrix.os}} | |
env: | |
RUST_BACKTRACE: "1" | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Use Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version-file: .nvmrc | |
- name: Restore build cache | |
id: build-cache | |
uses: actions/cache@v4 | |
with: | |
path: rewatch/target | |
key: rewatch-build-v2-${{ matrix.rust-target }}-${{ hashFiles('rewatch/src/**', 'rewatch/Cargo.lock') }} | |
- name: Install musl gcc | |
if: steps.build-cache.outputs.cache-hit != 'true' && runner.os == 'Linux' | |
run: sudo apt-get install -y --no-install-recommends musl-tools | |
- name: Install rust toolchain | |
if: steps.build-cache.outputs.cache-hit != 'true' | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: stable | |
targets: ${{matrix.rust-target}} | |
- name: Build rewatch | |
if: steps.build-cache.outputs.cache-hit != 'true' | |
run: cargo build --manifest-path rewatch/Cargo.toml --target ${{matrix.rust-target}} --release | |
- name: Copy rewatch exe to platform bin dir | |
run: | | |
cp rewatch/target/${{matrix.rust-target}}/release/rewatch${{ runner.os == 'Windows' && '.exe' || '' }} rewatch | |
node ./scripts/copyExes.js -rewatch | |
- name: Get artifact dir name | |
run: node .github/workflows/get_artifact_dir_name.js | |
- name: "Upload artifact: rewatch binary" | |
uses: actions/upload-artifact@v4 | |
with: | |
name: rewatch-${{env.artifact_dir_name}} | |
path: ${{ env.artifact_dir_name }} | |
build-compiler: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- os: ubuntu-24.04 # x64 | |
ocaml_compiler: ocaml-variants.5.3.0+options,ocaml-option-static | |
upload_binaries: true | |
upload_libs: true | |
- os: ubuntu-24.04-arm # ARM | |
ocaml_compiler: ocaml-variants.5.3.0+options,ocaml-option-static | |
upload_binaries: true | |
# Build the playground compiler and run the benchmarks on the fastest runner | |
build_playground: true | |
benchmarks: true | |
- os: macos-13 # x64 | |
ocaml_compiler: 5.3.0 | |
upload_binaries: true | |
- os: macos-14 # ARM | |
ocaml_compiler: 5.3.0 | |
upload_binaries: true | |
- os: windows-latest | |
ocaml_compiler: 5.3.0 | |
upload_binaries: true | |
# Verify that the compiler still builds with older OCaml versions | |
- os: ubuntu-24.04 | |
ocaml_compiler: ocaml-variants.5.2.1+options,ocaml-option-static | |
- os: ubuntu-24.04 | |
ocaml_compiler: ocaml-variants.5.0.0+options,ocaml-option-static | |
- os: ubuntu-24.04 | |
ocaml_compiler: ocaml-variants.4.14.2+options,ocaml-option-static | |
runs-on: ${{matrix.os}} | |
env: | |
# setup-ocaml opam version cannot be configured | |
# we do track its version manually | |
OPAM_VERSION: 2.3.0 | |
DUNE_PROFILE: release | |
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@v4 | |
- name: Use Node.js | |
uses: actions/setup-node@v4 | |
with: | |
cache: yarn | |
node-version-file: .nvmrc | |
- name: Get artifact dir name | |
run: node .github/workflows/get_artifact_dir_name.js | |
- name: Install dependencies (Linux) | |
if: runner.os == 'Linux' | |
uses: awalsh128/[email protected] | |
with: | |
# See https://github.com/ocaml/setup-ocaml/blob/b2105f9/packages/setup-ocaml/src/unix.ts#L9 | |
packages: bubblewrap darcs g++-multilib gcc-multilib mercurial musl-tools rsync | |
version: v3 | |
# matrix.ocaml_compiler may contain commas | |
- name: Get OPAM cache key | |
shell: bash | |
run: echo "opam_cache_key=opam-env-v7-${{ matrix.os }}-${{ matrix.ocaml_compiler }}-${{ hashFiles('*.opam') }}" | sed 's/,/-/g' >> $GITHUB_ENV | |
- name: Restore OPAM environment | |
id: cache-opam-env | |
uses: actions/cache/restore@v4 | |
with: | |
path: | | |
${{ runner.tool_cache }}/opam | |
~/.opam | |
_opam | |
.opam-path | |
D:\cygwin | |
D:\.opam | |
key: ${{ env.opam_cache_key }} | |
- name: Use OCaml ${{matrix.ocaml_compiler}} | |
uses: ocaml/[email protected] | |
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@v7 | |
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@v4 | |
with: | |
path: | | |
${{ runner.tool_cache }}/opam | |
~/.opam | |
_opam | |
.opam-path | |
D:\cygwin | |
D:\.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/b2105f9/packages/setup-ocaml/src/installer.ts#L33 | |
echo "OPAMVERBOSE=$RUNNER_DEBUG" >> "$GITHUB_ENV" | |
echo "OPAMCOLOR=always" >> "$GITHUB_ENV" | |
echo "OPAMCONFIRMLEVEL=unsafe-yes" >> "$GITHUB_ENV" | |
echo "OPAMERRLOGLEN=0" >> "$GITHUB_ENV" | |
echo "OPAMPRECISETRACKING=1" >> "$GITHUB_ENV" | |
echo "OPAMYES=1" >> "$GITHUB_ENV" | |
if [[ "$RUNNER_OS" != "Windows" ]]; then | |
echo "OPAMROOT=$HOME/.opam" >> "$GITHUB_ENV" | |
else | |
echo "OPAMROOT=D:\\.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 | |
CYGWIN="winsymlinks:native" | |
CYGWIN_ROOT="D:\\cygwin" | |
CYGWIN_ROOT_BIN="D:\\cygwin\\bin" | |
CYGWIN_ROOT_WRAPPERBIN="D:\\cygwin\\wrapperbin" | |
echo "HOME=$USERPROFILE" >> "$GITHUB_ENV" | |
echo "MSYS=winsymlinks:native" >> "$GITHUB_ENV" | |
echo "CYGWIN=$CYGWIN" >> "$GITHUB_ENV" | |
echo "CYGWIN_ROOT=$CYGWIN_ROOT" >> "$GITHUB_ENV" | |
echo "CYGWIN_ROOT_BIN=$CYGWIN_ROOT_BIN" >> "$GITHUB_ENV" | |
echo "CYGWIN_ROOT_WRAPPERBIN=$CYGWIN_ROOT_WRAPPERBIN" >> "$GITHUB_ENV" | |
echo "$CYGWIN_ROOT_WRAPPERBIN" >> "$GITHUB_PATH" | |
fi | |
shell: bash | |
- name: Compiler build state key | |
id: compiler-build-state-key | |
shell: bash | |
run: | | |
echo "value=compiler-build-state-v1-${{ matrix.os }}-${{ 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@v4 | |
with: | |
path: | | |
D:\.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@v4 | |
with: | |
path: | | |
D:\.cache\dune | |
~/.cache/dune | |
_build | |
key: ${{ steps.compiler-build-state-key.outputs.value }} | |
- name: Install npm packages | |
run: yarn install | |
- name: Copy compiler exes to platform bin dir | |
run: node ./scripts/copyExes.js -compiler | |
- name: Restore ninja build cache | |
id: ninja-build-cache | |
uses: actions/cache@v4 | |
with: | |
path: ${{ env.artifact_dir_name }}/ninja.exe | |
key: ninja-build-v1-${{ matrix.os }}-${{ hashFiles('ninja/src/**') }} | |
- name: Setup Python for ninja build | |
if: steps.ninja-build-cache.outputs.cache-hit != 'true' | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.10" | |
- name: Setup MSVC for ninja build (Windows) | |
if: steps.ninja-build-cache.outputs.cache-hit != 'true' && runner.os == 'Windows' | |
uses: TheMrMilchmann/setup-msvc-dev@v3 | |
with: | |
arch: x64 | |
- name: Build ninja | |
if: steps.ninja-build-cache.outputs.cache-hit != 'true' && runner.os != 'Linux' | |
run: node scripts/buildNinjaBinary.js | |
- name: Build ninja (Linux static) | |
if: steps.ninja-build-cache.outputs.cache-hit != 'true' && runner.os == 'Linux' | |
env: | |
LDFLAGS: -static | |
run: node scripts/buildNinjaBinary.js | |
- name: Copy ninja exe to platform bin dir | |
if: steps.ninja-build-cache.outputs.cache-hit != 'true' | |
run: node ./scripts/copyExes.js -ninja | |
- name: "Syntax: Run roundtrip tests" | |
if: ${{ runner.os != 'Windows' }} | |
run: opam exec -- make test-syntax-roundtrip | |
- name: "Syntax: Run tests (Windows)" | |
if: ${{ runner.os == 'Windows' }} | |
run: opam exec -- make test-syntax | |
- name: Build runtime/stdlib | |
run: ./scripts/buildRuntime.sh | |
shell: bash | |
- name: Check for changes in lib folder | |
run: git diff --exit-code lib/js lib/es6 | |
- name: Version Check | |
run: ./scripts/prebuilt.js | |
- 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 | |
- name: Run gentype tests | |
if: runner.os != 'Windows' | |
run: make -C tests/gentype_tests/typescript-react-example clean test | |
- name: Run syntax benchmarks | |
if: matrix.benchmarks | |
run: ./_build/install/default/bin/syntax_benchmarks | tee tests/benchmark-output.json | |
# Benchmarking is disabled for now because of inconsistent run times on different runners | |
# | |
# - name: Restore previous benchmark data | |
# if: matrix.benchmarks | |
# uses: actions/cache/restore@v4 | |
# with: | |
# path: ./tests/benchmark-cache | |
# key: syntax-benchmark-v1 | |
# - name: Create new benchmark data and comment on alert | |
# # Do not run for PRs created from other repos as those won't be able to write to the pull request | |
# if: ${{ matrix.benchmarks && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.event.repository.full_name) }} | |
# uses: benchmark-action/github-action-benchmark@v1 | |
# with: | |
# name: Syntax Benchmarks | |
# tool: customSmallerIsBetter | |
# output-file-path: tests/benchmark-output.json | |
# external-data-json-path: ./tests/benchmark-cache/benchmark-data.json | |
# github-token: ${{ secrets.GITHUB_TOKEN }} | |
# alert-threshold: "105%" | |
# comment-always: false | |
# comment-on-alert: true | |
# - name: Save benchmark data as new baseline | |
# if: matrix.benchmarks && github.ref == 'refs/heads/master' | |
# uses: actions/cache/save@v4 | |
# with: | |
# path: ./tests/benchmark-cache | |
# key: syntax-benchmark-v1 | |
- name: Build playground compiler | |
if: matrix.build_playground | |
run: opam exec -- make playground playground-cmijs | |
- name: Test playground compiler | |
if: matrix.build_playground | |
run: yarn workspace playground test | |
- name: Upload playground compiler to CDN | |
if: ${{ matrix.build_playground && startsWith(github.ref, 'refs/tags/v') }} | |
env: | |
KEYCDN_USER: ${{ secrets.KEYCDN_USER }} | |
KEYCDN_PASSWORD: ${{ secrets.KEYCDN_PASSWORD }} | |
run: yarn workspace playground upload-bundle | |
- name: "Upload artifacts: binaries" | |
if: matrix.upload_binaries | |
uses: actions/upload-artifact@v4 | |
with: | |
name: binaries-${{ env.artifact_dir_name }} | |
path: ${{ env.artifact_dir_name }} | |
- name: "Upload artifacts: lib/ocaml" | |
if: matrix.upload_libs | |
uses: actions/upload-artifact@v4 | |
with: | |
name: lib-ocaml | |
path: lib/ocaml | |
package: | |
needs: | |
- build-compiler | |
- build-rewatch | |
runs-on: ubuntu-24.04 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Use Node.js | |
uses: actions/setup-node@v4 | |
with: | |
cache: yarn | |
node-version-file: .nvmrc | |
- name: NPM install | |
run: yarn install | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
pattern: "@(binaries-*|rewatch-*|lib-ocaml)" | |
- name: Move artifacts | |
run: ./scripts/moveArtifacts.sh | |
- name: npm pack (rescript) + check artifact list | |
run: node ./scripts/npmPack.js | |
- name: Copy JS files to stdlib package | |
run: mkdir -p packages/std/lib && cp -R lib/es6 lib/js packages/std/lib | |
- name: npm pack (@rescript/std) | |
run: npm pack | |
working-directory: packages/std | |
- name: Prepare package upload | |
# For pull requests, pass the correct commit SHA explicitly as GITHUB_SHA points to the wrong commit. | |
run: node .github/workflows/prepare_package_upload.js ${{ github.event.pull_request.head.sha }} | |
- name: "Upload artifact: npm packages" | |
uses: actions/upload-artifact@v4 | |
with: | |
name: npm-packages | |
path: | | |
rescript-${{ env.rescript_version }}.tgz | |
rescript-std-${{ env.rescript_version }}.tgz | |
outputs: | |
rescript_version: ${{ env.rescript_version }} | |
installationTest: | |
needs: package | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ | |
macos-13, # x64 | |
macos-14, # ARM | |
ubuntu-24.04, | |
ubuntu-24.04-arm, | |
windows-latest, | |
] | |
runs-on: ${{matrix.os}} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Use Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version-file: .nvmrc | |
- name: Make test directory | |
id: tmp-dir | |
shell: bash | |
run: | | |
if [[ "$RUNNER_OS" == "Windows" ]]; then | |
dir=$(powershell -Command "[System.IO.Path]::GetTempPath() + [System.Guid]::NewGuid().ToString()" | tr -d '\r') | |
mkdir -p "$dir" | |
else | |
dir=$(mktemp -d) | |
fi | |
echo "path=$dir" >> "$GITHUB_OUTPUT" | |
cp -r tests/package_tests/installation_test/* "$dir" | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: npm-packages | |
path: ${{ steps.tmp-dir.outputs.path }} | |
- name: Install ReScript package | |
run: | | |
npm i --ignore-scripts --no-audit \ | |
rescript-${{ needs.package.outputs.rescript_version }}.tgz | |
shell: bash | |
working-directory: ${{ steps.tmp-dir.outputs.path }} | |
- name: Test installation | |
run: npx rescript -h && npx rescript build && cat src/Test.res.js | |
shell: bash | |
working-directory: ${{ steps.tmp-dir.outputs.path }} | |
publish: | |
needs: [package, installationTest] | |
if: startsWith(github.ref, 'refs/tags/v') | |
runs-on: ubuntu-24.04 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Use Node.js | |
uses: actions/setup-node@v4 | |
with: | |
cache: yarn | |
node-version-file: .nvmrc | |
registry-url: https://registry.npmjs.org # Needed to make auth work for publishing | |
- name: Download artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: npm-packages | |
- name: Publish packages on npm with tag "ci" | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} | |
run: | | |
npm publish rescript-${{ needs.package.outputs.rescript_version }}.tgz --tag ci | |
npm publish rescript-std-${{ needs.package.outputs.rescript_version }}.tgz --tag ci | |
- name: Update Website Playground | |
env: | |
NEXT_REVALIDATE_SECRET_TOKEN: ${{ secrets.NEXT_REVALIDATE_SECRET_TOKEN }} | |
run: yarn workspace playground revalidate | |
shell: bash |