選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

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