Initial yarn workspace #2993
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 ] | |
tags: "*.*.*" | |
pull_request: | |
branches: [ master ] | |
concurrency: | |
group: ${{ github.ref }} | |
cancel-in-progress: true | |
jobs: | |
build: | |
strategy: | |
fail-fast: false | |
matrix: | |
os: [ | |
macos-13, # x64 | |
macos-14, # ARM | |
ubuntu-24.04, # x64 | |
ubuntu-24.04-arm, # ARM | |
windows-latest, | |
] | |
# syntax explanation: | |
# https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#example-including-additional-values-into-combinations | |
include: | |
- os: macos-13 | |
ocaml-compiler: 5.2.1 | |
dune-profile: release | |
artifact-folder: darwin | |
- os: macos-14 | |
ocaml-compiler: 5.2.1 | |
dune-profile: release | |
artifact-folder: darwinarm64 | |
- os: ubuntu-24.04 | |
ocaml-compiler: ocaml-variants.5.2.1+options,ocaml-option-static | |
dune-profile: static | |
artifact-folder: linux | |
- os: ubuntu-24.04-arm | |
ocaml-compiler: ocaml-variants.5.2.1+options,ocaml-option-static | |
dune-profile: static | |
artifact-folder: linuxarm64 | |
- os: windows-latest | |
ocaml-compiler: 5.2.1 | |
dune-profile: release | |
artifact-folder: win32 | |
runs-on: ${{matrix.os}} | |
steps: | |
# needed for Windows testing | |
- name: Set git to use LF | |
run: | | |
git config --global core.autocrlf false | |
git config --global core.eol lf | |
- uses: actions/checkout@v4 | |
- name: Cache OCaml's opam | |
uses: actions/cache@v4 | |
with: | |
path: ~/.opam | |
key: ${{matrix.os}}-rescript-vscode-v5 | |
- name: Use OCaml | |
uses: ocaml/setup-ocaml@v3 | |
with: | |
ocaml-compiler: ${{matrix.ocaml-compiler}} | |
opam-pin: false | |
- name: Use Node.js | |
uses: actions/setup-node@v4 | |
with: | |
cache: yarn | |
node-version-file: .nvmrc | |
- run: yarn install | |
- run: opam install dune cppo | |
- run: yarn compile | |
- run: yarn bundle | |
# These 2 runs (or just the second?) are for when you have opam dependencies. We don't. | |
# Don't add deps. But if you ever do, un-comment these and add an .opam file. | |
# - run: opam pin add rescript-editor-analysis.dev . --no-action | |
# - run: opam install . --deps-only --with-doc --with-test | |
- name: Set dune profile according to platform | |
run: echo "DUNE_PROFILE=${{ matrix.dune-profile }}" >> $GITHUB_ENV | |
- name: Build | |
run: opam exec -- make | |
- name: Test | |
run: opam exec -- make test | |
- name: Strip binaries | |
if: matrix.os != 'windows-latest' | |
run: strip rescript-editor-analysis.exe rescript-tools.exe | |
# Also avoids artifacts upload permission loss: | |
# https://github.com/actions/upload-artifact/tree/ee69f02b3dfdecd58bb31b4d133da38ba6fe3700#permission-loss | |
- name: Compress files | |
run: | | |
mkdir ${{matrix.artifact-folder}} | |
mv rescript-editor-analysis.exe ${{matrix.artifact-folder}} | |
mv rescript-tools.exe ${{matrix.artifact-folder}} | |
tar -cvf binary.tar ${{matrix.artifact-folder}} | |
- uses: actions/upload-artifact@v4 | |
with: | |
name: ${{matrix.artifact-folder}} | |
path: binary.tar | |
package: | |
needs: | |
- build | |
runs-on: ubuntu-24.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Use Node.js | |
uses: actions/setup-node@v4 | |
with: | |
cache: yarn | |
node-version-file: .nvmrc | |
- run: yarn install | |
- run: yarn compile | |
- name: Download MacOS binaries | |
uses: actions/download-artifact@v4 | |
with: | |
name: darwin | |
path: binaries | |
- run: tar -xvf binary.tar | |
working-directory: binaries | |
- name: Download MacOS ARM binaries | |
uses: actions/download-artifact@v4 | |
with: | |
name: darwinarm64 | |
path: binaries | |
- run: tar -xvf binary.tar | |
working-directory: binaries | |
- name: Download Linux binaries | |
uses: actions/download-artifact@v4 | |
with: | |
name: linux | |
path: binaries | |
- run: tar -xvf binary.tar | |
working-directory: binaries | |
- name: Download Linux ARM binaries | |
uses: actions/download-artifact@v4 | |
with: | |
name: linuxarm64 | |
path: binaries | |
- run: tar -xvf binary.tar | |
working-directory: binaries | |
- name: Download Windows binaries | |
uses: actions/download-artifact@v4 | |
with: | |
name: win32 | |
path: binaries | |
- run: tar -xvf binary.tar | |
working-directory: binaries | |
- name: Cleanup tar file | |
run: rm binary.tar | |
working-directory: binaries | |
- name: Move binaries to folders | |
run: | | |
declare -a platforms=("darwin" "darwinarm64" "linux" "linuxarm64" "win32") | |
for platform in "${platforms[@]}"; do | |
mkdir server/analysis_binaries/"$platform" | |
mv binaries/"$platform"/rescript-editor-analysis.exe server/analysis_binaries/"$platform" | |
done | |
for platform in "${platforms[@]}"; do | |
mkdir tools/binaries/"$platform" | |
mv binaries/"$platform"/rescript-tools.exe tools/binaries/"$platform" | |
done | |
- name: Store short commit SHA for filename | |
id: vars | |
env: | |
COMMIT_SHA: ${{ github.event.pull_request.head.sha || github.sha }} | |
run: echo "sha_short=${COMMIT_SHA:0:7}" >> $GITHUB_OUTPUT | |
- name: Store tag name | |
id: tag_name | |
if: startsWith(github.ref, 'refs/tags/') | |
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT | |
- name: Increment pre-release version | |
if: github.ref == 'refs/heads/master' | |
id: increment_pre_release | |
run: | | |
JSON=$(npx vsce show chenglou92.rescript-vscode --json) | |
NEW_VERSION=$(echo $JSON | jq -r '.versions | .[0] | .["version"]') | |
node .github/workflows/bump-version.js ${NEW_VERSION} | |
- name: Package Extension | |
if: github.ref != 'refs/heads/master' | |
run: yarn dlx vsce package -o rescript-vscode-${{ steps.vars.outputs.sha_short }}.vsix | |
- name: Package Extension pre-release version | |
if: github.ref == 'refs/heads/master' | |
run: yarn dlx vsce package -o rescript-vscode-latest-master.vsix ${{ steps.increment_pre_release.outputs.new_version }} --no-git-tag-version | |
- name: Package Extension release version | |
if: startsWith(github.ref, 'refs/tags/') | |
run: yarn dlx vsce package -o rescript-vscode-${{ steps.tag_name.outputs.tag }}.vsix ${{ steps.tag_name.outputs.tag }} --no-git-tag-version | |
- uses: actions/upload-artifact@v4 | |
if: github.ref != 'refs/heads/master' | |
with: | |
name: rescript-vscode-${{ steps.vars.outputs.sha_short }}.vsix | |
path: rescript-vscode-${{ steps.vars.outputs.sha_short }}.vsix | |
- uses: actions/upload-artifact@v4 | |
if: github.ref == 'refs/heads/master' | |
with: | |
name: rescript-vscode-latest-master.vsix | |
path: rescript-vscode-latest-master.vsix | |
- uses: actions/upload-artifact@v4 | |
if: startsWith(github.ref, 'refs/tags/') | |
with: | |
name: rescript-vscode-${{ steps.tag_name.outputs.tag }}.vsix | |
path: rescript-vscode-${{ steps.tag_name.outputs.tag }}.vsix | |
- name: Move latest-master tag to current commit | |
if: github.ref == 'refs/heads/master' | |
run: | | |
git tag -d latest-master || true | |
git push origin --delete latest-master || true | |
git tag latest-master | |
git push origin latest-master | |
- name: Publish latest master to GitHub | |
if: github.ref == 'refs/heads/master' | |
uses: softprops/action-gh-release@v2 | |
with: | |
token: "${{ secrets.GITHUB_TOKEN }}" | |
tag_name: "latest-master" | |
prerelease: true | |
generate_release_notes: true | |
name: "Latest master" | |
files: rescript-vscode-latest-master.vsix | |
- name: Generate release notes from changelog | |
if: startsWith(github.ref, 'refs/tags/') | |
run: | | |
sed -e "/^## ${{ steps.tag_name.outputs.tag }}/,/^## / ! d" CHANGELOG.md | head -n -2 > RELEASE.md | |
- name: Publish release version to GitHub | |
if: startsWith(github.ref, 'refs/tags/') | |
uses: softprops/action-gh-release@v2 | |
with: | |
token: "${{ secrets.GITHUB_TOKEN }}" | |
prerelease: false | |
body_path: RELEASE.md | |
name: ${{ steps.tag_name.outputs.tag }} | |
files: rescript-vscode-${{ steps.tag_name.outputs.tag }}.vsix | |
- name: Publish extension as pre-release | |
if: github.ref == 'refs/heads/master' && !startsWith(github.event.head_commit.message, 'publish tools') | |
run: yarn dlx vsce publish --pat ${{ secrets.MARKETPLACE_TOKEN }} --pre-release ${{ steps.increment_pre_release.outputs.new_version }} --no-git-tag-version | |
- name: Publish extension as release | |
if: startsWith(github.ref, 'refs/tags/') | |
run: yarn dlx vsce publish --pat ${{ secrets.MARKETPLACE_TOKEN }} ${{ steps.tag_name.outputs.tag }} --no-git-tag-version | |
- name: Publish LSP as pre-release to NPM | |
if: github.ref == 'refs/heads/master' | |
working-directory: server | |
run: | | |
npm version preminor --preid next-$(git rev-parse --short HEAD) | |
yarn publish --access public --tag next | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
- name: Publish LSP to NPM | |
if: startsWith(github.ref, 'refs/tags/') | |
working-directory: server | |
run: yarn publish --access public | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
- name: Build @rescript/tools package | |
working-directory: tools | |
run: | | |
yarn install | |
yarn build | |
- name: Publish @rescript/tools package | |
if: ${{ startsWith(github.event.head_commit.message, 'publish tools') && (github.ref == 'refs/heads/master') }} | |
working-directory: tools | |
run: yarn publish --access public | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} |