Files
dingtalk-workspace-cli/scripts/release/download-github-release-assets.sh

88 lines
2.7 KiB
Bash
Executable File

#!/bin/sh
set -eu
SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
TAG="${1:-}"
DEST_DIR="${2:-}"
REPOSITORY="${GITHUB_REPOSITORY:-}"
RELEASE_ID="${DWS_GITHUB_RELEASE_ID:-}"
[ -n "$TAG" ] && [ -n "$DEST_DIR" ] && [ -n "$REPOSITORY" ] || {
printf 'usage: GITHUB_REPOSITORY=owner/repo [DWS_GITHUB_RELEASE_ID=id] download-github-release-assets.sh <tag> <destination>\n' >&2
exit 2
}
[ -n "$RELEASE_ID" ] || {
printf 'DWS_GITHUB_RELEASE_ID is required for an exact release download\n' >&2
exit 2
}
printf '%s\n' "$RELEASE_ID" | grep -Eq '^[1-9][0-9]*$' || {
printf 'invalid GitHub Release ID: %s\n' "$RELEASE_ID" >&2
exit 2
}
command -v gh >/dev/null 2>&1 || { printf 'gh is required\n' >&2; exit 1; }
DWS_GITHUB_RELEASE_ID="$RELEASE_ID" \
"$SCRIPT_DIR/verify-github-release-assets.sh" "$TAG"
tmp="$(mktemp -d "${TMPDIR:-/tmp}/dws-github-release-download.XXXXXX")"
trap 'rm -rf "$tmp"' EXIT HUP INT TERM
tab="$(printf '\t')"
cat > "$tmp/expected" <<'EOF'
checksums.txt
dws-darwin-amd64.tar.gz
dws-darwin-arm64.tar.gz
dws-linux-amd64.tar.gz
dws-linux-arm64.tar.gz
dws-skills.zip
dws-windows-amd64.zip
dws-windows-arm64.zip
EOF
LC_ALL=C sort "$tmp/expected" -o "$tmp/expected"
gh api -H 'Accept: application/vnd.github+json' \
"repos/$REPOSITORY/releases/$RELEASE_ID" \
--jq '.assets[] | [.id, .name] | @tsv' > "$tmp/assets.tsv"
cut -f 2 "$tmp/assets.tsv" | LC_ALL=C sort > "$tmp/actual"
if ! diff -u "$tmp/expected" "$tmp/actual"; then
printf 'GitHub Release %s must contain exactly the supported assets\n' "$TAG" >&2
exit 1
fi
while IFS="$tab" read -r asset_id asset_name; do
printf '%s\n' "$asset_id" | grep -Eq '^[1-9][0-9]*$' || {
printf 'invalid GitHub Release asset ID: %s\n' "$asset_id" >&2
exit 1
}
case "$asset_name" in
checksums.txt | \
dws-darwin-amd64.tar.gz | dws-darwin-arm64.tar.gz | \
dws-linux-amd64.tar.gz | dws-linux-arm64.tar.gz | \
dws-windows-amd64.zip | dws-windows-arm64.zip | \
dws-skills.zip) ;;
*)
printf 'unsupported GitHub Release asset name: %s\n' "$asset_name" >&2
exit 1
;;
esac
gh api -H 'Accept: application/octet-stream' \
"repos/$REPOSITORY/releases/assets/$asset_id" > "$tmp/$asset_name"
done < "$tmp/assets.tsv"
mkdir -p "$DEST_DIR"
for asset_name in \
checksums.txt \
dws-darwin-amd64.tar.gz \
dws-darwin-arm64.tar.gz \
dws-linux-amd64.tar.gz \
dws-linux-arm64.tar.gz \
dws-windows-amd64.zip \
dws-windows-arm64.zip \
dws-skills.zip; do
[ -f "$tmp/$asset_name" ] || {
printf 'GitHub Release asset was not downloaded: %s\n' "$asset_name" >&2
exit 1
}
mv -f "$tmp/$asset_name" "$DEST_DIR/$asset_name"
done
printf 'GitHub Release assets downloaded and verified: %s\n' "$TAG"