Files
role-user/deploy/jenkins/deploy-standalone.sh
T

72 lines
2.0 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
deploy_env="${1:?Usage: deploy-standalone.sh test|production [artifact_dir]}"
artifact_dir="${2:-.deploy/role-user}"
case "${deploy_env}" in
test)
env_file=".env.test"
;;
production)
env_file=".env.production"
;;
*)
echo "Unknown deploy environment: ${deploy_env}" >&2
exit 1
;;
esac
if [[ ! -f "${artifact_dir}/server.js" ]]; then
echo "Standalone server.js not found in ${artifact_dir}" >&2
exit 1
fi
project_name="${PROJECT_NAME:-role-user}"
base_dir="${DEPLOY_BASE_DIR:-/srv/www}"
target_dir="${DEPLOY_TARGET_DIR:-${base_dir}/${deploy_env}/${project_name}}"
deploy_remote="${DEPLOY_REMOTE:-}"
release_id="${BUILD_NUMBER:-manual}-$(git rev-parse --short=12 HEAD 2>/dev/null || date +%Y%m%d%H%M%S)"
remote_shell() {
if [[ -n "${deploy_remote}" ]]; then
ssh "${deploy_remote}" "$@"
else
bash -lc "$*"
fi
}
remote_copy() {
local source_dir="$1"
local dest_dir="$2"
if [[ -n "${deploy_remote}" ]]; then
rsync -az --delete "${source_dir}/" "${deploy_remote}:${dest_dir}/"
else
mkdir -p "${dest_dir}"
rsync -az --delete "${source_dir}/" "${dest_dir}/"
fi
}
release_dir="${target_dir}/releases/${release_id}"
shared_dir="${target_dir}/shared"
remote_shell "mkdir -p '${release_dir}' '${shared_dir}' '${target_dir}/logs'"
remote_copy "${artifact_dir}" "${release_dir}"
remote_shell "
set -euo pipefail
if [ -f '${shared_dir}/${env_file}' ]; then
ln -sfn '../../shared/${env_file}' '${release_dir}/${env_file}'
else
echo 'Missing ${shared_dir}/${env_file}; create it before starting the service.' >&2
fi
ln -sfn '${release_dir}' '${target_dir}/current'
"
if [[ -n "${DEPLOY_POST_DEPLOY_CMD:-}" ]]; then
remote_shell "cd '${target_dir}/current' && ${DEPLOY_POST_DEPLOY_CMD}"
else
echo "Deployed ${project_name} ${deploy_env} to ${target_dir}/current"
echo "Start with: set -a; source ${target_dir}/shared/${env_file}; set +a; node ${target_dir}/current/server.js"
fi