fdroid: add script that automates submissions

This script fetches a specified APK and analyzes it for values like
version code or commit and then based on that creates a branchy and a
commit in `fdroiddata` repository that can be used to create a release PR.

Signed-off-by: Jakub Sokołowski <jakub@status.im>
This commit is contained in:
Andrea Maria Piana 2021-04-29 19:01:41 +02:00 committed by Jakub Sokołowski
parent 389ce6695a
commit 5c52854d11
No known key found for this signature in database
GPG Key ID: 4EF064D0E6D63020
4 changed files with 156 additions and 0 deletions

View File

@ -171,6 +171,13 @@ fdroid-fix-tmp: ##@prepare Fix TMPDIR permissions so Vagrant user is the owner
fdroid-build-env: fdroid-max-watches fdroid-nix-dir fdroid-fix-tmp ##@prepare Setup build environment for F-Droud build
fdroid-pr: export TARGET := android
fdroid-pr: ##@prepare Create F-Droid release PR
ifndef APK
$(error APK env var not defined)
endif
scripts/fdroid-pr.sh "$(APK)"
xcode-clean: SHELL := /bin/sh
xcode-clean: XCODE_HOME := $(HOME)/Library/Developer/Xcode
xcode-clean: ##@prepare Clean XCode derived data and archives

View File

