Files
OpenViking/examples/openclaw-plugin/build.sh
T

138 lines
3.9 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
trap 'echo "Build failed." >&2' ERR
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$ROOT_DIR"
PACKAGE_VERSION=$(npm pkg get version | tr -d '"')
VERSION="${BUILD_VERSION:-$PACKAGE_VERSION}"
RELEASE_PATH="${BUILD_RELEASE_PATH:-latest}"
PACKAGE_NAME="openviking"
OUTPUT_DIR="$ROOT_DIR/output"
TGZ_RELATIVE_PATH="output/openviking.tgz"
INSTALL_RELATIVE_PATH="output/install.sh"
VOLCENGINE_INSTALL_RELATIVE_PATH="output/volcengine-install.sh"
TGZ_PATH="$ROOT_DIR/$TGZ_RELATIVE_PATH"
INSTALL_OUTPUT="$ROOT_DIR/$INSTALL_RELATIVE_PATH"
VOLCENGINE_INSTALL_OUTPUT="$ROOT_DIR/$VOLCENGINE_INSTALL_RELATIVE_PATH"
STAGING_DIR=""
TAR_CREATE_FLAGS=(--exclude='._*' --exclude='.DS_Store' -zcf)
supports_tar_flag() {
local flag="$1"
tar "$flag" -cf /dev/null --files-from /dev/null >/dev/null 2>&1
}
if supports_tar_flag "--no-xattrs"; then
TAR_CREATE_FLAGS=(--no-xattrs "${TAR_CREATE_FLAGS[@]}")
fi
if supports_tar_flag "--disable-copyfile"; then
TAR_CREATE_FLAGS=(--disable-copyfile "${TAR_CREATE_FLAGS[@]}")
fi
cleanup() {
case "${STAGING_DIR:-}" in
"$OUTPUT_DIR"/.package.*)
if [ -d "$STAGING_DIR" ]; then
rm -rf "$STAGING_DIR"
fi
;;
esac
}
trap cleanup EXIT
info() {
echo "[openviking] $*"
}
require_file() {
local path="$1"
if [ ! -f "$path" ]; then
echo "Required file is missing: $path" >&2
exit 1
fi
}
require_dir() {
local path="$1"
if [ ! -d "$path" ]; then
echo "Required directory is missing: $path" >&2
exit 1
fi
}
copy_optional_file() {
local path="$1"
local target_dir="$2"
if [ -f "$path" ]; then
cp "$path" "$target_dir/"
else
echo "Optional file is missing, skipped: $path" >&2
fi
}
info "Building OpenViking plugin package $VERSION"
rm -rf dist "$OUTPUT_DIR"
info "Installing dependencies"
npm install
info "Running checks"
npm run typecheck
npm test
npm run build
require_file "dist/index.js"
require_file "dist/commands/setup.js"
require_file "package.json"
require_file "openclaw.plugin.json"
require_file "install-manifest.json"
require_file "config/feature-gates.json"
require_dir "skills"
require_file "scripts/install.sh"
require_file "scripts/volcengine-openviking-install.sh"
mkdir -p "$OUTPUT_DIR"
STAGING_DIR=$(mktemp -d "$OUTPUT_DIR/.package.XXXXXX")
require_dir "$STAGING_DIR"
PACKAGE_DIR="$STAGING_DIR/$PACKAGE_NAME"
mkdir -p "$PACKAGE_DIR"
info "Staging package files"
cp package.json "$PACKAGE_DIR/"
BUILD_VERSION="$VERSION" node -e 'const fs=require("fs"); const path=process.argv[1]; const pkg=JSON.parse(fs.readFileSync(path,"utf8")); pkg.version = process.env.BUILD_VERSION; fs.writeFileSync(path, `${JSON.stringify(pkg, null, 2)}\n`);' "$PACKAGE_DIR/package.json"
cp openclaw.plugin.json "$PACKAGE_DIR/"
cp install-manifest.json "$PACKAGE_DIR/"
cp -R config "$PACKAGE_DIR/"
cp -R dist "$PACKAGE_DIR/"
cp -R skills "$PACKAGE_DIR/"
copy_optional_file "README.md" "$PACKAGE_DIR"
copy_optional_file "INSTALL.md" "$PACKAGE_DIR"
copy_optional_file "INSTALL-ZH.md" "$PACKAGE_DIR"
copy_optional_file "INSTALL-AGENT.md" "$PACKAGE_DIR"
info "Installing production dependencies into package"
npm install --omit=dev --ignore-scripts --no-audit --no-fund --package-lock=false --prefix "$PACKAGE_DIR" # npm install --omit=dev
require_dir "$PACKAGE_DIR/node_modules/@sinclair/typebox"
sed \
-e "s/^VERSION=\".*\"/VERSION=\"$VERSION\"/" \
-e "s#^RELEASE_PATH=\"\${INSTALL_RELEASE_PATH:-.*}\"#RELEASE_PATH=\"\${INSTALL_RELEASE_PATH:-$RELEASE_PATH}\"#" \
scripts/install.sh > "$INSTALL_OUTPUT"
chmod +x "$INSTALL_OUTPUT"
cp scripts/volcengine-openviking-install.sh "$VOLCENGINE_INSTALL_OUTPUT"
chmod +x "$VOLCENGINE_INSTALL_OUTPUT"
info "Creating $TGZ_PATH"
COPYFILE_DISABLE=1 tar "${TAR_CREATE_FLAGS[@]}" "$TGZ_PATH" -C "$STAGING_DIR" "$PACKAGE_NAME"
echo
info "Build complete"
echo "Package: $TGZ_RELATIVE_PATH"
echo "Installer: $INSTALL_RELATIVE_PATH"
echo "Volcengine installer: $VOLCENGINE_INSTALL_RELATIVE_PATH"
echo "Version: $VERSION"