This file defines the build orchestration for the Baboon project using mudyla.
args.mkdist-source: Source directory for distribution- type:
directory - default:
"./baboon-compiler/.jvm/target/graalvm-native-image"
- type:
args.mkdist-target: Target directory for distribution- type:
directory - default:
"./target/dist"
- type:
args.js-link-mode: Scala.js link mode (fast or full)- type:
string - default:
"fast"
- type:
LANG=C.UTF-8JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
HOMEUSERCI_PULL_REQUESTCI_BRANCH_TAGSONATYPE_SECRETACTIONS_ID_TOKEN_REQUEST_URLACTIONS_ID_TOKEN_REQUEST_TOKENGITHUB_ACTIONSCIGITHUB_SERVER_URLGITHUB_REFGITHUB_SHAGITHUB_REPOSITORYGITHUB_REPOSITORY_IDGITHUB_REPOSITORY_OWNER_IDGITHUB_RUN_ATTEMPTGITHUB_RUN_IDGITHUB_WORKFLOW_REFGITHUB_WORKFLOW_SHAGITHUB_EVENT_NAME
Clean all the junk
sbt +cleanBuild the Baboon compiler as a GraalVM native image.
weak action.clean
sbt baboonJVM/GraalVMNativeImage/packageBin
ret binary:file=baboon-compiler/.jvm/target/graalvm-native-image/baboonweak action.clean
sbt baboonJVM/GraalVMNativeImage/packageBin
ret binary:file=baboon-compiler/.jvm/target/graalvm-native-image/baboon.exeCreate 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=$tgtGenerate 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")"Publish Scala artifacts.
dep env.SONATYPE_SECRET
echo "Publishing Scala artifacts..."
sbt +publishSigned
ret success:bool=trueBuild 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")"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")"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")"Complete build pipeline with all steps.
dep action.build
dep action.test
ret success:bool=true