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

143 строки
3.6 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
  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. DEPLOY_ENV="${DEPLOY_ENV:-emp-test}"
  17. PACKAGE_KIND="${PACKAGE_KIND:-}"
  18. COSCLI_BIN="${COSCLI_BIN:-coscli}"
  19. COS_SIGN_EXPIRE="${COS_SIGN_EXPIRE:-604800}"
  20. TARGET_BASE_DIR="${TARGET_BASE_DIR:-/home/admin-x99/emp}"
  21. log() {
  22. echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
  23. }
  24. die() {
  25. echo "ERROR: $*" >&2
  26. exit 1
  27. }
  28. need_cmd() {
  29. command -v "$1" >/dev/null 2>&1 || die "Missing command: $1"
  30. }
  31. calc_sha256() {
  32. local file="$1"
  33. if command -v sha256sum >/dev/null 2>&1; then
  34. sha256sum "$file" | awk '{print $1}'
  35. elif command -v shasum >/dev/null 2>&1; then
  36. shasum -a 256 "$file" | awk '{print $1}'
  37. else
  38. echo ""
  39. fi
  40. }
  41. infer_package_kind() {
  42. local name="$1"
  43. if [[ -n "$PACKAGE_KIND" ]]; then
  44. echo "$PACKAGE_KIND"
  45. elif [[ "$name" == *"-update-"* ]]; then
  46. echo "update"
  47. else
  48. echo "runtime"
  49. fi
  50. }
  51. print_target_deploy_command() {
  52. local target_deploy_home target_script_dir
  53. target_deploy_home="${TARGET_DEPLOY_HOME:-$TARGET_BASE_DIR/$DEPLOY_ENV}"
  54. if [[ "$PACKAGE_KIND" == "update" ]]; then
  55. target_script_dir="${TARGET_SCRIPT_DIR:-$target_deploy_home/runtime}"
  56. else
  57. target_script_dir="${TARGET_SCRIPT_DIR:-$TARGET_BASE_DIR}"
  58. fi
  59. cat <<EOF
  60. Target deploy command:
  61. cd "$target_script_dir" && \\
  62. DEPLOY_ENV=$DEPLOY_ENV \\
  63. DEPLOY_HOME=$target_deploy_home \\
  64. PACKAGE_SHA256=$SHA256 \\
  65. bash deploy-from-url.sh '$SIGNED_URL'
  66. EOF
  67. }
  68. build_coscli_opts() {
  69. COSCLI_OPTS=()
  70. if [[ -n "${COS_CONFIG_PATH:-}" ]]; then
  71. COSCLI_OPTS+=("-c" "$COS_CONFIG_PATH")
  72. return
  73. fi
  74. [[ -n "${COS_SECRET_ID:-}" ]] || die "Missing COS_SECRET_ID or COS_CONFIG_PATH"
  75. [[ -n "${COS_SECRET_KEY:-}" ]] || die "Missing COS_SECRET_KEY or COS_CONFIG_PATH"
  76. [[ -n "${COS_REGION:-}" ]] || die "Missing COS_REGION"
  77. COSCLI_OPTS+=(
  78. "--init-skip=true"
  79. "-i" "$COS_SECRET_ID"
  80. "-k" "$COS_SECRET_KEY"
  81. "-e" "cos.$COS_REGION.myqcloud.com"
  82. )
  83. if [[ -n "${COS_TOKEN:-}" ]]; then
  84. COSCLI_OPTS+=("--token" "$COS_TOKEN")
  85. fi
  86. }
  87. [[ "$#" -eq 1 ]] || die "Usage: bash $SCRIPT_DIR/publish-cos.sh <package.tar.gz>"
  88. PACKAGE_FILE="$1"
  89. [[ -f "$PACKAGE_FILE" ]] || die "Package not found: $PACKAGE_FILE"
  90. [[ -n "${COS_BUCKET:-}" ]] || die "Missing COS_BUCKET"
  91. need_cmd "$COSCLI_BIN"
  92. build_coscli_opts
  93. PACKAGE_FILE="$(cd "$(dirname "$PACKAGE_FILE")" && pwd)/$(basename "$PACKAGE_FILE")"
  94. PACKAGE_BASE="$(basename "$PACKAGE_FILE")"
  95. PACKAGE_KIND="$(infer_package_kind "$PACKAGE_BASE")"
  96. RUN_ID="$(date '+%Y%m%d%H%M%S')"
  97. DEFAULT_PREFIX="deploy/$DEPLOY_ENV/$PACKAGE_KIND/$RUN_ID"
  98. COS_PREFIX="${COS_PREFIX:-$DEFAULT_PREFIX}"
  99. COS_PREFIX="${COS_PREFIX#/}"
  100. COS_PREFIX="${COS_PREFIX%/}"
  101. COS_KEY="${COS_KEY:-$COS_PREFIX/$PACKAGE_BASE}"
  102. COS_KEY="${COS_KEY#/}"
  103. COS_URI="cos://$COS_BUCKET/$COS_KEY"
  104. SHA256="$(calc_sha256 "$PACKAGE_FILE")"
  105. log "Upload package: $PACKAGE_FILE"
  106. log "COS object: $COS_URI"
  107. "$COSCLI_BIN" cp "$PACKAGE_FILE" "$COS_URI" "${COSCLI_OPTS[@]}"
  108. log "Generate signed URL, expire seconds: $COS_SIGN_EXPIRE"
  109. SIGNED_URL="$("$COSCLI_BIN" signurl "$COS_URI" --time "$COS_SIGN_EXPIRE" --simple-output "${COSCLI_OPTS[@]}")"
  110. cat <<EOF
  111. Package: $PACKAGE_FILE
  112. COS Key: $COS_KEY
  113. SHA256: $SHA256
  114. URL: $SIGNED_URL
  115. EOF
  116. print_target_deploy_command