xch-blockchain/install-gui.sh

221 lines
6.5 KiB
Bash
Executable File

#!/bin/bash
set -o errexit
export NODE_OPTIONS="--max-old-space-size=3000"
SCRIPT_DIR=$(cd -- "$(dirname -- "$0")"; pwd)
if [ "${SCRIPT_DIR}" != "$(pwd)" ]; then
echo "Please change working directory by the command below"
echo " cd ${SCRIPT_DIR}"
exit 1
fi
if [ -z "$VIRTUAL_ENV" ]; then
echo "This requires the chia python virtual environment."
echo "Execute '. ./activate' before running."
exit 1
fi
if [ "$(id -u)" = 0 ]; then
echo "The Chia Blockchain GUI can not be installed or run by the root user."
exit 1
fi
# Allows overriding the branch or commit to build in chia-blockchain-gui
SUBMODULE_BRANCH=$1
nodejs_is_installed(){
if ! npm version >/dev/null 2>&1; then
return 1
fi
return 0
}
do_install_npm_locally(){
NODEJS_VERSION="$(node -v | cut -d'.' -f 1 | sed -e 's/^v//')"
NPM_VERSION="$(npm -v | cut -d'.' -f 1)"
if [ "$NODEJS_VERSION" -lt "16" ] || [ "$NPM_VERSION" -lt "7" ]; then
if [ "$NODEJS_VERSION" -lt "16" ]; then
echo "Current NodeJS version($(node -v)) is less than 16. GUI app requires NodeJS>=16."
fi
if [ "$NPM_VERSION" -lt "7" ]; then
echo "Current npm version($(npm -v)) is less than 7. GUI app requires npm>=7."
fi
if [ "$(uname)" = "OpenBSD" ] || [ "$(uname)" = "FreeBSD" ]; then
# `n` package does not support OpenBSD/FreeBSD
echo "Please install NodeJS>=16 and/or npm>=7 manually"
exit 1
fi
NPM_GLOBAL="${SCRIPT_DIR}/build_scripts/npm_global"
# install-gui.sh can be executed
echo "cd ${NPM_GLOBAL}"
cd "${NPM_GLOBAL}"
if [ "$NPM_VERSION" -lt "6" ]; then
# Ubuntu image of Amazon ec2 instance surprisingly uses nodejs@3.5.2
# which doesn't support `npm ci` as of 27th Jan, 2022
echo "npm install"
npm install
else
echo "npm ci"
npm ci
fi
export N_PREFIX=${SCRIPT_DIR}/.n
PATH="${N_PREFIX}/bin:$(npm bin):${PATH}"
export PATH
# `n 16` here installs nodejs@16 under $N_PREFIX directory
echo "n 16"
n 16
echo "Current NodeJS version: $(node -v)"
echo "Current npm version: $(npm -v)"
if [ "$(node -v | cut -d'.' -f 1 | sed -e 's/^v//')" -lt "16" ]; then
echo "Error: Failed to install NodeJS>=16"
exit 1
fi
if [ "$(npm -v | cut -d'.' -f 1)" -lt "7" ]; then
echo "Error: Failed to install npm>=7"
exit 1
fi
cd "${SCRIPT_DIR}"
else
echo "Found NodeJS $(node -v)"
echo "Found npm $(npm -v)"
fi
}
# Work around for inconsistent `npm` exec path issue
# https://github.com/Chia-Network/chia-blockchain/pull/10460#issuecomment-1054492495
patch_inconsistent_npm_issue(){
node_module_dir=$1
if [ ! -d "$node_module_dir" ]; then
mkdir "$node_module_dir"
fi
if [ ! -d "${node_module_dir}/.bin" ]; then
mkdir "${node_module_dir}/.bin"
fi
if [ -e "${node_module_dir}/.bin/npm" ]; then
rm -f "${node_module_dir}/.bin/npm"
fi
ln -s "$(command -v npm)" "${node_module_dir}/.bin/npm"
}
# Manage npm and other install requirements on an OS specific basis
if [ "$(uname)" = "Linux" ]; then
#LINUX=1
if type apt-get >/dev/null 2>&1; then
# Debian/Ubuntu
# Check if we are running a Raspberry PI 4
if [ "$(uname -m)" = "aarch64" ] \
&& [ "$(uname -n)" = "raspberrypi" ]; then
# Check if NodeJS & NPM is installed
type npm >/dev/null 2>&1 || {
echo >&2 "Please install NODEJS&NPM manually"
}
else
if ! nodejs_is_installed; then
echo "nodejs is not installed. Installing..."
echo "sudo apt-get install -y npm nodejs libxss1"
sudo apt-get install -y npm nodejs libxss1
fi
do_install_npm_locally
fi
elif type yum >/dev/null 2>&1 && [ ! -f "/etc/redhat-release" ] && [ ! -f "/etc/centos-release" ] && [ ! -f /etc/rocky-release ] && [ ! -f /etc/fedora-release ]; then
# AMZN 2
if ! nodejs_is_installed; then
echo "Installing nodejs on Amazon Linux 2."
curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
sudo yum install -y nodejs
fi
do_install_npm_locally
elif type yum >/dev/null 2>&1 && [ ! -f /etc/rocky-release ] && [ ! -f /etc/fedora-release ] && [ -f /etc/redhat-release ] || [ -f /etc/centos-release ]; then
# CentOS or Redhat
if ! nodejs_is_installed; then
echo "Installing nodejs on CentOS/Redhat."
curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
sudo yum install -y nodejs
fi
do_install_npm_locally
elif type yum >/dev/null 2>&1 && [ -f /etc/rocky-release ] || [ -f /etc/fedora-release ]; then
# RockyLinux
if ! nodejs_is_installed; then
echo "Installing nodejs on RockyLinux/Fedora"
sudo dnf module enable nodejs:12
sudo dnf install -y nodejs
fi
do_install_npm_locally
elif type pacman >/dev/null 2>&1 && [ -f /etc/arch-release ]; then
#Arch Linux
if ! nodejs_is_installed; then
echo "Installing nodejs on Arch Linux"
sudo pacman -S nodejs npm
fi
do_install_npm_locally
fi
elif [ "$(uname)" = "Darwin" ] && type brew >/dev/null 2>&1; then
# MacOS
if ! nodejs_is_installed; then
echo "Installing nodejs on MacOS"
brew install npm
fi
do_install_npm_locally
elif [ "$(uname)" = "OpenBSD" ]; then
if ! nodejs_is_installed; then
echo "Installing nodejs"
pkg_add node
fi
do_install_npm_locally
elif [ "$(uname)" = "FreeBSD" ]; then
if ! nodejs_is_installed; then
echo "Installing nodejs"
pkg install node
fi
do_install_npm_locally
fi
echo ""
# For Mac and Windows, we will set up node.js on GitHub Actions and Azure
# Pipelines directly, so skip unless you are completing a source/developer install.
# Ubuntu special cases above.
if [ ! "$CI" ]; then
echo "Running git submodule update --init --recursive."
echo ""
git submodule update --init --recursive
echo "Running git submodule update."
echo ""
git submodule update
cd chia-blockchain-gui
if [ "$SUBMODULE_BRANCH" ];
then
git fetch --all
git reset --hard "$SUBMODULE_BRANCH"
echo ""
echo "Building the GUI with branch $SUBMODULE_BRANCH"
echo ""
fi
# Work around for inconsistent `npm` exec path issue
# https://github.com/Chia-Network/chia-blockchain/pull/10460#issuecomment-1054492495
patch_inconsistent_npm_issue "../node_modules"
npm ci
npm audit fix || true
npm run build
# Set modified output of `chia version` to version property of GUI's package.json
python ../installhelper.py
else
echo "Skipping node.js in install.sh on MacOS ci."
fi
echo ""
echo "Chia blockchain install-gui.sh completed."
echo ""
echo "Type 'bash start-gui.sh &' to start the GUI."