Build static linux binaries, including arm64 #2636
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 ] | |
tags: "*.*.*" | |
pull_request: | |
branches: [ master ] | |
concurrency: | |
group: ${{ github.ref }} | |
cancel-in-progress: true | |
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}} | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Build | |
uses: docker://ghcr.io/rescript-lang/rescript-ci-build:alpine-3.19-ocaml-5.1.1-01 | |
with: | |
args: opam exec -- make | |
# - name: "Upload artifacts" | |
# uses: actions/upload-artifact@v4 | |
# with: | |
# name: static-binaries-linux-${{runner.arch}} | |
# path: | | |
# _build/install/default/bin | |
# ninja/ninja | |
build: | |
strategy: | |
fail-fast: false | |
matrix: | |
# Stay on the oldest Ubuntu version that's still supported by Github Actions | |
# to avoid glibc incompatibilities as far as possible. | |
os: [ | |
macos-13, # x64 | |
macos-14, # ARM | |
ubuntu-20.04, | |
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 | |
artifact-folder: darwin | |
- os: macos-14 | |
artifact-folder: darwinarm64 | |
- os: ubuntu-20.04 | |
artifact-folder: linux | |
- os: windows-latest | |
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-v4 | |
- name: Use OCaml | |
uses: ocaml/setup-ocaml@v2 | |
with: | |
ocaml-compiler: 4.14.x | |
- name: Use Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 16 | |
registry-url: 'https://registry.npmjs.org' | |
- run: npm ci | |
- run: opam install dune cppo | |
- run: npm run compile | |
- run: npm run 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: Build | |
run: opam exec -- make | |
- name: Test | |
run: opam exec -- make test | |
# 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.os}} | |
path: binary.tar | |
package: | |
needs: build | |
runs-on: ubuntu-20.04 | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Use Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 16 | |
registry-url: 'https://registry.npmjs.org' | |
- run: npm ci | |
- run: npm run compile | |
- name: Download MacOS binary | |
uses: actions/download-artifact@v4 | |
with: | |
name: macos-13 | |
path: binaries | |
- run: tar -xvf binary.tar | |
working-directory: binaries | |
- name: Download MacOS ARM binary | |
uses: actions/download-artifact@v4 | |
with: | |
name: macos-14 | |
path: binaries | |
- run: tar -xvf binary.tar | |
working-directory: binaries | |
- name: Download Linux binary | |
uses: actions/download-artifact@v4 | |
with: | |
name: ubuntu-20.04 | |
path: binaries | |
- run: tar -xvf binary.tar | |
working-directory: binaries | |
- name: Download Windows binary | |
uses: actions/download-artifact@v4 | |
with: | |
name: windows-latest | |
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" "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: npx vsce package -o rescript-vscode-${{ steps.vars.outputs.sha_short }}.vsix | |
- name: Package Extension pre-release version | |
if: github.ref == 'refs/heads/master' | |
run: npx 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: npx 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: Publish latest master to GitHub | |
if: github.ref == 'refs/heads/master' | |
uses: marvinpinto/action-automatic-releases@latest | |
with: | |
repo_token: "${{ secrets.GITHUB_TOKEN }}" | |
automatic_release_tag: "latest-master" | |
prerelease: true | |
title: "Latest master" | |
files: rescript-vscode-latest-master.vsix | |
- name: Publish release version to GitHub | |
if: startsWith(github.ref, 'refs/tags/') | |
uses: marvinpinto/action-automatic-releases@latest | |
with: | |
repo_token: "${{ secrets.GITHUB_TOKEN }}" | |
prerelease: false | |
title: ${{ 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: npx 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: npx 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) | |
npm 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: npm publish --access public | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} | |
- name: Build @rescript/tools package | |
working-directory: tools | |
run: | | |
npm ci | |
npm run build | |
- name: Publish @rescript/tools package | |
if: ${{ startsWith(github.event.head_commit.message, 'publish tools') && (github.ref == 'refs/heads/master') }} | |
working-directory: tools | |
run: npm publish --access public | |
env: | |
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} |