Files
dewemoji/scripts/apk/publish-r2.sh
2026-02-21 23:47:57 +07:00

128 lines
4.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<USAGE
Usage:
scripts/apk/publish-r2.sh \
--apk /path/to/dewemoji-v1.1.2-112.apk \
--version-name 1.1.2 \
--version-code 112 \
[--notes "Release notes"] \
[--min-supported-version-code 100] \
[--force false]
Required env:
R2_ACCOUNT_ID
R2_ACCESS_KEY_ID
R2_SECRET_ACCESS_KEY
R2_BUCKET
Optional env:
R2_PUBLIC_BASE_URL (example: https://downloads.dewemoji.com)
DEWEMOJI_APK_URL (default: https://dewemoji.com/downloads/dewemoji-latest.apk)
APK_VERSIONED_CACHE_CONTROL (default: public,max-age=31536000,immutable)
APK_LATEST_CACHE_CONTROL (default: no-store,max-age=0,must-revalidate)
APK_VERSION_JSON_CACHE_CONTROL (default: no-store,max-age=0,must-revalidate)
USAGE
}
for required in R2_ACCOUNT_ID R2_ACCESS_KEY_ID R2_SECRET_ACCESS_KEY R2_BUCKET; do
if [[ -z "${!required:-}" ]]; then
echo "error: missing env ${required}" >&2
exit 1
fi
done
if ! command -v aws >/dev/null 2>&1; then
echo "error: aws cli is required" >&2
exit 1
fi
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
MAKE_VERSION_SCRIPT="${ROOT_DIR}/scripts/apk/make-version-json.sh"
apk=""
version_name=""
version_code=""
notes=""
min_supported_version_code="100"
force="false"
while [[ $# -gt 0 ]]; do
case "$1" in
--apk) apk="$2"; shift 2 ;;
--version-name) version_name="$2"; shift 2 ;;
--version-code) version_code="$2"; shift 2 ;;
--notes) notes="$2"; shift 2 ;;
--min-supported-version-code) min_supported_version_code="$2"; shift 2 ;;
--force) force="$2"; shift 2 ;;
-h|--help) usage; exit 0 ;;
*) echo "error: unknown argument '$1'" >&2; usage; exit 1 ;;
esac
done
if [[ -z "${apk}" || -z "${version_name}" || -z "${version_code}" ]]; then
echo "error: --apk, --version-name, and --version-code are required" >&2
usage
exit 1
fi
if [[ ! -f "${apk}" ]]; then
echo "error: apk file not found: ${apk}" >&2
exit 1
fi
endpoint="https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com"
export AWS_ACCESS_KEY_ID="${R2_ACCESS_KEY_ID}"
export AWS_SECRET_ACCESS_KEY="${R2_SECRET_ACCESS_KEY}"
tmp_dir="$(mktemp -d)"
trap 'rm -rf "${tmp_dir}"' EXIT
sha256="$(shasum -a 256 "${apk}" | awk '{print $1}')"
versioned_key="apk/dewemoji-v${version_name}-${version_code}.apk"
latest_key="apk/dewemoji-latest.apk"
version_json_key="apk/version.json"
apk_url="${DEWEMOJI_APK_URL:-https://dewemoji.com/downloads/dewemoji-latest.apk}"
versioned_cache_control="${APK_VERSIONED_CACHE_CONTROL:-public,max-age=31536000,immutable}"
latest_cache_control="${APK_LATEST_CACHE_CONTROL:-no-store,max-age=0,must-revalidate}"
version_json_cache_control="${APK_VERSION_JSON_CACHE_CONTROL:-no-store,max-age=0,must-revalidate}"
version_json_path="${tmp_dir}/version.json"
"${MAKE_VERSION_SCRIPT}" \
--version-name "${version_name}" \
--version-code "${version_code}" \
--sha256 "${sha256}" \
--notes "${notes}" \
--apk-url "${apk_url}" \
--min-supported-version-code "${min_supported_version_code}" \
--force "${force}" \
--out "${version_json_path}"
echo "== Upload versioned APK =="
aws --endpoint-url "${endpoint}" s3 cp "${apk}" "s3://${R2_BUCKET}/${versioned_key}" \
--content-type application/vnd.android.package-archive \
--cache-control "${versioned_cache_control}"
echo "== Upload latest APK alias =="
aws --endpoint-url "${endpoint}" s3 cp "${apk}" "s3://${R2_BUCKET}/${latest_key}" \
--content-type application/vnd.android.package-archive \
--cache-control "${latest_cache_control}"
echo "== Upload version metadata =="
aws --endpoint-url "${endpoint}" s3 cp "${version_json_path}" "s3://${R2_BUCKET}/${version_json_key}" \
--content-type application/json \
--cache-control "${version_json_cache_control}"
echo "Published to R2 bucket: ${R2_BUCKET}"
echo "Versioned APK key: ${versioned_key}"
echo "Latest APK key: ${latest_key}"
echo "Version JSON key: ${version_json_key}"
if [[ -n "${R2_PUBLIC_BASE_URL:-}" ]]; then
base="${R2_PUBLIC_BASE_URL%/}"
echo "Public versioned APK URL: ${base}/${versioned_key}"
echo "Public latest APK URL: ${base}/${latest_key}"
echo "Public version JSON URL: ${base}/${version_json_key}"
fi