#!/usr/bin/env bash set -e; # current_branch="$(git rev-parse --abbrev-ref HEAD)"; is_main="$(git branch --contains HEAD | awk '/HEAD/ { next } /dev/ { print $1 }')"; if [[ "${1}" == "ci" ]] && [[ ! -z "${is_main}" ]]; then echo "Skipping build, because this commit does not appear to be on the 'dev' branch, and we only deploy commits on the 'main' branch."; fi # ██████ ██ ██████ ██ ██ ██ ██ ██████ # ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ # ██ ██ ██████ ██ ██ ██ ██ ██ ██ # ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ # ██████ ██ ██████ ██████ ██ ███████ ██████ # This script's purpose is to execute CI build tasks for WorlEditAdditions. # # Currently this involves building the website & uploading it to the web # server (though the upload obviously requires an SSH key). # # You do NOT need to run this script to use WorldEditAdditions - only to build # the website. # If you try and submit malware to this file, you WILL receive a PERMANENT BAN, # and I WILL report you to all the places I possibly can. deploy_ssh_user="ci"; deploy_ssh_host="starbeamrainbowlabs.com"; deploy_ssh_port="2403"; deploy_root_dir="WorldEditAdditions"; # Make sure $WORKSPACE is set to ensure compatilibity with a regular shell # This is important until we get our CI server back up and running WORKSPACE="${WORKSPACE:-$PWD}"; ############################################################################### log_msg() { echo "[ $SECONDS ] >>> $*" >&2; } # $1 - Command name to check for check_command() { set +e; command -v "$1" >/dev/null 2>&1; exit_code="$?"; if [[ "${exit_code}" -ne 0 ]]; then log_msg "Error: Couldn't locate $1. Make sure it's installed and in your path."; fi set -e; } ############################################################################### log_msg "WorldEditAdditions build script starting"; log_msg "You do NOT need to run this script to use WorldEditAdditions - this script is for my Continuous Integration server to build and deploy the website :-)"; check_command node; check_command npm; check_command npx; check_command cat; check_command sftp; check_command lftp; if [[ -z "${SSH_KEY_PATH}" ]]; then echo "Error: SSH_KEY_PATH environment variable is not set."; exit 1; fi temp_dir="$(mktemp --tmpdir -d "WorldEditAdditions-XXXXXXX")"; on_exit() { rm -rf "${temp_dir}"; } trap on_exit EXIT; ############################################################################### cd "./.docs" || { echo "Failed to cd into ./.docs"; exit 1; }; # ██████ ██ ██ ██ ██ ██████ # ██ ██ ██ ██ ██ ██ ██ ██ # ██████ ██ ██ ██ ██ ██ ██ # ██ ██ ██ ██ ██ ██ ██ ██ # ██████ ██████ ██ ███████ ██████ log_msg "Installing website dependencies"; npm install; log_msg "Building website"; # This causes the eleventy docs site to minify stuff # Note that this is NOT before the npm install, as npm doesn't install everything if we do that export NODE_ENV=production; npm run build; if [[ ! -d "_site" ]]; then log_msg "Error: No website build output generated (eh?)"; exit 1; fi # █████ ██████ ██████ ██ ██ ██ ██ ██ ███████ # ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ # ███████ ██████ ██ ███████ ██ ██ ██ █████ # ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ # ██ ██ ██ ██ ██████ ██ ██ ██ ████ ███████ if [[ ! -z "${ARCHIVE}" ]]; then log_msg "Archiving content"; check_command tar; check_command gzip; cd "_site" || { echo "Failed to cd into _site"; exit 1; }; tar -caf "${ARCHIVE}/WorldEditAdditions-website.tar.gz" .; log_msg "Archived to ${ARCHIVE}/WorldEditAdditions-website.tar.gz:"; ls -lh "${ARCHIVE}/WorldEditAdditions-website.tar.gz"; cd ".." || { echo "Failed to parent directory again"; exit 1; }; fi # ██ ██ ██████ ██ ██████ █████ ██████ # ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ # ██ ██ ██████ ██ ██ ██ ███████ ██ ██ # ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ # ██████ ██ ███████ ██████ ██ ██ ██████ log_msg "Acquiring upload lock"; # Acquire an exclusive project-wide lock so that we only upload stuff one-at-a-time exec 9<"${WORKSPACE}"; flock --exclusive 9; log_msg "Deploying to server"; # Actions: # [sftp] 1. Connect to remote server # [sftp] 2. Upload new files # [lftp] 4. Swap in new directory # [lftp] 5. Delete old directory sftp -i "${SSH_KEY_PATH}" -P "${deploy_ssh_port}" -o PasswordAuthentication=no "${deploy_ssh_user}@${deploy_ssh_host}" << SFTPCOMMANDS mkdir ${deploy_root_dir}/www-new put -r _site/* ${deploy_root_dir}/www-new bye SFTPCOMMANDS lftp_commands_filename="${temp_dir}/commands.lftp"; ( echo "set sftp:connect-program 'ssh -x -i ${SSH_KEY_PATH}'"; # We have an extra : before the @ here to avoid the password prompt echo "connect sftp://${deploy_ssh_user}:@${deploy_ssh_host}:${deploy_ssh_port}"; echo "mv \"${deploy_root_dir}/www\" \"${deploy_root_dir}/www-old\""; echo "mv \"${deploy_root_dir}/www-new\" \"${deploy_root_dir}/www\""; echo "rm -r \"${deploy_root_dir}/www-old\""; echo "bye"; ) >"${lftp_commands_filename}"; lftp --version; cat "${lftp_commands_filename}"; lftp -f "${lftp_commands_filename}"; exit_code=$? log_msg "Releasing lock"; exec 9>&- # Close file descriptor 9 and release the lock log_msg "Complete!";