Skip to content

Latest commit

 

History

History
336 lines (249 loc) · 7.35 KB

File metadata and controls

336 lines (249 loc) · 7.35 KB

Baboon Build Actions

This file defines the build orchestration for the Baboon project using mudyla.

arguments

  • args.mkdist-source: Source directory for distribution
    • type: directory
    • default: "./baboon-compiler/.jvm/target/graalvm-native-image"
  • args.mkdist-target: Target directory for distribution
    • type: directory
    • default: "./target/dist"
  • args.js-link-mode: Scala.js link mode (fast or full)
    • type: string
    • default: "fast"

environment

  • LANG=C.UTF-8
  • JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8

passthrough

  • HOME
  • USER
  • CI_PULL_REQUEST
  • CI_BRANCH_TAG
  • SONATYPE_SECRET
  • ACTIONS_ID_TOKEN_REQUEST_URL
  • ACTIONS_ID_TOKEN_REQUEST_TOKEN
  • GITHUB_ACTIONS
  • CI
  • GITHUB_SERVER_URL
  • GITHUB_REF
  • GITHUB_SHA
  • GITHUB_REPOSITORY
  • GITHUB_REPOSITORY_ID
  • GITHUB_REPOSITORY_OWNER_ID
  • GITHUB_RUN_ATTEMPT
  • GITHUB_RUN_ID
  • GITHUB_WORKFLOW_REF
  • GITHUB_WORKFLOW_SHA
  • GITHUB_EVENT_NAME

action: clean

Clean all the junk

sbt +clean

action: build

Build the Baboon compiler as a GraalVM native image.

definition

weak action.clean
sbt baboonJVM/GraalVMNativeImage/packageBin
ret binary:file=baboon-compiler/.jvm/target/graalvm-native-image/baboon

definition when platform: windows

weak action.clean
sbt baboonJVM/GraalVMNativeImage/packageBin
ret binary:file=baboon-compiler/.jvm/target/graalvm-native-image/baboon.exe

action: mkdist

Create distribution packages from built binaries.

BABOON_BIN="${action.build.binary}"
SRC="${args.mkdist-source}"
TGT="${args.mkdist-target}"

src="$(realpath "$SRC")"
tgt="$(realpath "$TGT")"

distbin="$tgt/dist-bin"
distzip="$tgt/dist-zip"

mkdir -p "$distbin"
mkdir -p "$distzip"

pushd "$src"

for d in baboon-*; do
  if [[ -f ./$d/baboon ]]; then
    cp ./${d}/baboon ${distbin}/${d}
    zip -r9 -j ${distzip}/${d}.zip ${distbin}/${d}
  elif [[ -f ./$d/baboon.exe ]]; then
    cp ./${d}/baboon.exe ${distbin}/${d}.exe
    zip -r9 -j ${distzip}/${d}.zip ${distbin}/${d}.exe
  fi
done

popd

ret dist_dir:directory=$tgt

action: gen-js

Generate optimized JavaScript bundle for BaboonJS.

set -euo pipefail

JS_DIST_DIR="./baboon-compiler/.js/target/scala-2.13/baboon-opt"

if [[ -z "${CI_PULL_REQUEST:-}" ]]; then
  echo "CI_PULL_REQUEST must be explicitly provided as 'true' or 'false'." >&2
  exit 1
fi

if [[ "$CI_PULL_REQUEST" != "true" && "$CI_PULL_REQUEST" != "false" ]]; then
  echo "CI_PULL_REQUEST must be either 'true' or 'false', got '$CI_PULL_REQUEST'." >&2
  exit 1
fi

if [[ "$CI_PULL_REQUEST" != "false" ]]; then
  echo "Skipping BaboonJS build because this is a pull request."
  mkdir -p "$JS_DIST_DIR"
  ret skipped:bool=true
  ret dist_dir:directory="$(realpath "$JS_DIST_DIR")"
  exit 0
fi

sbt '++2.13 baboonJS/fullLinkJS'

if [[ ! -f "${JS_DIST_DIR}/main.js" ]]; then
  echo "Scala.js output is missing at ${JS_DIST_DIR}/main.js" >&2
  exit 1
fi

ret success:bool=true
ret dist_dir:directory="$(realpath "$JS_DIST_DIR")"

action: publish-scala

Publish Scala artifacts.

dep env.SONATYPE_SECRET
echo "Publishing Scala artifacts..."
sbt +publishSigned
ret success:bool=true

action: publish-npm

Build and publish the Baboon JavaScript package to npm.

dep action.gen-js

set -euo pipefail

if [[ -z "${CI_PULL_REQUEST:-}" ]]; then
  echo "CI_PULL_REQUEST must be explicitly provided as 'true' or 'false'." >&2
  exit 1
fi

if [[ "$CI_PULL_REQUEST" != "true" && "$CI_PULL_REQUEST" != "false" ]]; then
  echo "CI_PULL_REQUEST must be either 'true' or 'false', got '$CI_PULL_REQUEST'." >&2
  exit 1
fi

if [[ -z "${CI_BRANCH_TAG:-}" ]]; then
  echo "CI_BRANCH_TAG must be provided to derive the npm version." >&2
  exit 1
fi

if [[ "$CI_PULL_REQUEST" != "false" ]]; then
  echo "Skipping npm publish because this is a pull request."
  ret skipped:bool=true
  exit 0
