OXYGENHUB
# db7727e5de19 oxygenhub-android / scripts / release.sh
2.5 KiB · Bourne Again Shell (bash) · executable · last changed Releases built by OxygenFlow: the version in gradle.properties, and a release job that signs the APK with the app's key from the repository's secrets, checks it and keeps it with SHA256SUMS; 0.1.0 (refs #7) 8 days ago source blame history raw
1
#!/usr/bin/env bash
2
# The app's release job (#7), in OxygenFlow's Android image with no network:
3
# a signed release APK of the version in gradle.properties, checked with
4
# apksigner, in dist/ beside its SHA256SUMS, for a release on oxygenhub.io.
5
#
6
# The key comes from the job's secrets, mounted as files and never in the
7
# environment: android-keystore (the PKCS12 keystore, base64) and
8
# android-keystore-password. Locally, give the same two files:
9
#   KEYSTORE_B64=path PASSWORD_FILE=path scripts/release.sh
10
set -euo pipefail
11
cd "$(dirname "$0")/.."
12
b64=${KEYSTORE_B64:-/run/secrets/android-keystore}
13
password=${PASSWORD_FILE:-/run/secrets/android-keystore-password}
14
for f in "$b64" "$password"; do
15
    [ -s "$f" ] || { echo "release: no $f: the job needs the android-keystore secrets" >&2; exit 1; }
16
done
17
version=$(sed -n 's/^oxygenhub\.version=//p' gradle.properties)
18
[ -n "$version" ] || { echo "release: no oxygenhub.version in gradle.properties" >&2; exit 1; }
19
20
# As ci.sh: the image's JDKs for Gradle's daemon, never a download.
21
jdks=$( (ls -d /opt/gradle-home/jdks/*/ 2>/dev/null || true) | sed 's:/$::' | paste -sd, -)
22
if [ -n "$jdks" ] && [ -n "${GRADLE_USER_HOME:-}" ]; then
23
    mkdir -p "$GRADLE_USER_HOME"
24
    {
25
        echo "org.gradle.java.installations.paths=$jdks"
26
        echo "org.gradle.java.installations.auto-download=false"
27
    } >> "$GRADLE_USER_HOME/gradle.properties"
28
fi
29
30
# The keystore, decoded where only this job can read it, and gone after.
31
keys=$(mktemp -d)
32
trap 'rm -rf "$keys"' EXIT
33
chmod 700 "$keys"
34
base64 -d "$b64" > "$keys/release.p12"
35
export OXYGENHUB_KEYSTORE="$keys/release.p12" OXYGENHUB_KEYSTORE_PASSWORD_FILE="$password"
36
gradle=$(command -v gradle || echo ./gradlew)
37
"$gradle" --offline --no-daemon :app:assembleRelease
38
39
apk=app/build/outputs/apk/release/app-release.apk
40
[ -f "$apk" ] || { echo "release: no $apk (was it signed? an unsigned build is app-release-unsigned.apk)" >&2; exit 1; }
41
sdk=${ANDROID_HOME:-${ANDROID_SDK_ROOT:-}}
42
apksigner=$(ls -d "$sdk"/build-tools/*/apksigner 2>/dev/null | sort -V | tail -1)
43
"$apksigner" verify --print-certs "$apk" | grep -E '^Signer #1 certificate (DN|SHA-256)'
44
45
# Kept as an artifact by a fixed name; SHA256SUMS gives the name it takes
46
# in a release, with the version (as OxygenHub's and OxygenFlow's dist do).
47
rm -rf dist
48
mkdir -p dist
49
cp "$apk" dist/oxygenhub-android-universal.apk
50
echo "$(sha256sum < dist/oxygenhub-android-universal.apk | cut -d' ' -f1)  oxygenhub-android-$version-universal.apk" > dist/SHA256SUMS
51
echo "release: oxygenhub-android-$version-universal.apk"