Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 

129 строки
3.2 KiB

  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. # Apply an incremental image update on the target runtime server.
  4. # Usage:
  5. # bash apply-update.sh
  6. # bash apply-update.sh emp-admin emp-monitor
  7. # PROJECT_NAME=emp-test ENV_FILE=.env COMPOSE_FILE=docker-compose.yml bash apply-update.sh
  8. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  9. cd "$SCRIPT_DIR"
  10. PROJECT_NAME="${PROJECT_NAME:-emp-test}"
  11. ENV_FILE="${ENV_FILE:-.env}"
  12. COMPOSE_FILE="${COMPOSE_FILE:-docker-compose.yml}"
  13. IMAGE_TAR="${IMAGE_TAR:-images.tar}"
  14. SERVICE_FILE="${SERVICE_FILE:-services.txt}"
  15. log() {
  16. echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
  17. }
  18. die() {
  19. echo "ERROR: $*" >&2
  20. exit 1
  21. }
  22. need_cmd() {
  23. command -v "$1" >/dev/null 2>&1 || die "Missing command: $1"
  24. }
  25. normalize_service() {
  26. case "$1" in
  27. gateway|emp-gateway) echo "emp-gateway" ;;
  28. auth|emp-auth) echo "emp-auth" ;;
  29. monitor|emp-monitor) echo "emp-monitor" ;;
  30. data|emp-data) echo "emp-data" ;;
  31. pdf|emp-pdf) echo "emp-pdf" ;;
  32. ws|emp-ws) echo "emp-ws" ;;
  33. admin|emp-admin) echo "emp-admin" ;;
  34. *) die "Unknown service: $1. Allowed: gateway auth monitor data pdf ws admin" ;;
  35. esac
  36. }
  37. resolve_compose_cmd() {
  38. if docker compose version >/dev/null 2>&1; then
  39. echo "docker compose"
  40. elif command -v docker-compose >/dev/null 2>&1; then
  41. echo "docker-compose"
  42. else
  43. die "Missing docker compose"
  44. fi
  45. }
  46. resolve_runtime_file() {
  47. local requested="$1"
  48. local default_name="$2"
  49. if [[ -f "$requested" ]]; then
  50. echo "$requested"
  51. return
  52. fi
  53. if [[ "$requested" != "$default_name" ]]; then
  54. echo "$requested"
  55. return
  56. fi
  57. local candidates=(
  58. "../runtime/$default_name"
  59. "/home/admin-x99/emp-test/runtime/$default_name"
  60. )
  61. local candidate
  62. for candidate in "${candidates[@]}"; do
  63. if [[ -f "$candidate" ]]; then
  64. echo "$candidate"
  65. return
  66. fi
  67. done
  68. echo "$requested"
  69. }
  70. read_services() {
  71. local raw_services=()
  72. if [[ "$#" -gt 0 ]]; then
  73. raw_services=("$@")
  74. elif [[ -f "$SERVICE_FILE" ]]; then
  75. mapfile -t raw_services < "$SERVICE_FILE"
  76. else
  77. die "No services specified. Pass services as args or provide $SERVICE_FILE."
  78. fi
  79. local service
  80. for service in "${raw_services[@]}"; do
  81. [[ -n "$service" ]] || continue
  82. normalize_service "$service"
  83. done
  84. }
  85. need_cmd docker
  86. ENV_FILE="$(resolve_runtime_file "$ENV_FILE" ".env")"
  87. COMPOSE_FILE="$(resolve_runtime_file "$COMPOSE_FILE" "docker-compose.yml")"
  88. [[ -f "$ENV_FILE" ]] || die "Missing env file: $ENV_FILE"
  89. [[ -f "$COMPOSE_FILE" ]] || die "Missing compose file: $COMPOSE_FILE"
  90. [[ -f "$IMAGE_TAR" ]] || die "Missing image tar: $IMAGE_TAR"
  91. mapfile -t UPDATE_SERVICES < <(read_services "$@")
  92. [[ "${#UPDATE_SERVICES[@]}" -gt 0 ]] || die "No services to update."
  93. COMPOSE_CMD="$(resolve_compose_cmd)"
  94. log "Load images: $IMAGE_TAR"
  95. docker load -i "$IMAGE_TAR"
  96. log "Recreate services: ${UPDATE_SERVICES[*]}"
  97. # shellcheck disable=SC2086
  98. $COMPOSE_CMD \
  99. --env-file "$ENV_FILE" \
  100. -f "$COMPOSE_FILE" \
  101. -p "$PROJECT_NAME" \
  102. up -d --no-deps --force-recreate "${UPDATE_SERVICES[@]}"
  103. log "Current service status"
  104. # shellcheck disable=SC2086
  105. $COMPOSE_CMD \
  106. --env-file "$ENV_FILE" \
  107. -f "$COMPOSE_FILE" \
  108. -p "$PROJECT_NAME" \
  109. ps "${UPDATE_SERVICES[@]}"