fi

PROJECT_ROOT="${sys.project-root}"
DIST_DIR="${action.gen-js.dist_dir}"
PUBLISH_DIR="${PROJECT_ROOT}/target/npm-publish"
TEMPLATE_DIR="${PROJECT_ROOT}/baboon-compiler/npm-template"
LICENSE_FILE="${PROJECT_ROOT}/LICENSE"
VERSION_FILE="${PROJECT_ROOT}/version.sbt"

if [[ ! -d "$DIST_DIR" ]]; then
  echo "Scala.js distribution directory '$DIST_DIR' is missing." >&2
  exit 1
fi

if [[ ! -f "${DIST_DIR}/main.js" ]]; then
  echo "Scala.js entrypoint '${DIST_DIR}/main.js' is missing." >&2
  exit 1
fi

if [[ ! -d "$TEMPLATE_DIR" ]]; then
  echo "npm template directory '$TEMPLATE_DIR' is missing." >&2
  exit 1
fi

rm -rf "$PUBLISH_DIR"
mkdir -p "$PUBLISH_DIR"

cp "${DIST_DIR}/"* "$PUBLISH_DIR"/
cp "${TEMPLATE_DIR}/"* "$PUBLISH_DIR"/
cp "$LICENSE_FILE" "$PUBLISH_DIR"/

if [[ ! -f "$VERSION_FILE" ]]; then
  echo "Unable to locate version file: $VERSION_FILE" >&2
  exit 1
fi

VERSION_FROM_TAG="$CI_BRANCH_TAG"

if [[ "$VERSION_FROM_TAG" =~ ^v(.*)$ ]]; then
  VERSION_FROM_TAG="${BASH_REMATCH[1]}"
fi

VERSION_FROM_SBT=$(sed -n 's/.*"\(.*\)".*/\1/p' "$VERSION_FILE" | head -n 1)
VERSION_FROM_SBT="${VERSION_FROM_SBT%-SNAPSHOT}"

if [[ -z "$VERSION_FROM_TAG" && -z "$VERSION_FROM_SBT" ]]; then
  echo "Unable to derive version from CI_BRANCH_TAG or version.sbt" >&2
  exit 1
fi

VERSION="${VERSION_FROM_TAG:-$VERSION_FROM_SBT}"

sed -i "s/VERSION_PLACEHOLDER/${VERSION}/g" "$PUBLISH_DIR/package.json"

cd "$PUBLISH_DIR"

export NPM_CONFIG_LOGLEVEL="verbose"

set -x
echo "env within mdl"
env

npm install
npm test
npm publish --provenance --access public

ret success:bool=true
ret publish_dir:directory="$(realpath "$PUBLISH_DIR")"

action: gen-js-dev

Generate JavaScript bundle for BaboonJS (local development, no CI checks). Link mode is controlled by --js-link-mode argument (default: fast).

set -euo pipefail

LINK_MODE="${args.js-link-mode}"

if [[ "$LINK_MODE" == "fast" ]]; then
  SBT_TASK="baboonJS/fastLinkJS"
  JS_DIST_DIR="./baboon-compiler/.js/target/scala-2.13/baboon-fastopt"
elif [[ "$LINK_MODE" == "full" ]]; then
  SBT_TASK="baboonJS/fullLinkJS"
  JS_DIST_DIR="./baboon-compiler/.js/target/scala-2.13/baboon-opt"
else
  echo "Unknown js-link-mode: '$LINK_MODE'. Must be 'fast' or 'full'." >&2
  exit 1
fi

echo "Building Scala.js with ${LINK_MODE} linking (sbt '++2.13 ${SBT_TASK}')..."
sbt "++2.13 ${SBT_TASK}"

if [[ ! -f "${JS_DIST_DIR}/main.js" ]]; then
  echo "Scala.js output is missing at ${JS_DIST_DIR}/main.js" >&2
  exit 1
fi

ret success:bool=true
ret dist_dir:directory="$(realpath "$JS_DIST_DIR")"

action: playground

Build the Baboon Playground web application.

dep action.gen-js-dev

set -euo pipefail

PROJECT_ROOT="${sys.project-root}"
PLAYGROUND_DIR="${PROJECT_ROOT}/baboon-playground"
COMPILER_DIR="${PLAYGROUND_DIR}/public/compiler"
JS_DIST_DIR="${action.gen-js-dev.dist_dir}"

echo "Using Scala.js output from: ${JS_DIST_DIR}"

rm -rf "$COMPILER_DIR"
mkdir -p "$COMPILER_DIR"
cp "${JS_DIST_DIR}/"*.js "$COMPILER_DIR"/
cp "${JS_DIST_DIR}/"*.js.map "$COMPILER_DIR"/ 2>/dev/null || true

cd "$PLAYGROUND_DIR"
npm install
npm run build

cat > "${PLAYGROUND_DIR}/dist/serve.sh" << 'SERVE_EOF'
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
PORT="${1:-8080}"
echo "Serving playground at http://localhost:${PORT}"
python3 -m http.server "$PORT"
SERVE_EOF
chmod +x "${PLAYGROUND_DIR}/dist/serve.sh"

ret success:bool=true
ret dist_dir:directory="$(realpath "${PLAYGROUND_DIR}/dist")"

action: full-build

Complete build pipeline with all steps.

dep action.build
dep action.test

ret success:bool=true