Add preview APK update channel
This commit is contained in:
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
CI_DIR="${ROOT_DIR}/.ci"
|
||||
GRADLE_VERSION="${GRADLE_VERSION:-8.10.2}"
|
||||
GRADLE_HOME="${CI_DIR}/gradle-${GRADLE_VERSION}"
|
||||
ANDROID_HOME="${ANDROID_HOME:-${CI_DIR}/android-sdk}"
|
||||
CMDLINE_TOOLS="${ANDROID_HOME}/cmdline-tools/latest"
|
||||
BUILD_NUMBER="${BUILD_NUMBER:-$(date -u +%m%d%H%M)}"
|
||||
VERSION_CODE="${VERSION_CODE:-$((900000000 + 10#${BUILD_NUMBER}))}"
|
||||
VERSION_NAME="${VERSION_NAME:-preview-${BUILD_NUMBER}}"
|
||||
|
||||
if [ ! -x "${GRADLE_HOME}/bin/gradle" ] || [ ! -x "${CMDLINE_TOOLS}/bin/sdkmanager" ]; then
|
||||
"${ROOT_DIR}/scripts/setup-android-local.sh"
|
||||
fi
|
||||
|
||||
export ANDROID_HOME
|
||||
export ANDROID_SDK_ROOT="${ANDROID_HOME}"
|
||||
export PATH="${GRADLE_HOME}/bin:${CMDLINE_TOOLS}/bin:${ANDROID_HOME}/platform-tools:${PATH}"
|
||||
|
||||
cd "${ROOT_DIR}"
|
||||
gradle :app:assembleDebug \
|
||||
-PversionCode="${VERSION_CODE}" \
|
||||
-PversionName="${VERSION_NAME}" \
|
||||
-PrepoSlug="neatstudio/tmux-browser-android"
|
||||
|
||||
OUT_DIR="${ROOT_DIR}/release/preview"
|
||||
mkdir -p "${OUT_DIR}"
|
||||
APK_PATH="$(find app/build/outputs/apk/debug -name '*.apk' | sort | tail -n 1)"
|
||||
cp "${APK_PATH}" "${OUT_DIR}/tmux-android-preview.apk"
|
||||
SHA256="$(sha256sum "${OUT_DIR}/tmux-android-preview.apk" | cut -d " " -f 1)"
|
||||
|
||||
cat > "${OUT_DIR}/latest.json" <<JSON
|
||||
{
|
||||
"versionCode": ${VERSION_CODE},
|
||||
"versionName": "${VERSION_NAME}",
|
||||
"apkUrl": "https://gitea.neatcn.com/tmux/tmux-browser-android/releases/download/preview/tmux-android-preview.apk",
|
||||
"sha256": "${SHA256}",
|
||||
"releasePageUrl": "https://gitea.neatcn.com/tmux/tmux-browser-android/releases/tag/preview",
|
||||
"minSdk": 26
|
||||
}
|
||||
JSON
|
||||
|
||||
ls -lh "${OUT_DIR}/tmux-android-preview.apk" "${OUT_DIR}/latest.json"
|
||||
sha256sum "${OUT_DIR}/tmux-android-preview.apk"
|
||||
Executable
+39
@@ -0,0 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
CI_DIR="${ROOT_DIR}/.ci"
|
||||
GRADLE_VERSION="${GRADLE_VERSION:-8.10.2}"
|
||||
ANDROID_TOOLS_ZIP="${ANDROID_TOOLS_ZIP:-commandlinetools-linux-11076708_latest.zip}"
|
||||
GRADLE_HOME="${CI_DIR}/gradle-${GRADLE_VERSION}"
|
||||
ANDROID_HOME="${ANDROID_HOME:-${CI_DIR}/android-sdk}"
|
||||
CMDLINE_TOOLS="${ANDROID_HOME}/cmdline-tools/latest"
|
||||
|
||||
mkdir -p "${CI_DIR}"
|
||||
|
||||
if [ ! -x "${GRADLE_HOME}/bin/gradle" ]; then
|
||||
curl -fSL --connect-timeout 20 --retry 3 --retry-delay 2 --max-time 600 \
|
||||
-o "${CI_DIR}/gradle.zip" \
|
||||
"https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip"
|
||||
unzip -q "${CI_DIR}/gradle.zip" -d "${CI_DIR}"
|
||||
fi
|
||||
|
||||
if [ ! -x "${CMDLINE_TOOLS}/bin/sdkmanager" ]; then
|
||||
mkdir -p "${ANDROID_HOME}/cmdline-tools"
|
||||
curl -fSL --connect-timeout 20 --retry 3 --retry-delay 2 --max-time 600 \
|
||||
-o "${CI_DIR}/android-tools.zip" \
|
||||
"https://dl.google.com/android/repository/${ANDROID_TOOLS_ZIP}"
|
||||
unzip -q "${CI_DIR}/android-tools.zip" -d "${ANDROID_HOME}/cmdline-tools"
|
||||
rm -rf "${CMDLINE_TOOLS}"
|
||||
mv "${ANDROID_HOME}/cmdline-tools/cmdline-tools" "${CMDLINE_TOOLS}"
|
||||
fi
|
||||
|
||||
export ANDROID_HOME
|
||||
export ANDROID_SDK_ROOT="${ANDROID_HOME}"
|
||||
export PATH="${GRADLE_HOME}/bin:${CMDLINE_TOOLS}/bin:${ANDROID_HOME}/platform-tools:${PATH}"
|
||||
|
||||
yes | sdkmanager --licenses >/dev/null || true
|
||||
sdkmanager "platforms;android-35" "build-tools;35.0.0" "platform-tools"
|
||||
|
||||
echo "ANDROID_HOME=${ANDROID_HOME}"
|
||||
echo "GRADLE_HOME=${GRADLE_HOME}"
|
||||
Executable
+93
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
APK_PATH="${1:-${ROOT_DIR}/release/preview/tmux-android-preview.apk}"
|
||||
LATEST_JSON="${2:-${ROOT_DIR}/release/preview/latest.json}"
|
||||
TAG="preview"
|
||||
API_ROOT="https://gitea.neatcn.com/api/v1/repos/tmux/tmux-browser-android"
|
||||
|
||||
if [ ! -f "${APK_PATH}" ]; then
|
||||
echo "APK not found: ${APK_PATH}" >&2
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -f "${LATEST_JSON}" ]; then
|
||||
echo "latest.json not found: ${LATEST_JSON}" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TOKEN="${TMUX_GITEA_TOKEN:-}"
|
||||
if [ -z "${TOKEN}" ]; then
|
||||
printf "Gitea token: " >&2
|
||||
IFS= read -rs TOKEN
|
||||
printf "\n" >&2
|
||||
fi
|
||||
if [ -z "${TOKEN}" ]; then
|
||||
echo "Missing Gitea token." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
WORK_DIR="$(mktemp -d)"
|
||||
trap 'rm -rf "${WORK_DIR}"' EXIT
|
||||
|
||||
RELEASE_JSON="${WORK_DIR}/release.json"
|
||||
BODY='{"tag_name":"preview","target_commitish":"main","name":"tmux Android Preview","body":"Mutable preview APK for fast UI testing. This is not a formal release.","draft":false,"prerelease":true}'
|
||||
|
||||
if ! curl -fsSL \
|
||||
-X POST \
|
||||
-H "Authorization: token ${TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "${BODY}" \
|
||||
"${API_ROOT}/releases" \
|
||||
-o "${RELEASE_JSON}"; then
|
||||
curl -fsSL \
|
||||
-H "Authorization: token ${TOKEN}" \
|
||||
"${API_ROOT}/releases/tags/${TAG}" \
|
||||
-o "${RELEASE_JSON}"
|
||||
fi
|
||||
|
||||
RELEASE_ID="$(sed -n 's/^{"id":\([0-9][0-9]*\),.*/\1/p' "${RELEASE_JSON}" | head -1)"
|
||||
if [ -z "${RELEASE_ID}" ]; then
|
||||
echo "Cannot resolve Gitea release id for preview." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
upload_asset() {
|
||||
local file="$1"
|
||||
local name="$2"
|
||||
local type="$3"
|
||||
local assets_json old_ids old_id
|
||||
assets_json="${WORK_DIR}/assets-${name}.json"
|
||||
curl -fsSL -H "Authorization: token ${TOKEN}" \
|
||||
"${API_ROOT}/releases/${RELEASE_ID}/assets" \
|
||||
-o "${assets_json}"
|
||||
old_ids="$(python3 - "${assets_json}" "${name}" <<'PY'
|
||||
import json
|
||||
import sys
|
||||
|
||||
with open(sys.argv[1], "r", encoding="utf-8") as handle:
|
||||
assets = json.load(handle)
|
||||
for asset in assets:
|
||||
if asset.get("name") == sys.argv[2]:
|
||||
print(asset.get("id"))
|
||||
PY
|
||||
)"
|
||||
for old_id in ${old_ids}; do
|
||||
curl -fsSL -X DELETE -H "Authorization: token ${TOKEN}" \
|
||||
"${API_ROOT}/releases/${RELEASE_ID}/assets/${old_id}" \
|
||||
-o /dev/null
|
||||
done
|
||||
curl -fsSL \
|
||||
-X POST \
|
||||
-H "Authorization: token ${TOKEN}" \
|
||||
-F "attachment=@${file};type=${type}" \
|
||||
"${API_ROOT}/releases/${RELEASE_ID}/assets?name=${name}" \
|
||||
-o "${WORK_DIR}/${name}.asset.json"
|
||||
}
|
||||
|
||||
upload_asset "${APK_PATH}" "tmux-android-preview.apk" "application/vnd.android.package-archive"
|
||||
upload_asset "${LATEST_JSON}" "latest.json" "application/json"
|
||||
|
||||
echo "Uploaded preview release ${RELEASE_ID}"
|
||||
echo "Manifest: https://gitea.neatcn.com/tmux/tmux-browser-android/releases/download/preview/latest.json"
|
||||
echo "APK: https://gitea.neatcn.com/tmux/tmux-browser-android/releases/download/preview/tmux-android-preview.apk"
|
||||
Reference in New Issue
Block a user