2019-01-12 23:23:55 +00:00
#!/usr/bin/env bash
# Make sure the current directory is the location of this script to simplify matters
cd "$(dirname $(readlink -f $0))";
2019-03-10 00:30:34 +00:00
if [ ! -d "${PWD}/.git" ]; then
echo -e "\033[1m\033[31mError: The .git folder does not appear to exist. Please ensure you clone this repository with git, like this:\n\n\tgit clone https://github.com/ConnectedHumber/Air-Quality-Web.git\n\033[0m";
exit 1;
fi
2019-01-12 23:23:55 +00:00
################
### Settings ###
################
# The name of this project
project_name="Air Quality Mapper";
# The path to the lantern build engine git submodule
lantern_path="./lantern-build-engine";
###
# Custom Settings
###
# Put any custom settings here.
2019-02-20 17:19:53 +00:00
# Client-side build output
2019-01-13 13:22:13 +00:00
build_output_folder="./app";
2019-01-12 23:23:55 +00:00
2019-02-20 17:19:53 +00:00
# Database settings for ssh port forwarding task
2019-01-14 20:50:12 +00:00
database_host="db.connectedhumber.org";
database_name="aq_db";
2019-02-20 17:19:53 +00:00
# Minimum major version of npm
min_npm_version_major="6";
2019-01-12 23:23:55 +00:00
###############################################################################
# Check out the lantern git submodule if needed
2019-01-13 12:50:47 +00:00
if [ ! -f "${lantern_path}/lantern.sh" ]; then git submodule update --init "${lantern_path}"; fi
2019-01-12 23:23:55 +00:00
source "${lantern_path}/lantern.sh";
if [[ "$#" -lt 1 ]]; then
echo -e "${FBLE}${project_name}${RS} build script";
echo -e " by Starbeamrainbowlabs";
echo -e "${LC}Powered by the lantern build engine, v${version}${RS}";
echo -e "";
echo -e "${CSECTION}Usage${RS}";
echo -e " ./build ${CTOKEN}{action}${RS} ${CTOKEN}{action}${RS} ${CTOKEN}{action}${RS} ...";
echo -e "";
echo -e "${CSECTION}Available actions${RS}";
echo -e " ${CACTION}setup${RS} - Perform initial setup";
2019-01-12 23:38:05 +00:00
echo -e " ${CACTION}setup-dev${RS} - Perform additional setup for development environments. Run after ${CACTION}setup${RS}.";
2019-01-12 23:23:55 +00:00
echo -e " ${CACTION}database${RS} - Connect to the database via SSH & open MariaDB CLI connection, prompting for a password";
echo -e " ${CACTION}dev-server${RS} - Start a development server";
echo -e " ${CACTION}dev-server-stop${RS} - Stop the currently running development server";
2019-01-13 13:15:11 +00:00
echo -e " ${CACTION}client${RS} - Build the client web app";
echo -e " ${CACTION}client-watch${RS} - Watch for changes to the client code & rebuild automatically";
2019-01-12 23:23:55 +00:00
echo -e "";
exit 1;
fi
###############################################################################
function task_setup {
stage_begin "Setting up";
task_begin "Checking environment";
check_command git true;
check_command php true;
check_command node true;
check_command composer true;
check_command npm true;
2019-02-20 17:19:53 +00:00
2019-03-10 00:30:34 +00:00
if [ ! -w "${PWD}" ]; then
task_end 1 "${HC}${FRED}Error: Can't write to the repository directory! This usually you have a permission error of some kind. Try using sudo to run this build command as the user that owns this cloned repository.";
fi
2019-02-20 17:19:53 +00:00
npm_version_major="$(npm --version | head -c 1)";
if [[ "${npm_version_major}" -lt "${min_npm_version_major}" ]]; then
echo "${FRED}${HC}Error: Your version of npm is too far out of date. You're running version $(npm --version), but version 6+ is required.";
fi
2019-01-12 23:23:55 +00:00
task_end $?;
task_begin "Initialising submodules";
git submodule update --init;
task_end $?;
task_begin "Installing client dependencies";
2019-01-20 23:15:40 +00:00
echo -e "${HC}Not including developement dependencies. To complete setup for development, execute the ${CACTION}setup-dev${RS} ${HC}build task.${RS}";
2019-01-12 23:23:55 +00:00
npm install --production;
task_end $?;
task_begin "Installing server dependencies";
composer install --no-dev;
task_end $?;
2019-03-07 18:33:20 +00:00
if [ ! -d "./data" ]; then
task_begin "Setting up initial data folder";
mkdir "./data"; chmod 0700 "./data";
echo -e "# -------[ Custom Settings File - Last updated $(date) ]-------" >"./data/settings.toml";
echo -e '[database]\nusername = "INSERT_DATABASE_USERNAME_HERE"\npassword = "INSERT_DATABASE_PASSWORD_HERE";' >>"./data/settings.toml";
2019-03-10 00:19:34 +00:00
chmod 0600 "./data/settings.toml";
2019-03-07 18:33:20 +00:00
echo -e "${HC}Don't forget to edit './data/settings.toml' to specify the database username and password${RS}";
2019-03-07 18:40:30 +00:00
echo -e "";
2019-03-07 18:33:20 +00:00
task_end $?;
fi
2019-01-12 23:23:55 +00:00
stage_end $?;
}
function task_setup-dev {
task_begin "Checking environment";
check_command mysql true optional;
task_end $?;
task_begin "Installing client development dependencies";
npm install;
task_end $?;
task_begin "Installing server development dependencies";
2019-01-13 12:50:47 +00:00
composer install;
task_end $?;
}
function task_database {
task_begin "Connecting to the database";
2019-02-01 18:13:11 +00:00
set-title "Database";
2019-01-14 20:50:12 +00:00
ssh -TN "${database_host}" -L 3306:localhost:3306 &
2019-01-13 12:50:47 +00:00
ssh_pid=$!;
2019-01-14 20:50:12 +00:00
sleep 1;
mysql --host 127.0.0.1 --port 3306 --database "${database_name}" --user "${USER}" --password;
2019-01-13 12:50:47 +00:00
2019-01-14 21:43:45 +00:00
kill "${ssh_pid}"; wait; sleep 0.5;
2019-01-12 23:23:55 +00:00
task_end $?;
}
function task_dev-server {
task_begin "Starting development server";
2019-01-14 20:06:30 +00:00
php -S [::1]:40482 &
2019-01-12 23:23:55 +00:00
exit_code=$?;
echo $! >/tmp/micro-lantern-dev-server.pid;
task_end $?; # Should be 0 unless php died for some reason
sleep 1;
}
function task_dev-server-stop {
task_begin "Stopping development server";
kill "$(cat /tmp/micro-lantern-dev-server.pid)";
rm /tmp/micro-lantern-dev-server.pid;
task_end $?;
}
2019-01-13 13:15:11 +00:00
function task_client {
task_begin "Packaging Javascript";
node_modules/rollup/bin/rollup --sourcemap --config rollup.config.js;
2019-03-10 00:14:59 +00:00
task_end $? "Error: rollup packing failed!";
2019-01-12 23:23:55 +00:00
task_begin "Copying html";
2019-01-13 13:22:13 +00:00
cp client_src/index.html "${build_output_folder}";
2019-01-12 23:23:55 +00:00
task_end $?;
2019-01-17 12:48:09 +00:00
# task_begin "Copying css";
# # FUTURE: Package this up too?
# cp -r client_src/css/ "${build_output_folder}";
# task_end $?;
2019-01-12 23:23:55 +00:00
}
2019-01-13 13:15:11 +00:00
function task_client-watch {
2019-02-01 18:13:11 +00:00
set-title "Client Watcher";
2019-01-13 13:15:11 +00:00
echo -e "Watching for changes.";
2019-01-20 22:47:05 +00:00
while :; do # : = infinite loop
# Wait for an update
# inotifywait's non-0 exit code forces an exit for some reason :-/
inotifywait -qr --event modify --format '%:e %f' client_src;
# Rebuild the client code - spawn a sub-process to avoid the hard exit
# This still doesn't work though, which is *really* annoying
2019-01-13 13:15:11 +00:00
stage_begin "Rebuilding client code";
2019-01-20 22:47:05 +00:00
./build client;
2019-01-13 13:15:11 +00:00
stage_end $?;
done
}
2019-01-12 23:23:55 +00:00
#########################################################################
tasks_run $@;