Você não pode selecionar mais de 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.
 
 
 

204 linhas
5.5 KiB

  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. # Upload a runtime/update package to Tencent COS and print a deployable URL.
  4. # Required when COSCLI is not preconfigured:
  5. # COS_SECRET_ID, COS_SECRET_KEY, COS_REGION, COS_BUCKET
  6. #
  7. # Optional:
  8. # DEPLOY_ENV=emp-uat
  9. # PACKAGE_KIND=runtime|update|bootstrap
  10. # COS_PREFIX=deploy/emp-uat/update/20260611120000
  11. # COS_KEY=deploy/emp-uat/update/package.tar.gz
  12. # COS_SIGN_EXPIRE=604800
  13. # COS_CONFIG_PATH=/path/to/.cos.yaml
  14. # TARGET_BASE_DIR=/home/admin-x99/emp
  15. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  16. # Keep COS credentials outside the repository. A local .cos.env file is ignored
  17. # by Git and lets operators keep using the short build command.
  18. COS_ENV_FILE="${COS_ENV_FILE:-$SCRIPT_DIR/.cos.env}"
  19. if [[ -f "$COS_ENV_FILE" ]]; then
  20. set -a
  21. # shellcheck disable=SC1090
  22. . "$COS_ENV_FILE"
  23. set +a
  24. fi
  25. DEPLOY_ENV="${DEPLOY_ENV:-emp-test}"
  26. PACKAGE_KIND="${PACKAGE_KIND:-}"
  27. COSCLI_BIN="${COSCLI_BIN:-coscli}"
  28. COS_SIGN_EXPIRE="${COS_SIGN_EXPIRE:-604800}"
  29. TARGET_BASE_DIR="${TARGET_BASE_DIR:-/home/admin-x99/emp}"
  30. COS_SECRET_ID="${COS_SECRET_ID:-}"
  31. COS_SECRET_KEY="${COS_SECRET_KEY:-}"
  32. COS_REGION="${COS_REGION:-ap-chengdu}"
  33. COS_BUCKET="${COS_BUCKET:-emp-1258090764}"
  34. log() {
  35. echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
  36. }
  37. die() {
  38. echo "ERROR: $*" >&2
  39. exit 1
  40. }
  41. need_cmd() {
  42. command -v "$1" >/dev/null 2>&1 || die "Missing command: $1"
  43. }
  44. calc_sha256() {
  45. local file="$1"
  46. if command -v sha256sum >/dev/null 2>&1; then
  47. sha256sum "$file" | awk '{print $1}'
  48. elif command -v shasum >/dev/null 2>&1; then
  49. shasum -a 256 "$file" | awk '{print $1}'
  50. else
  51. echo ""
  52. fi
  53. }
  54. infer_package_kind() {
  55. local name="$1"
  56. if [[ -n "$PACKAGE_KIND" ]]; then
  57. echo "$PACKAGE_KIND"
  58. elif [[ "$name" == *"-update-"* ]]; then
  59. echo "update"
  60. else
  61. echo "runtime"
  62. fi
  63. }
  64. print_target_deploy_command() {
  65. local target_deploy_home target_script_dir
  66. if [[ "$DEPLOY_ENV" == "emp-shunfeng" ]]; then
  67. target_deploy_home="${TARGET_DEPLOY_HOME:-/home/emp-shunfeng}"
  68. else
  69. target_deploy_home="${TARGET_DEPLOY_HOME:-$TARGET_BASE_DIR/$DEPLOY_ENV}"
  70. fi
  71. if [[ "$PACKAGE_KIND" == "bootstrap" ]]; then
  72. cat <<EOF
  73. Target bootstrap command (run once on both shunfeng servers):
  74. set -Eeuo pipefail
  75. BOOTSTRAP_URL='$SIGNED_URL'
  76. BOOTSTRAP_SHA256='$SHA256'
  77. BOOTSTRAP_DIR="\$(mktemp -d /tmp/emp-shunfeng-bootstrap.XXXXXX)"
  78. BOOTSTRAP_FILE="\$BOOTSTRAP_DIR/package.tar.gz"
  79. if command -v curl >/dev/null 2>&1; then
  80. curl -fL --retry 3 --connect-timeout 20 -o "\$BOOTSTRAP_FILE" "\$BOOTSTRAP_URL"
  81. elif command -v wget >/dev/null 2>&1; then
  82. wget -O "\$BOOTSTRAP_FILE" "\$BOOTSTRAP_URL"
  83. else
  84. echo "ERROR: missing curl or wget" >&2
  85. exit 1
  86. fi
  87. if command -v sha256sum >/dev/null 2>&1; then
  88. echo "\$BOOTSTRAP_SHA256 \$BOOTSTRAP_FILE" | sha256sum -c -
  89. elif command -v shasum >/dev/null 2>&1; then
  90. test "\$(shasum -a 256 "\$BOOTSTRAP_FILE" | awk '{print \$1}')" = "\$BOOTSTRAP_SHA256"
  91. else
  92. echo "ERROR: missing sha256sum or shasum" >&2
  93. exit 1
  94. fi
  95. tar -xzf "\$BOOTSTRAP_FILE" -C "\$BOOTSTRAP_DIR" --strip-components=1
  96. OLD_EMP_DIR="\$(docker inspect emp-gateway --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}')"
  97. test -n "\$OLD_EMP_DIR" && test -f "\$OLD_EMP_DIR/.env" || {
  98. echo "ERROR: existing emp_server/.env not found" >&2
  99. exit 1
  100. }
  101. DEPLOY_HOME=$target_deploy_home \\
  102. EXISTING_ENV_FILE="\$OLD_EMP_DIR/.env" \\
  103. bash "\$BOOTSTRAP_DIR/install-runtime.sh"
  104. EOF
  105. return
  106. fi
  107. if [[ "$PACKAGE_KIND" == "update" ]]; then
  108. target_script_dir="${TARGET_SCRIPT_DIR:-$target_deploy_home/runtime}"
  109. else
  110. target_script_dir="${TARGET_SCRIPT_DIR:-$TARGET_BASE_DIR}"
  111. fi
  112. cat <<EOF
  113. Target deploy command:
  114. cd "$target_script_dir" && \\
  115. DEPLOY_ENV=$DEPLOY_ENV \\
  116. DEPLOY_HOME=$target_deploy_home \\
  117. PACKAGE_SHA256=$SHA256 \\
  118. bash deploy-from-url.sh '$SIGNED_URL'
  119. EOF
  120. }
  121. build_coscli_opts() {
  122. COSCLI_OPTS=()
  123. if [[ -n "${COS_CONFIG_PATH:-}" ]]; then
  124. COSCLI_OPTS+=("-c" "$COS_CONFIG_PATH")
  125. return
  126. fi
  127. [[ -n "${COS_SECRET_ID:-}" ]] || die "Missing COS_SECRET_ID or COS_CONFIG_PATH"
  128. [[ -n "${COS_SECRET_KEY:-}" ]] || die "Missing COS_SECRET_KEY or COS_CONFIG_PATH"
  129. [[ -n "${COS_REGION:-}" ]] || die "Missing COS_REGION"
  130. COSCLI_OPTS+=(
  131. "--init-skip=true"
  132. "-i" "$COS_SECRET_ID"
  133. "-k" "$COS_SECRET_KEY"
  134. "-e" "cos.$COS_REGION.myqcloud.com"
  135. )
  136. if [[ -n "${COS_TOKEN:-}" ]]; then
  137. COSCLI_OPTS+=("--token" "$COS_TOKEN")
  138. fi
  139. }
  140. [[ "$#" -eq 1 ]] || die "Usage: bash $SCRIPT_DIR/publish-cos.sh <package.tar.gz>"
  141. PACKAGE_FILE="$1"
  142. [[ -f "$PACKAGE_FILE" ]] || die "Package not found: $PACKAGE_FILE"
  143. [[ -n "${COS_BUCKET:-}" ]] || die "Missing COS_BUCKET"
  144. need_cmd "$COSCLI_BIN"
  145. build_coscli_opts
  146. PACKAGE_FILE="$(cd "$(dirname "$PACKAGE_FILE")" && pwd)/$(basename "$PACKAGE_FILE")"
  147. PACKAGE_BASE="$(basename "$PACKAGE_FILE")"
  148. PACKAGE_KIND="$(infer_package_kind "$PACKAGE_BASE")"
  149. RUN_ID="$(date '+%Y%m%d%H%M%S')"
  150. DEFAULT_PREFIX="deploy/$DEPLOY_ENV/$PACKAGE_KIND/$RUN_ID"
  151. COS_PREFIX="${COS_PREFIX:-$DEFAULT_PREFIX}"
  152. COS_PREFIX="${COS_PREFIX#/}"
  153. COS_PREFIX="${COS_PREFIX%/}"
  154. COS_KEY="${COS_KEY:-$COS_PREFIX/$PACKAGE_BASE}"
  155. COS_KEY="${COS_KEY#/}"
  156. COS_URI="cos://$COS_BUCKET/$COS_KEY"
  157. SHA256="$(calc_sha256 "$PACKAGE_FILE")"
  158. log "Upload package: $PACKAGE_FILE"
  159. log "COS object: $COS_URI"
  160. "$COSCLI_BIN" cp "$PACKAGE_FILE" "$COS_URI" "${COSCLI_OPTS[@]}"
  161. log "Generate signed URL, expire seconds: $COS_SIGN_EXPIRE"
  162. SIGNED_URL="$("$COSCLI_BIN" signurl "$COS_URI" --time "$COS_SIGN_EXPIRE" --simple-output "${COSCLI_OPTS[@]}")"
  163. cat <<EOF
  164. Package: $PACKAGE_FILE
  165. COS Key: $COS_KEY
  166. SHA256: $SHA256
  167. URL: $SIGNED_URL
  168. EOF
  169. print_target_deploy_command