You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

161 regels
4.2 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. # 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" == "update" ]]; then
  72. target_script_dir="${TARGET_SCRIPT_DIR:-$target_deploy_home/runtime}"
  73. else
  74. target_script_dir="${TARGET_SCRIPT_DIR:-$TARGET_BASE_DIR}"
  75. fi
  76. cat <<EOF
  77. Target deploy command:
  78. cd "$target_script_dir" && \\
  79. DEPLOY_ENV=$DEPLOY_ENV \\
  80. DEPLOY_HOME=$target_deploy_home \\
  81. PACKAGE_SHA256=$SHA256 \\
  82. bash deploy-from-url.sh '$SIGNED_URL'
  83. EOF
  84. }
  85. build_coscli_opts() {
  86. COSCLI_OPTS=()
  87. if [[ -n "${COS_CONFIG_PATH:-}" ]]; then
  88. COSCLI_OPTS+=("-c" "$COS_CONFIG_PATH")
  89. return
  90. fi
  91. [[ -n "${COS_SECRET_ID:-}" ]] || die "Missing COS_SECRET_ID or COS_CONFIG_PATH"
  92. [[ -n "${COS_SECRET_KEY:-}" ]] || die "Missing COS_SECRET_KEY or COS_CONFIG_PATH"
  93. [[ -n "${COS_REGION:-}" ]] || die "Missing COS_REGION"
  94. COSCLI_OPTS+=(
  95. "--init-skip=true"
  96. "-i" "$COS_SECRET_ID"
  97. "-k" "$COS_SECRET_KEY"
  98. "-e" "cos.$COS_REGION.myqcloud.com"
  99. )
  100. if [[ -n "${COS_TOKEN:-}" ]]; then
  101. COSCLI_OPTS+=("--token" "$COS_TOKEN")
  102. fi
  103. }
  104. [[ "$#" -eq 1 ]] || die "Usage: bash $SCRIPT_DIR/publish-cos.sh <package.tar.gz>"
  105. PACKAGE_FILE="$1"
  106. [[ -f "$PACKAGE_FILE" ]] || die "Package not found: $PACKAGE_FILE"
  107. [[ -n "${COS_BUCKET:-}" ]] || die "Missing COS_BUCKET"
  108. need_cmd "$COSCLI_BIN"
  109. build_coscli_opts
  110. PACKAGE_FILE="$(cd "$(dirname "$PACKAGE_FILE")" && pwd)/$(basename "$PACKAGE_FILE")"
  111. PACKAGE_BASE="$(basename "$PACKAGE_FILE")"
  112. PACKAGE_KIND="$(infer_package_kind "$PACKAGE_BASE")"
  113. RUN_ID="$(date '+%Y%m%d%H%M%S')"
  114. DEFAULT_PREFIX="deploy/$DEPLOY_ENV/$PACKAGE_KIND/$RUN_ID"
  115. COS_PREFIX="${COS_PREFIX:-$DEFAULT_PREFIX}"
  116. COS_PREFIX="${COS_PREFIX#/}"
  117. COS_PREFIX="${COS_PREFIX%/}"
  118. COS_KEY="${COS_KEY:-$COS_PREFIX/$PACKAGE_BASE}"
  119. COS_KEY="${COS_KEY#/}"
  120. COS_URI="cos://$COS_BUCKET/$COS_KEY"
  121. SHA256="$(calc_sha256 "$PACKAGE_FILE")"
  122. log "Upload package: $PACKAGE_FILE"
  123. log "COS object: $COS_URI"
  124. "$COSCLI_BIN" cp "$PACKAGE_FILE" "$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_FILE
  129. COS Key: $COS_KEY
  130. SHA256: $SHA256
  131. URL: $SIGNED_URL
  132. EOF
  133. print_target_deploy_command