#!/usr/bin/env bash set -euo pipefail deploy_env="${1:?Usage: deploy-backend.sh test|production}" case "${deploy_env}" in test) env_file=".env.test" ;; production) env_file=".env.production" ;; *) echo "Unknown deploy environment: ${deploy_env}" >&2 exit 1 ;; esac project_name="${PROJECT_NAME:-access-manage}" 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)" package_dir=".deploy/${project_name}" rm -rf "${package_dir}" mkdir -p "${package_dir}" cp -R dist "${package_dir}/dist" cp -R migrations "${package_dir}/migrations" cp -R deploy "${package_dir}/deploy" cp package.json pnpm-lock.yaml "${package_dir}/" 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 "${package_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 "Set DEPLOY_POST_DEPLOY_CMD in Jenkins to install production dependencies, run migrations, and restart the service." fi