Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

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