playwright/browser_patches/upload.sh
Andrey Lushnikov a7e73cc389
feat: compute md5 hash for CDN uploads. (#11750)
By default, azure auto-computes MD5 for all blobs < 64MBs.
However, many of our binaries exceed 64MB so md5 has to be computed
manually.

With this patch, MD5 hash will be set to all our CDN uploads and could
be retrieved as `content-md5` header, e.g.:

```bash
$ curl -I https://playwright.azureedge.net/builds/ffmpeg/1001/ffmpeg-win32.zip
```

Fixes #10173
2022-01-31 09:13:43 -08:00

79 lines
2.4 KiB
Bash
Executable File

#!/bin/bash
set -e
set +x
trap "cd $(pwd -P)" EXIT
cd "$(dirname "$0")"
if [[ ($1 == '--help') || ($1 == '-h') ]]; then
echo "usage: $(basename "$0") [BLOB-PATH] [--check|ZIP-PATH]"
echo
echo "Upload ZIP-PATH to BLOB-PATH in 'builds' container."
echo
echo "--check pass |--check| as a second parameter instead of a zip-path to check for"
echo " existance of BLOB-PATH"
echo
echo "NOTE: \$AZ_ACCOUNT_KEY (azure account name) and \$AZ_ACCOUNT_NAME (azure account name)"
echo "env variables are required to upload builds to CDN."
exit 0
fi
if [[ (-z $AZ_ACCOUNT_KEY) || (-z $AZ_ACCOUNT_NAME) ]]; then
echo "ERROR: Either \$AZ_ACCOUNT_KEY or \$AZ_ACCOUNT_NAME environment variable is missing."
echo " 'Azure Account Name' and 'Azure Account Key' secrets that are required"
echo " to upload builds ot Azure CDN."
exit 1
fi
if [[ $# < 2 ]]; then
echo "not enought arguments!"
echo "try '$(basename "$0") --help' for more information"
exit 1
fi
BLOB_PATH="$1"
ZIP_PATH="$2"
if [[ ("$2" == '--check') ]]; then
EXISTS=$(az storage blob exists -c builds --account-key "$AZ_ACCOUNT_KEY" --account-name "$AZ_ACCOUNT_NAME" -n "$BLOB_PATH" --query "exists")
if [[ $EXISTS == "true" ]]; then
exit 0
else
exit 1
fi
fi
GENERATE_MD5_HASH=$(cat <<EOF
const crypto = require('crypto');
const fs = require('fs');
const buffer = fs.readFileSync(process.argv[1]);
console.log(crypto.createHash('md5').update(buffer).digest('base64'));
EOF
)
MD5_HASH=$(node -e "${GENERATE_MD5_HASH}" "${ZIP_PATH}")
echo "MD5 hash: ${MD5_HASH}"
if ! [[ -f $ZIP_PATH ]]; then
echo "ERROR: ${ZIP_PATH} does not exist"
exit 1
fi
if [[ "${ZIP_PATH}" != *.zip && "${ZIP_PATH}" != *.gz ]]; then
echo "ERROR: ${ZIP_PATH} is not an archive (must have a .zip or .gz extension)"
exit 1
fi
if [[ $(uname) == MINGW* ]]; then
# Convert POSIX path to MSYS
WIN_PATH=$({ cd $(dirname "$ZIP_PATH") && pwd -W; } | sed 's|/|\\|g')
WIN_PATH="${WIN_PATH}\\$(basename "$ZIP_PATH")"
az storage blob upload -c builds --account-key "$AZ_ACCOUNT_KEY" --account-name "$AZ_ACCOUNT_NAME" -f "$WIN_PATH" -n "$BLOB_PATH" --content-md5 "${MD5_HASH}"
else
az storage blob upload -c builds --account-key "$AZ_ACCOUNT_KEY" --account-name "$AZ_ACCOUNT_NAME" -f "$ZIP_PATH" -n "$BLOB_PATH" --content-md5 "${MD5_HASH}"
fi
echo "UPLOAD SUCCESSFUL!"
echo "-- SRC: $ZIP_PATH"
echo "-- SIZE: $(du -h "$ZIP_PATH" | awk '{print $1}')"
echo "-- DST: $BLOB_PATH"