Merge pull request #586 from seedvault-app/feature/aosp-build

Build Seedvault with AOSP in CI
diff --git a/.cirrus.yml b/.cirrus.yml
new file mode 100644
index 0000000..8566502
--- /dev/null
+++ b/.cirrus.yml
@@ -0,0 +1,13 @@
+task:
+  name: Build with AOSP
+  only_if: $CIRRUS_PR_LABELS =~ ".*aosp-build.*"
+  timeout_in: 120m
+  container:
+    image: ubuntu:23.04
+    cpu: 8
+    memory: 32G
+  build_script:
+    - ./.github/scripts/build_aosp.sh aosp_arm64 userdebug android-14.0.0_r1
+  always:
+    seedvault_artifacts:
+      path: $CIRRUS_WORKING_DIR/Seedvault.apk
diff --git a/.github/scripts/build_aosp.sh b/.github/scripts/build_aosp.sh
new file mode 100755
index 0000000..1cd2e4c
--- /dev/null
+++ b/.github/scripts/build_aosp.sh
@@ -0,0 +1,91 @@
+#!/usr/bin/env bash
+
+export DEBIAN_FRONTEND=noninteractive
+
+apt-get update
+apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev  \
+    libc6-dev-i386 libncurses5 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev  \
+    libxml2-utils xsltproc unzip fontconfig python3 npm pip e2fsprogs python3-protobuf \
+    fonts-dejavu diffutils rsync ccache
+
+npm install --global yarn
+
+mkdir -p ~/bin
+curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
+chmod a+x ~/bin/repo
+ln -s /usr/bin/python3 /usr/bin/python
+export PATH=~/bin:$PATH
+
+set -e
+
+retry() {
+  set +e
+  local max_attempts=${ATTEMPTS-5}
+  local timeout=${TIMEOUT-1}
+  local attempt=0
+  local exitCode=0
+
+  while [[ $attempt < $max_attempts ]]
+  do
+    "$@"
+    exitCode=$?
+
+    if [[ $exitCode == 0 ]]
+    then
+      break
+    fi
+
+    echo "Failure! Retrying ($*) in $timeout.."
+    sleep "${timeout}"
+    attempt=$(( attempt + 1 ))
+    timeout=$(( timeout * 2 ))
+  done
+
+  if [[ $exitCode != 0 ]]
+  then
+    echo "Failed too many times! ($*)"
+  fi
+
+  set -e
+
+  return $exitCode
+}
+
+DEVICE=$1
+TARGET=$2
+BRANCH=$3
+
+git config --global user.email "seedvault@example.com"
+git config --global user.name "Seedvault CI"
+
+retry curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
+chmod a+x ~/bin/repo
+
+mkdir -p /aosp
+cd /aosp
+retry yes | repo init -u https://android.googlesource.com/platform/manifest -b "$BRANCH" --depth=1
+
+mkdir -p .repo/local_manifests
+cat << EOF > .repo/local_manifests/seedvault.xml
+<?xml version="1.0" encoding="UTF-8"?>
+<manifest>
+
+  <remote name="seedvault"
+          fetch="https://github.com/$CIRRUS_REPO_OWNER" />
+
+  <project name="seedvault" path="external/seedvault"
+          revision="$CIRRUS_CHANGE_IN_REPO" remote="$CIRRUS_REPO_NAME" />
+
+</manifest>
+EOF
+
+retry repo sync -c -j8 --fail-fast --force-sync
+
+# Cirrus CI seems to (possibly) reschedule tasks that aren't sending out logs for a while?
+while true; do echo "Still building..."; sleep 30; done &
+
+source build/envsetup.sh
+lunch $DEVICE-$TARGET
+m -j6 Seedvault
+
+mv /aosp/out/target/product/generic_arm64/system/system_ext/priv-app/Seedvault/Seedvault.apk "$CIRRUS_WORKING_DIR"