Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 

163 řádky
4.3 KiB

  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. # Package the Kafka middleware image, upload it to Tencent COS, and print
  4. # commands for loading it on the target server.
  5. #
  6. # Required when COSCLI is not preconfigured:
  7. # COS_SECRET_ID, COS_SECRET_KEY, COS_REGION, COS_BUCKET
  8. #
  9. # Optional:
  10. # KAFKA_IMAGE=bitnami/kafka:3.7.0
  11. # DEPLOY_ENV=emp-test
  12. # DIST_DIR=deploy/isolated/dist
  13. # COS_PREFIX=deploy/emp-test/middleware/kafka
  14. # COS_SIGN_EXPIRE=604800
  15. # COS_CONFIG_PATH=/path/to/.cos.yaml
  16. # COSCLI_BIN=coscli
  17. # SKIP_PULL=1
  18. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  19. DIST_DIR="${DIST_DIR:-$SCRIPT_DIR/dist}"
  20. KAFKA_IMAGE="${KAFKA_IMAGE:-bitnami/kafka:3.7.0}"
  21. DEPLOY_ENV="${DEPLOY_ENV:-emp-test}"
  22. COSCLI_BIN="${COSCLI_BIN:-coscli}"
  23. COS_SIGN_EXPIRE="${COS_SIGN_EXPIRE:-604800}"
  24. TARGET_BASE_DIR="${TARGET_BASE_DIR:-/home/admin-x99/emp}"
  25. RUN_ID="$(date '+%Y%m%d%H%M%S')"
  26. SAFE_IMAGE_NAME="$(echo "$KAFKA_IMAGE" | tr '/:' '--')"
  27. PACKAGE_NAME="${PACKAGE_NAME:-${DEPLOY_ENV}-${SAFE_IMAGE_NAME}-${RUN_ID}}"
  28. PACKAGE_DIR="$DIST_DIR/$PACKAGE_NAME"
  29. PACKAGE_ARCHIVE="$DIST_DIR/${PACKAGE_NAME}.tar.gz"
  30. log() {
  31. echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
  32. }
  33. die() {
  34. echo "ERROR: $*" >&2
  35. exit 1
  36. }
  37. need_cmd() {
  38. command -v "$1" >/dev/null 2>&1 || die "Missing command: $1"
  39. }
  40. calc_sha256() {
  41. local file="$1"
  42. if command -v sha256sum >/dev/null 2>&1; then
  43. sha256sum "$file" | awk '{print $1}'
  44. elif command -v shasum >/dev/null 2>&1; then
  45. shasum -a 256 "$file" | awk '{print $1}'
  46. else
  47. echo ""
  48. fi
  49. }
  50. build_coscli_opts() {
  51. COSCLI_OPTS=()
  52. if [[ -n "${COS_CONFIG_PATH:-}" ]]; then
  53. COSCLI_OPTS+=("-c" "$COS_CONFIG_PATH")
  54. return
  55. fi
  56. [[ -n "${COS_SECRET_ID:-}" ]] || die "Missing COS_SECRET_ID or COS_CONFIG_PATH"
  57. [[ -n "${COS_SECRET_KEY:-}" ]] || die "Missing COS_SECRET_KEY or COS_CONFIG_PATH"
  58. [[ -n "${COS_REGION:-}" ]] || die "Missing COS_REGION"
  59. COSCLI_OPTS+=(
  60. "--init-skip=true"
  61. "-i" "$COS_SECRET_ID"
  62. "-k" "$COS_SECRET_KEY"
  63. "-e" "cos.$COS_REGION.myqcloud.com"
  64. )
  65. if [[ -n "${COS_TOKEN:-}" ]]; then
  66. COSCLI_OPTS+=("--token" "$COS_TOKEN")
  67. fi
  68. }
  69. write_load_script() {
  70. cat > "$PACKAGE_DIR/load-kafka-image.sh" <<EOF
  71. #!/usr/bin/env bash
  72. set -Eeuo pipefail
  73. SCRIPT_DIR="\$(cd "\$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
  74. echo "[load] docker load: \$SCRIPT_DIR/images.tar"
  75. docker load -i "\$SCRIPT_DIR/images.tar"
  76. echo "[load] done: $KAFKA_IMAGE"
  77. EOF
  78. chmod +x "$PACKAGE_DIR/load-kafka-image.sh"
  79. }
  80. print_target_commands() {
  81. local target_runtime="$TARGET_BASE_DIR/$DEPLOY_ENV/runtime"
  82. cat <<EOF
  83. Target commands:
  84. mkdir -p /tmp/emp-kafka-image && \\
  85. curl -fL '$SIGNED_URL' -o /tmp/emp-kafka-image/package.tar.gz && \\
  86. tar -xzf /tmp/emp-kafka-image/package.tar.gz -C /tmp/emp-kafka-image --strip-components=1 && \\
  87. bash /tmp/emp-kafka-image/load-kafka-image.sh
  88. Then start Kafka and data:
  89. cd "$target_runtime" && docker compose --profile local-kafka up -d kafka kafka-init
  90. docker restart $DEPLOY_ENV-emp-data-1
  91. Verify:
  92. docker ps -a | grep -E 'kafka|$DEPLOY_ENV-emp-data'
  93. EOF
  94. }
  95. need_cmd docker
  96. need_cmd tar
  97. need_cmd "$COSCLI_BIN"
  98. [[ -n "${COS_BUCKET:-}" ]] || die "Missing COS_BUCKET"
  99. build_coscli_opts
  100. mkdir -p "$DIST_DIR"
  101. rm -rf "$PACKAGE_DIR"
  102. mkdir -p "$PACKAGE_DIR"
  103. if [[ "${SKIP_PULL:-0}" != "1" ]]; then
  104. log "Pull Kafka image: $KAFKA_IMAGE"
  105. docker pull "$KAFKA_IMAGE"
  106. else
  107. log "Skip pull, use local image: $KAFKA_IMAGE"
  108. fi
  109. log "Save Kafka image"
  110. docker save -o "$PACKAGE_DIR/images.tar" "$KAFKA_IMAGE"
  111. write_load_script
  112. log "Archive package: $PACKAGE_ARCHIVE"
  113. rm -f "$PACKAGE_ARCHIVE"
  114. tar -czf "$PACKAGE_ARCHIVE" -C "$DIST_DIR" "$PACKAGE_NAME"
  115. SHA256="$(calc_sha256 "$PACKAGE_ARCHIVE")"
  116. COS_PREFIX="${COS_PREFIX:-deploy/$DEPLOY_ENV/middleware/kafka/$RUN_ID}"
  117. COS_PREFIX="${COS_PREFIX#/}"
  118. COS_PREFIX="${COS_PREFIX%/}"
  119. COS_KEY="${COS_KEY:-$COS_PREFIX/$(basename "$PACKAGE_ARCHIVE")}"
  120. COS_KEY="${COS_KEY#/}"
  121. COS_URI="cos://$COS_BUCKET/$COS_KEY"
  122. log "Upload package: $PACKAGE_ARCHIVE"
  123. log "COS object: $COS_URI"
  124. "$COSCLI_BIN" cp "$PACKAGE_ARCHIVE" "$COS_URI" "${COSCLI_OPTS[@]}"
  125. log "Generate signed URL, expire seconds: $COS_SIGN_EXPIRE"
  126. SIGNED_URL="$("$COSCLI_BIN" signurl "$COS_URI" --time "$COS_SIGN_EXPIRE" --simple-output "${COSCLI_OPTS[@]}")"
  127. cat <<EOF
  128. Package: $PACKAGE_ARCHIVE
  129. Image: $KAFKA_IMAGE
  130. COS Key: $COS_KEY
  131. SHA256: $SHA256
  132. URL: $SIGNED_URL
  133. EOF
  134. print_target_commands