@ -14,6 +14,38 @@ First release of Status app was merged in [fdroid/fdroiddata#7179](https://gitla
# Adding New Versions
There are two ways - automated and manual - described below.
## Automated
The script will analyze a provided APK, update the metadata file based on that information, and commit the change to [`fdroiddata`](https://gitlab.com/fdroid/fdroiddata) repo. The creation of merge request is manual.
#### Requirements:
- GitLab account
- Forked copy of the [`fdroiddata`](https://gitlab.com/fdroid/fdroiddata) repo
- Link to the release published
#### Steps
1. Use the F-Droid PR update script via `make`:
```sh
make fdroid-pr APK=StatusIm-Mobile-v1.16.0-ef34af.apk
```
The script also accepts a URL.
2. Add a fork repo:
```sh
git remote add john https://gitlab.com/john/fdroiddata.git
```
3. Push:
```sh
git push john status-im/v1.16.0
```
4. [Create a PR via the GitLab interface.](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
## Manual
You can find our configuration file at [`metadata/im.status.ethereum.yml`](https://gitlab.com/fdroid/fdroiddata/-/blob/master/metadata/im.status.ethereum.yml)
The file defines all the necessary metadata like `SourceCode`, `Website`, or `License`, but the most important key is `Builds`, which looks like this:
@ -42,6 +74,7 @@ It contains a list of objects defining each release of the application. In order
The `versionCode` should be the same as the one in build that was uploaded to Play Store.
It can be found in the build logs or by using:
```
> make shell TARGET=android
> apkanalyzer manifest version-code StatusIm-Mobile-v1.12.0.apk
2021022512
```
@ -99,6 +132,8 @@ The original research was done in [#8512](https://github.com/status-im/status-re
Normally F-Droid server wants to run Gradle itself, but we do not specify the `gradle` key in order to run `make release-fdroid` ourselves in `build` step. We also add `android/build.gradle` to `scanignore` to avoid F-Droid trying to use Gradle directly.
The Android metadata like description or screenshots is [loaded from our repository](https://f-droid.org/en/docs/All_About_Descriptions_Graphics_and_Screenshots/#fastlane-structure) based on the Fastlane [`supply`](https://docs.fastlane.tools/actions/supply/) tool folder structure for updating Google Play store metadata.
Once the PR is merged it may take a few days for the F-Droid server farm to build and deploy the new version to their site and app. You can look up the current state of builds [here](https://f-droid.org/wiki/index.php?title=Special:RecentChanges&days=7&from=&hidebots=0&hideanons=1&hideliu=1&limit=500) and look for your App ID and a `deploy` change after it.
# F-Droid Build

View File

@ -4,6 +4,7 @@
export YLW='\033[1;33m'
export RED='\033[0;31m'
export GRN='\033[0;32m'
export BLU='\033[0;34m'
export BLD='\033[1m'
export RST='\033[0m'

113
scripts/fdroid-pr.sh Executable file
View File

@ -0,0 +1,113 @@
#!/usr/bin/env bash
set -euo pipefail
GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
FDROIDATA_REPO_URL="https://gitlab.com/fdroid/fdroiddata.git"
WORKING_DIR="${HOME}/fdroid-release"
source "${GIT_ROOT}/scripts/colors.sh"
function log_info() { echo -e " ${GRN}>>>${RST} $@"; }
function log_data() { echo -e " ${BLU}===${RST} $@"; }
function log_notice() { echo -e " ${YLW}<<<${RST} $@"; }
function log_warning() { echo -e " ${RED}!!!${RST} $@"; }
if [[ $# -ne 1 ]]; then
echo "No release URL provided!" >&2
echo "Usage: fdroid-pr.sh https://.../release.apk" >&2
exit 1
fi
# URL of APK to identify release version code
RELEASE_APK="${1}"
log_info "Creating working dir..."
mkdir -p "${WORKING_DIR}"
APK_FILE="${WORKING_DIR}/status.apk"
if [[ -f "${RELEASE_APK}" ]]; then
log_info "Using: ${RELEASE_APK}"
APK_FILE="${RELEASE_APK}"
else
log_info "Fetching release..."
curl -s "${RELEASE_APK}" -o "${APK_FILE}"
fi
log_info "Parsing APK..."
VERSION_CODE=$(apkanalyzer manifest version-code "${APK_FILE}")
if [[ -n "${VERSION_CODE}" ]]; then
log_data "Version Code: ${VERSION_CODE}"
else
log_warning "Failed to find version code." >&2; exit 1
fi
VERSION_NAME=$(apkanalyzer manifest print "${APK_FILE}" | awk -F'"' '/android:versionName/{print $2}')
if [[ -n "${VERSION_NAME}" ]]; then
log_data "Version Code: ${VERSION_NAME}"
else
log_warning "Failed to find version name." >&2; exit 1
fi
COMMIT_HASH=$(apkanalyzer manifest print "${APK_FILE}" | awk -F'"' '/commitHash/{getline; print $2}')
if [[ -n "${COMMIT_HASH}" ]]; then
log_data "Commit Hash: ${COMMIT_HASH}"
else
log_warning "Failed to find commit hash." >&2; exit 1
fi
CLONE_DIR="${WORKING_DIR}/fdroidata"
METADATA_FILE="${CLONE_DIR}/metadata/im.status.ethereum.yml"
PREVIOUS_BRANCH=""
if [[ -d "${CLONE_DIR}" ]]; then
log_info "Fetching: ${FDROIDATA_REPO_URL}"
cd "${CLONE_DIR}"
PREVIOUS_BRANCH=$(git rev-parse --abbrev-ref HEAD)
git checkout master
git pull --force
else
log_info "Cloning: ${FDROIDATA_REPO_URL}"
git clone -q --depth=1 "${FDROIDATA_REPO_URL}" "${CLONE_DIR}"
cd "${CLONE_DIR}"
fi
BRANCH_NAME="status-im/v${VERSION_NAME}"
log_info "Checkout out branch: ${BRANCH_NAME}"
if [[ "${PREVIOUS_BRANCH}" == "${BRANCH_NAME}" ]]; then
log_warning "Removing previous branch: ${PREVIOUS_BRANCH}"
git branch -D "${BRANCH_NAME}"
fi
git switch -C "${BRANCH_NAME}"
log_info "Updating metadata file..."
# find line number of last "versionName" line
START_LINE=$(awk '/ versionCode:/{n=NR} END{print n}' "${METADATA_FILE}")
# find line number of last "build" line
END_LINE=$(awk '/ build:/{n=NR} END{print n}' "${METADATA_FILE}")
# Get the latest entry, excluding version info
BUILD_PARAMS=$(awk "NR >= $((START_LINE+2)) && NR <= ${END_LINE}" "${METADATA_FILE}")
# Build new entry
NEW_ENTRY="
- versionName: ${VERSION_NAME}
versionCode: ${VERSION_CODE}
commit: ${COMMIT_HASH}
${BUILD_PARAMS}"
# Insert new release build entry
sed -i "$((END_LINE+1))i\\${NEW_ENTRY//$'\n'/\\n}" "${METADATA_FILE}"
# Update current version values
sed -i "s/CurrentVersion: .*/CurrentVersion: ${VERSION_NAME}/" "${METADATA_FILE}"
sed -i "s/CurrentVersionCode: .*/CurrentVersionCode: ${VERSION_CODE}/" "${METADATA_FILE}"
log_info "Committing changes..."
# Add, commit and push
COMMIT_MESSAGE="Update Status to ${VERSION_NAME} (${VERSION_CODE})"
git add ${METADATA_FILE}
git commit -m "${COMMIT_MESSAGE}"
log_info "SUCCESS"
log_notice "Now add your fork of fdroidata as a remote to the repository and push."
log_notice "Then create a Merge Request from the branch in your fork."
log_notice "Repo path: ${BLD}${CLONE_DIR}${RST}"