Files
dingtalk-workspace-cli/scripts/release/sync-to-oss.sh
T
修雨 430d20f2ee ci(release): auto-sync release artifacts to China OSS mirror
Add scripts/release/sync-to-oss.sh and wire it into release.yml. After
the GitHub release, artifacts (binaries, checksums, dws-skills.zip) plus
the install scripts are pushed to an OSS bucket in the
<base>/<version>/<file> layout the install.sh DWS_RELEASE_BASE switch
expects, with a latest.txt pointer.

Gated on OSS_* repo secrets: skips cleanly when unset, so forks without
the secrets keep releasing to GitHub only.
2026-06-24 11:43:06 +08:00

101 lines
4.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# Copyright 2026 Alibaba Group
# Licensed under the Apache License, Version 2.0
#
# Sync release artifacts to a China-accessible OSS mirror so that the install
# scripts' DWS_RELEASE_BASE switch can serve domestic users.
#
# Mirror layout produced (matches install.sh RELEASE_BASE="<base>/<version>/<file>"):
# oss://$OSS_BUCKET/$OSS_PREFIX/download/<version>/dws-<os>-<arch>.tar.gz|.zip
# oss://$OSS_BUCKET/$OSS_PREFIX/download/<version>/checksums.txt
# oss://$OSS_BUCKET/$OSS_PREFIX/download/<version>/dws-skills.zip
# oss://$OSS_BUCKET/$OSS_PREFIX/latest.txt (plain version string)
#
# So with the CDN/custom domain CNAME'd to the bucket, China users run:
# DWS_RELEASE_BASE=https://<domain>/$OSS_PREFIX/download \
# DWS_VERSION=<version> \
# curl -fsSL https://<domain>/$OSS_PREFIX/install.sh | sh
#
# Required environment (CI secrets):
# OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, OSS_ENDPOINT, OSS_BUCKET
# Optional:
# OSS_PREFIX (default: dws)
# DIST_DIR (default: ./dist)
# VERSION (default: derived from `git describe`)
#
# Gating: if the required OSS_* vars are unset, the script exits 0 with a notice
# (so it can be wired into release.yml without breaking forks that lack secrets).
set -eu
DIST_DIR="${DIST_DIR:-dist}"
OSS_PREFIX="${OSS_PREFIX:-dws}"
# ── Gate: skip cleanly when credentials are not configured ────────────────────
missing=""
for v in OSS_ACCESS_KEY_ID OSS_ACCESS_KEY_SECRET OSS_ENDPOINT OSS_BUCKET; do
eval "val=\${$v:-}"
[ -z "$val" ] && missing="$missing $v"
done
if [ -n "$missing" ]; then
echo "ℹ️ OSS mirror sync skipped — missing:${missing}"
echo " Set these as repo secrets to auto-publish releases to the China mirror."
exit 0
fi
# ── Resolve version ──────────────────────────────────────────────────────────
VERSION="${VERSION:-$(git describe --tags --always 2>/dev/null || echo dev)}"
echo "📦 Syncing release ${VERSION} → oss://${OSS_BUCKET}/${OSS_PREFIX}/download/${VERSION}/"
# ── Ensure ossutil is available ───────────────────────────────────────────────
OSSUTIL="${OSSUTIL:-ossutil}"
if ! command -v "$OSSUTIL" >/dev/null 2>&1; then
echo "⬇ ossutil not found; installing to ./.ossutil ..."
os="$(uname -s | tr '[:upper:]' '[:lower:]')"
arch="$(uname -m)"
case "$arch" in x86_64|amd64) arch=amd64 ;; aarch64|arm64) arch=arm64 ;; esac
curl -fsSL "https://gosspublic.alicdn.com/ossutil/v2/2.0.0/ossutil-2.0.0-${os}-${arch}.zip" -o /tmp/ossutil.zip
unzip -qo /tmp/ossutil.zip -d /tmp/ossutil-extract
found="$(find /tmp/ossutil-extract -name ossutil -type f | head -1)"
mkdir -p ./.ossutil && cp "$found" ./.ossutil/ossutil && chmod +x ./.ossutil/ossutil
OSSUTIL="./.ossutil/ossutil"
fi
oss_cp() {
# oss_cp <local-file> <oss-key>
"$OSSUTIL" cp -f \
--access-key-id "$OSS_ACCESS_KEY_ID" \
--access-key-secret "$OSS_ACCESS_KEY_SECRET" \
--endpoint "$OSS_ENDPOINT" \
"$1" "oss://${OSS_BUCKET}/$2"
}
base="${OSS_PREFIX}/download/${VERSION}"
# ── Upload binaries + checksums + skills ──────────────────────────────────────
uploaded=0
for f in "$DIST_DIR"/dws-*.tar.gz "$DIST_DIR"/dws-*.zip "$DIST_DIR"/checksums.txt; do
[ -f "$f" ] || continue
oss_cp "$f" "${base}/$(basename "$f")"
uploaded=$((uploaded + 1))
done
if [ "$uploaded" -eq 0 ]; then
echo "❌ No artifacts found in ${DIST_DIR}. Run the build (goreleaser) first." >&2
exit 1
fi
# ── Publish the latest pointer (for DWS_VERSION=latest resolution on mirror) ──
echo "$VERSION" > /tmp/dws-latest.txt
oss_cp /tmp/dws-latest.txt "${OSS_PREFIX}/latest.txt"
# ── Publish the install scripts themselves (entry layer) ──────────────────────
for s in install.sh install.ps1 install-skills.sh; do
[ -f "scripts/$s" ] && oss_cp "scripts/$s" "${OSS_PREFIX}/$s"
done
echo "✅ Synced ${uploaded} artifact(s) + install scripts + latest.txt to the OSS mirror."
echo " China install:"
echo " DWS_RELEASE_BASE=https://<your-domain>/${OSS_PREFIX}/download DWS_VERSION=${VERSION} \\"
echo " curl -fsSL https://<your-domain>/${OSS_PREFIX}/install.sh | sh"