Freely configurable suffix for generated .js files #2990
Workflow file for this run
This file contains 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] | |
# 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] | |
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 statically linked Linux binaries in an Alpine-based Docker container | |
# See https://ocamlpro.com/blog/2021_09_02_generating_static_and_portable_executables_with_ocaml | |
# for more info. | |
# The container already comes with all required tools pre-installed | |
# (see https://github.com/rescript-lang/docker-rescript-ci-build/blob/main/Dockerfile). | |
static-binaries-linux: | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ubuntu-latest, buildjet-2vcpu-ubuntu-2204-arm] | |
runs-on: ${{matrix.os}} | |
container: | |
image: ghcr.io/rescript-lang/rescript-ci-build:v1.1.0 | |
steps: | |
# See https://github.com/actions/runner/issues/801#issuecomment-1374967227. | |
- name: Workaround for Github actions runner on Alpine arm64 | |
if: runner.arch == 'ARM64' | |
run: sed -i "s:ID=alpine:ID=NotpineForGHA:" /etc/os-release | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Build compiler binaries | |
run: opam exec -- dune build --display quiet --profile static | |
- name: Build ninja binary | |
working-directory: ninja | |
env: | |
LDFLAGS: -static | |
run: python3 configure.py --bootstrap --verbose | |
- name: "Upload artifacts" | |
uses: actions/upload-artifact@v3 | |
with: | |
name: static-binaries-linux-${{runner.arch}} | |
path: | | |
_build/install/default/bin | |
ninja/ninja | |
# The full build including tests does not work on Linux ARM because setup-ocaml fails. | |
# Therefore, only upload the binaries from the static build | |
upload-linux-arm64-binaries: | |
needs: | |
- static-binaries-linux | |
runs-on: buildjet-2vcpu-ubuntu-2204-arm | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Download static linux binaries | |
if: runner.os == 'Linux' | |
uses: actions/download-artifact@v3 | |
with: | |
name: static-binaries-linux-${{ runner.arch }} | |
- name: Make static linux binaries executable | |
if: runner.os == 'Linux' | |
run: | | |
chmod +x ninja/ninja | |
chmod +x _build/install/default/bin/* | |
- name: Use Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: 16 | |
- name: Copy exes to platform bin dirs | |
run: node ./scripts/copyExes.js | |
- name: Prepare artifact upload | |
run: node .github/workflows/get_artifact_info.js | |
- name: "Upload artifacts: binaries" | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ env.artifact_name }} | |
path: ${{ env.artifact_path }} | |
build: | |
needs: static-binaries-linux | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [macos-latest, ubuntu-latest, windows-latest, macos-arm] | |
ocaml_compiler: [4.14.0] | |
runs-on: ${{matrix.os}} | |
env: | |
DUNE_PROFILE: release | |
steps: | |
- name: "Windows: Set git to use LF" | |
if: runner.os == 'Windows' | |
run: | | |
git config --global core.autocrlf false | |
git config --global core.eol lf | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 2 # to be able to check for changes in subfolder jscomp/syntax later | |
- name: Download static linux binaries | |
if: runner.os == 'Linux' | |
uses: actions/download-artifact@v3 | |
with: | |
name: static-binaries-linux-${{ runner.arch }} | |
- name: Make static linux binaries executable | |
if: runner.os == 'Linux' | |
run: | | |
chmod +x ninja/ninja | |
chmod +x _build/install/default/bin/* | |
- name: Use OCaml ${{matrix.ocaml_compiler}} | |
uses: ocaml/setup-ocaml@v2 | |
with: | |
ocaml-compiler: ${{matrix.ocaml_compiler}} | |
opam-pin: false | |
opam-depext: false | |
- name: "Install OPAM dependencies" | |
run: opam install . --deps-only | |
- name: "Build compiler" | |
if: runner.os != 'Linux' | |
run: opam exec -- dune build --display quiet --profile release | |
- name: Use Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: 16 | |
- name: Install npm packages | |
run: npm ci --ignore-scripts | |
- name: "Windows: Use MSVC for ninja build" | |
if: runner.os == 'Windows' | |
uses: TheMrMilchmann/setup-msvc-dev@v2 | |
with: | |
arch: x64 | |
- name: Build ninja | |
if: runner.os != 'Linux' | |
run: node scripts/buildNinjaBinary.js | |
- name: Copy exes to platform bin dirs | |
run: node ./scripts/copyExes.js | |
- name: "Check if syntax subfolder has changed" | |
id: syntax-diff | |
shell: bash | |
run: | | |
if git diff --name-only --exit-code HEAD^ HEAD -- jscomp/syntax; then | |
echo "syntax_status=unchanged" >> $GITHUB_ENV | |
else | |
echo "syntax_status=changed" >> $GITHUB_ENV | |
fi | |
- name: "Syntax: Run roundtrip tests" | |
if: ${{ env.syntax_status == 'changed' && runner.os != 'Windows' }} | |
run: opam exec -- make test-syntax-roundtrip | |
- name: "Syntax: Run tests (Windows)" | |
if: ${{ env.syntax_status == 'changed' && runner.os == 'Windows' }} | |
run: opam exec -- make test-syntax | |
- name: Build runtime/stdlib | |
if: runner.os != 'Windows' | |
run: | | |
opam exec -- node ./scripts/ninja.js config | |
opam exec -- node ./scripts/ninja.js build | |
- name: Check for changes in lib folder | |
run: git diff --exit-code lib/js lib/es6 | |
- name: Populate lib/ocaml | |
run: ./scripts/prebuilt.js | |
- name: Run tests | |
if: runner.os != 'Windows' | |
run: node scripts/ciTest.js -all | |
- name: Run gentype tests | |
if: runner.os != 'Windows' | |
run: make -C jscomp/gentype_tests/typescript-react-example clean test | |
- name: Run tests (Windows) | |
if: runner.os == 'Windows' | |
run: node scripts/ciTest.js -mocha -theme -format | |
# Build the playground compiler on our fastest runner (macOS ARM) | |
- name: Install JSOO | |
if: matrix.os == 'macos-arm' | |
run: opam install js_of_ocaml.4.0.0 | |
- name: Build playground compiler | |
if: matrix.os == 'macos-arm' | |
run: | | |
opam exec -- node packages/playground-bundling/scripts/generate_cmijs.js | |
opam exec -- dune build --profile browser | |
cp ./_build/default/jscomp/jsoo/jsoo_playground_main.bc.js playground/compiler.js | |
- name: Test playground compiler | |
if: matrix.os == 'macos-arm' | |
run: node playground/playground_test.js | |
- name: Upload playground compiler to CDN | |
if: ${{ matrix.os == 'macos-arm' && startsWith(github.ref, 'refs/tags/v') }} | |
env: | |
KEYCDN_USER: ${{ secrets.KEYCDN_USER }} | |
KEYCDN_PASSWORD: ${{ secrets.KEYCDN_PASSWORD }} | |
run: sh playground/upload_bundle.sh | |
- name: Prepare artifact upload | |
run: node .github/workflows/get_artifact_info.js | |
- name: "Upload artifacts: binaries" | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ env.artifact_name }} | |
path: ${{ env.artifact_path }} | |
- name: "Upload artifacts: lib/ocaml" | |
if: runner.os == 'Linux' | |
uses: actions/upload-artifact@v3 | |
with: | |
name: lib-ocaml | |
path: lib/ocaml | |
package: | |
needs: build | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Use Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: 16 | |
- name: NPM install | |
run: npm ci --ignore-scripts | |
- name: Download artifacts | |
uses: actions/download-artifact@v3 | |
- name: Move artifacts | |
run: ./scripts/moveArtifacts.sh | |
- name: Check artifact list | |
run: node ./scripts/makeArtifactList.js -check | |
- name: npm pack (rescript) | |
run: npm pack | |
- 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@v3 | |
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-latest, | |
macos-arm, | |
ubuntu-latest, | |
buildjet-2vcpu-ubuntu-2204-arm, | |
windows-latest, | |
] | |
runs-on: ${{matrix.os}} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Use Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: 16 | |
- name: Download artifacts | |
uses: actions/download-artifact@v3 | |
with: | |
name: npm-packages | |
path: packages/test | |
- name: Install ReScript package | |
run: npm i rescript-${{ needs.package.outputs.rescript_version }}.tgz | |
shell: bash | |
working-directory: packages/test | |
- name: Test installation | |
run: npx rescript -h && npx rescript build && cat src/Test.bs.js | |
shell: bash | |
working-directory: packages/test | |
publish: | |
needs: [package, installationTest] | |
if: startsWith(github.ref, 'refs/tags/v') | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Use Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: 16 | |
registry-url: https://registry.npmjs.org # Needed to make auth work for publishing | |
- name: Download artifacts | |
uses: actions/download-artifact@v3 | |
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: ./playground/website_update_playground.sh | |
shell: bash |