From d1336c711a4d475e34165656add4194ba5f68cef Mon Sep 17 00:00:00 2001 From: Koen J Date: Tue, 3 Mar 2026 10:37:25 +0100 Subject: [PATCH] Changed over deploy location to Cloudflare R2. --- deploy-stable.sh | 86 ++++++++++++++++++++++++++++------------------ deploy-unstable.sh | 77 ++++++++++++++++++++++++----------------- 2 files changed, 97 insertions(+), 66 deletions(-) diff --git a/deploy-stable.sh b/deploy-stable.sh index 126952ef..8a36ca0c 100644 --- a/deploy-stable.sh +++ b/deploy-stable.sh @@ -1,50 +1,68 @@ #!/bin/sh set -eu -DOCUMENT_ROOT=/var/www/html -MAINT_FILE="$DOCUMENT_ROOT/maintenance.file" +R2_ENDPOINT="https://$CF_R2_ACCOUNT_ID.r2.cloudflarestorage.com" -cleanup() { - rm -f "$MAINT_FILE" +r2_cp() { + src="$1" + key="$2" + cache_control="$3" + content_type="$4" + + AWS_ACCESS_KEY_ID="$CF_R2_ACCESS_KEY_ID" \ + AWS_SECRET_ACCESS_KEY="$CF_R2_SECRET_ACCESS_KEY" \ + AWS_DEFAULT_REGION=auto \ + aws s3 cp "$src" "s3://$CF_R2_BUCKET/$key" \ + --endpoint-url "$R2_ENDPOINT" \ + --only-show-errors \ + --cache-control "$cache_control" \ + --content-type "$content_type" +} + +upload_apk_latest_and_versioned() { + src="$1" + filename="$2" + + r2_cp "$src" "$VERSION/$filename" \ + "public, max-age=31536000, immutable" \ + "application/vnd.android.package-archive" + + r2_cp "$src" "$filename" \ + "no-store" \ + "application/vnd.android.package-archive" } -trap cleanup EXIT INT TERM -# Sign sources echo "Signing all sources..." /usr/bin/bash ./sign-all-sources.sh -# Build content echo "Building content..." ./gradlew --stacktrace assembleStableRelease -# Take site offline -echo "Taking site offline..." -touch "$MAINT_FILE" - -# Swap over the content -echo "Deploying content..." -cp ./app/build/outputs/apk/stable/release/app-stable-x86_64-release.apk "$DOCUMENT_ROOT/app-x86_64-release.apk" -cp ./app/build/outputs/apk/stable/release/app-stable-arm64-v8a-release.apk "$DOCUMENT_ROOT/app-arm64-v8a-release.apk" -cp ./app/build/outputs/apk/stable/release/app-stable-armeabi-v7a-release.apk "$DOCUMENT_ROOT/app-armeabi-v7a-release.apk" -cp ./app/build/outputs/apk/stable/release/app-stable-universal-release.apk "$DOCUMENT_ROOT/app-universal-release.apk" -cp ./app/build/outputs/apk/stable/release/app-stable-x86-release.apk "$DOCUMENT_ROOT/app-x86-release.apk" -cp ./app/build/outputs/apk/stable/release/app-stable-arm64-v8a-release.apk "$DOCUMENT_ROOT/app-release.apk" - VERSION="$(git describe --tags)" -echo "$VERSION" > "$DOCUMENT_ROOT/version.txt" -mkdir -p "$DOCUMENT_ROOT/changelogs" -git tag -l --format='%(contents)' "$VERSION" > "$DOCUMENT_ROOT/changelogs/$VERSION" -# Notify Cloudflare to wipe the CDN cache -echo "Purging Cloudflare cache for zone $CLOUDFLARE_ZONE_ID..." -curl -X POST "https://api.cloudflare.com/client/v4/zones/$CLOUDFLARE_ZONE_ID/purge_cache" \ - -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ - -H "Content-Type: application/json" \ - --data '{"files":["https://releases.grayjay.app/app-x86_64-release.apk", "https://releases.grayjay.app/app-arm64-v8a-release.apk", "https://releases.grayjay.app/app-armeabi-v7a-release.apk", "https://releases.grayjay.app/app-universal-release.apk", "https://releases.grayjay.app/app-x86-release.apk", "https://releases.grayjay.app/app-release.apk", "https://releases.grayjay.app/version.txt"]}' +echo "Deploying artifacts to Cloudflare R2..." +upload_apk_latest_and_versioned "./app/build/outputs/apk/stable/release/app-stable-x86_64-release.apk" "app-x86_64-release.apk" +upload_apk_latest_and_versioned "./app/build/outputs/apk/stable/release/app-stable-arm64-v8a-release.apk" "app-arm64-v8a-release.apk" +upload_apk_latest_and_versioned "./app/build/outputs/apk/stable/release/app-stable-armeabi-v7a-release.apk" "app-armeabi-v7a-release.apk" +upload_apk_latest_and_versioned "./app/build/outputs/apk/stable/release/app-stable-universal-release.apk" "app-universal-release.apk" +upload_apk_latest_and_versioned "./app/build/outputs/apk/stable/release/app-stable-x86-release.apk" "app-x86-release.apk" +upload_apk_latest_and_versioned "./app/build/outputs/apk/stable/release/app-stable-arm64-v8a-release.apk" "app-release.apk" -sleep 30 +tmp_version="$(mktemp)" +printf '%s\n' "$VERSION" > "$tmp_version" +r2_cp "$tmp_version" "$VERSION/version.txt" \ + "public, max-age=31536000, immutable" \ + "text/plain; charset=utf-8" +r2_cp "$tmp_version" "version.txt" \ + "no-store" \ + "text/plain; charset=utf-8" +rm -f "$tmp_version" -# Take site back online -echo "Bringing site back online..." -rm -f "$MAINT_FILE" -trap - EXIT INT TERM +tmp_changelog="$(mktemp)" +git tag -l --format='%(contents)' "$VERSION" > "$tmp_changelog" +r2_cp "$tmp_changelog" "changelogs/$VERSION" \ + "public, max-age=31536000, immutable" \ + "text/plain; charset=utf-8" +rm -f "$tmp_changelog" + +echo "Done." \ No newline at end of file diff --git a/deploy-unstable.sh b/deploy-unstable.sh index 6731fad4..9da44430 100644 --- a/deploy-unstable.sh +++ b/deploy-unstable.sh @@ -1,48 +1,61 @@ #!/bin/sh set -eu -DOCUMENT_ROOT=/var/www/html -MAINT_FILE="$DOCUMENT_ROOT/maintenance.file" +R2_ENDPOINT="https://$CF_R2_ACCOUNT_ID.r2.cloudflarestorage.com" -cleanup() { - rm -f "$MAINT_FILE" +r2_cp() { + src="$1" + key="$2" + cache_control="$3" + content_type="$4" + + AWS_ACCESS_KEY_ID="$CF_R2_ACCESS_KEY_ID" \ + AWS_SECRET_ACCESS_KEY="$CF_R2_SECRET_ACCESS_KEY" \ + AWS_DEFAULT_REGION=auto \ + aws s3 cp "$src" "s3://$CF_R2_BUCKET/$key" \ + --endpoint-url "$R2_ENDPOINT" \ + --only-show-errors \ + --cache-control "$cache_control" \ + --content-type "$content_type" +} + +upload_apk_latest_and_versioned() { + src="$1" + filename="$2" + + r2_cp "$src" "$VERSION/$filename" \ + "public, max-age=31536000, immutable" \ + "application/vnd.android.package-archive" + + r2_cp "$src" "$filename" \ + "no-store" \ + "application/vnd.android.package-archive" } -trap cleanup EXIT INT TERM -# Sign sources echo "Signing all sources..." /usr/bin/bash ./sign-all-sources.sh -# Build content echo "Building content..." ./gradlew --stacktrace assembleUnstableRelease -# Take site offline -echo "Taking site offline..." -touch "$MAINT_FILE" - -# Swap over the content -echo "Deploying content..." -cp ./app/build/outputs/apk/unstable/release/app-unstable-x86_64-release.apk "$DOCUMENT_ROOT/app-x86_64-release-unstable.apk" -cp ./app/build/outputs/apk/unstable/release/app-unstable-arm64-v8a-release.apk "$DOCUMENT_ROOT/app-arm64-v8a-release-unstable.apk" -cp ./app/build/outputs/apk/unstable/release/app-unstable-armeabi-v7a-release.apk "$DOCUMENT_ROOT/app-armeabi-v7a-release-unstable.apk" -cp ./app/build/outputs/apk/unstable/release/app-unstable-universal-release.apk "$DOCUMENT_ROOT/app-universal-release-unstable.apk" -cp ./app/build/outputs/apk/unstable/release/app-unstable-x86-release.apk "$DOCUMENT_ROOT/app-x86-release-unstable.apk" -cp ./app/build/outputs/apk/unstable/release/app-unstable-arm64-v8a-release.apk "$DOCUMENT_ROOT/app-release-unstable.apk" - VERSION="$(git describe --tags)" -echo "$VERSION" > "$DOCUMENT_ROOT/version-unstable.txt" -# Notify Cloudflare to wipe the CDN cache -echo "Purging Cloudflare cache for zone $CLOUDFLARE_ZONE_ID..." -curl -X POST "https://api.cloudflare.com/client/v4/zones/$CLOUDFLARE_ZONE_ID/purge_cache" \ - -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ - -H "Content-Type: application/json" \ - --data '{"files":["https://releases.grayjay.app/app-x86_64-release-unstable.apk", "https://releases.grayjay.app/app-arm64-v8a-release-unstable.apk", "https://releases.grayjay.app/app-armeabi-v7a-release-unstable.apk", "https://releases.grayjay.app/app-universal-release-unstable.apk", "https://releases.grayjay.app/app-x86-release-unstable.apk", "https://releases.grayjay.app/app-release-unstable.apk", "https://releases.grayjay.app/version-unstable.txt"]}' +echo "Deploying unstable artifacts to Cloudflare R2..." +upload_apk_latest_and_versioned "./app/build/outputs/apk/unstable/release/app-unstable-x86_64-release.apk" "app-x86_64-release-unstable.apk" +upload_apk_latest_and_versioned "./app/build/outputs/apk/unstable/release/app-unstable-arm64-v8a-release.apk" "app-arm64-v8a-release-unstable.apk" +upload_apk_latest_and_versioned "./app/build/outputs/apk/unstable/release/app-unstable-armeabi-v7a-release.apk" "app-armeabi-v7a-release-unstable.apk" +upload_apk_latest_and_versioned "./app/build/outputs/apk/unstable/release/app-unstable-universal-release.apk" "app-universal-release-unstable.apk" +upload_apk_latest_and_versioned "./app/build/outputs/apk/unstable/release/app-unstable-x86-release.apk" "app-x86-release-unstable.apk" +upload_apk_latest_and_versioned "./app/build/outputs/apk/unstable/release/app-unstable-arm64-v8a-release.apk" "app-release-unstable.apk" -sleep 30 +tmp_version="$(mktemp)" +printf '%s\n' "$VERSION" > "$tmp_version" +r2_cp "$tmp_version" "$VERSION/version-unstable.txt" \ + "public, max-age=31536000, immutable" \ + "text/plain; charset=utf-8" +r2_cp "$tmp_version" "version-unstable.txt" \ + "no-store" \ + "text/plain; charset=utf-8" +rm -f "$tmp_version" -# Take site back online -echo "Bringing site back online..." -rm -f "$MAINT_FILE" -trap - EXIT INT TERM +echo "Done." \ No newline at end of file