|
- #!/usr/bin/env bash
- set -Eeuo pipefail
-
- # Upload a runtime/update package to Tencent COS and print a deployable URL.
- # Required when COSCLI is not preconfigured:
- # COS_SECRET_ID, COS_SECRET_KEY, COS_REGION, COS_BUCKET
- #
- # Optional:
- # DEPLOY_ENV=emp-uat
- # PACKAGE_KIND=runtime|update
- # COS_PREFIX=deploy/emp-uat/update/20260611120000
- # COS_KEY=deploy/emp-uat/update/package.tar.gz
- # COS_SIGN_EXPIRE=604800
- # COS_CONFIG_PATH=/path/to/.cos.yaml
- # TARGET_BASE_DIR=/home/admin-x99/emp
-
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
-
- DEPLOY_ENV="${DEPLOY_ENV:-emp-test}"
- PACKAGE_KIND="${PACKAGE_KIND:-}"
- COSCLI_BIN="${COSCLI_BIN:-coscli}"
- COS_SIGN_EXPIRE="${COS_SIGN_EXPIRE:-604800}"
- TARGET_BASE_DIR="${TARGET_BASE_DIR:-/home/admin-x99/emp}"
-
- log() {
- echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
- }
-
- die() {
- echo "ERROR: $*" >&2
- exit 1
- }
-
- need_cmd() {
- command -v "$1" >/dev/null 2>&1 || die "Missing command: $1"
- }
-
- calc_sha256() {
- local file="$1"
- if command -v sha256sum >/dev/null 2>&1; then
- sha256sum "$file" | awk '{print $1}'
- elif command -v shasum >/dev/null 2>&1; then
- shasum -a 256 "$file" | awk '{print $1}'
- else
- echo ""
- fi
- }
-
- infer_package_kind() {
- local name="$1"
- if [[ -n "$PACKAGE_KIND" ]]; then
- echo "$PACKAGE_KIND"
- elif [[ "$name" == *"-update-"* ]]; then
- echo "update"
- else
- echo "runtime"
- fi
- }
-
- print_target_deploy_command() {
- local target_deploy_home target_script_dir
- target_deploy_home="${TARGET_DEPLOY_HOME:-$TARGET_BASE_DIR/$DEPLOY_ENV}"
-
- if [[ "$PACKAGE_KIND" == "update" ]]; then
- target_script_dir="${TARGET_SCRIPT_DIR:-$target_deploy_home/runtime}"
- else
- target_script_dir="${TARGET_SCRIPT_DIR:-$TARGET_BASE_DIR}"
- fi
-
- cat <<EOF
-
- Target deploy command:
- cd "$target_script_dir" && \\
- DEPLOY_ENV=$DEPLOY_ENV \\
- DEPLOY_HOME=$target_deploy_home \\
- PACKAGE_SHA256=$SHA256 \\
- bash deploy-from-url.sh '$SIGNED_URL'
-
- EOF
- }
-
- build_coscli_opts() {
- COSCLI_OPTS=()
-
- if [[ -n "${COS_CONFIG_PATH:-}" ]]; then
- COSCLI_OPTS+=("-c" "$COS_CONFIG_PATH")
- return
- fi
-
- [[ -n "${COS_SECRET_ID:-}" ]] || die "Missing COS_SECRET_ID or COS_CONFIG_PATH"
- [[ -n "${COS_SECRET_KEY:-}" ]] || die "Missing COS_SECRET_KEY or COS_CONFIG_PATH"
- [[ -n "${COS_REGION:-}" ]] || die "Missing COS_REGION"
-
- COSCLI_OPTS+=(
- "--init-skip=true"
- "-i" "$COS_SECRET_ID"
- "-k" "$COS_SECRET_KEY"
- "-e" "cos.$COS_REGION.myqcloud.com"
- )
-
- if [[ -n "${COS_TOKEN:-}" ]]; then
- COSCLI_OPTS+=("--token" "$COS_TOKEN")
- fi
- }
-
- [[ "$#" -eq 1 ]] || die "Usage: bash $SCRIPT_DIR/publish-cos.sh <package.tar.gz>"
- PACKAGE_FILE="$1"
- [[ -f "$PACKAGE_FILE" ]] || die "Package not found: $PACKAGE_FILE"
- [[ -n "${COS_BUCKET:-}" ]] || die "Missing COS_BUCKET"
-
- need_cmd "$COSCLI_BIN"
- build_coscli_opts
-
- PACKAGE_FILE="$(cd "$(dirname "$PACKAGE_FILE")" && pwd)/$(basename "$PACKAGE_FILE")"
- PACKAGE_BASE="$(basename "$PACKAGE_FILE")"
- PACKAGE_KIND="$(infer_package_kind "$PACKAGE_BASE")"
- RUN_ID="$(date '+%Y%m%d%H%M%S')"
- DEFAULT_PREFIX="deploy/$DEPLOY_ENV/$PACKAGE_KIND/$RUN_ID"
- COS_PREFIX="${COS_PREFIX:-$DEFAULT_PREFIX}"
- COS_PREFIX="${COS_PREFIX#/}"
- COS_PREFIX="${COS_PREFIX%/}"
- COS_KEY="${COS_KEY:-$COS_PREFIX/$PACKAGE_BASE}"
- COS_KEY="${COS_KEY#/}"
- COS_URI="cos://$COS_BUCKET/$COS_KEY"
- SHA256="$(calc_sha256 "$PACKAGE_FILE")"
-
- log "Upload package: $PACKAGE_FILE"
- log "COS object: $COS_URI"
- "$COSCLI_BIN" cp "$PACKAGE_FILE" "$COS_URI" "${COSCLI_OPTS[@]}"
-
- log "Generate signed URL, expire seconds: $COS_SIGN_EXPIRE"
- SIGNED_URL="$("$COSCLI_BIN" signurl "$COS_URI" --time "$COS_SIGN_EXPIRE" --simple-output "${COSCLI_OPTS[@]}")"
-
- cat <<EOF
-
- Package: $PACKAGE_FILE
- COS Key: $COS_KEY
- SHA256: $SHA256
- URL: $SIGNED_URL
- EOF
-
- print_target_deploy_command
|