From 9d998a915009b781504435ac348a1bc1083cf7e3 Mon Sep 17 00:00:00 2001 From: Peter Surda Date: Sun, 26 Apr 2026 21:03:55 +0800 Subject: [PATCH] Migrate android build to gitea actions --- .buildbot/android/build.sh | 1 + .buildbot/android/test.sh | 1 + .gitea/workflows/android.yml | 90 +++++++++++++++++++++++++++++++++ .gitea/workflows/tox-lint.yml | 76 ++++++++++++++++++++++++++++ packages/android/buildozer.spec | 8 +-- 5 files changed, 172 insertions(+), 4 deletions(-) create mode 100644 .gitea/workflows/android.yml create mode 100644 .gitea/workflows/tox-lint.yml diff --git a/.buildbot/android/build.sh b/.buildbot/android/build.sh index f2c08ac5f1..9b47c30bed 100755 --- a/.buildbot/android/build.sh +++ b/.buildbot/android/build.sh @@ -1,4 +1,5 @@ #!/bin/bash +exit 0 # migrated to .gitea/workflows/android.yml export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 diff --git a/.buildbot/android/test.sh b/.buildbot/android/test.sh index 65a0fe7dfa..a00ad87838 100755 --- a/.buildbot/android/test.sh +++ b/.buildbot/android/test.sh @@ -1,4 +1,5 @@ #!/bin/bash +exit 0 # migrated to .gitea/workflows/android.yml RELEASE_ARTIFACT=$(grep release_artifact packages/android/buildozer.spec |cut -d= -f2|tr -Cd 'a-z') diff --git a/.gitea/workflows/android.yml b/.gitea/workflows/android.yml new file mode 100644 index 0000000000..1186a137ee --- /dev/null +++ b/.gitea/workflows/android.yml @@ -0,0 +1,90 @@ +name: Android Build + +on: + push: + branches: [master, main, v0.6] + pull_request: + branches: [master, main, v0.6] + +jobs: + build: + name: buildozer android debug + runs-on: ubuntu-latest + container: ubuntu:focal + + steps: + - name: Install system dependencies + env: + DEBIAN_FRONTEND: noninteractive + run: | + apt-get update -qq + apt-get -y install -qq --no-install-recommends \ + locales git curl autoconf automake build-essential cmake \ + libtool libltdl-dev libffi-dev libssl-dev \ + patch pkg-config python-is-python3 python3-dev python3-pip \ + unzip zip openjdk-17-jdk libzbar0 gettext + locale-gen en_US.UTF-8 + + - name: Checkout repository + env: + TOKEN: ${{ github.token }} + run: | + git config --global --add safe.directory "$PWD" + git init + SERVER="${GITHUB_SERVER_URL#https://}" + git remote add origin "https://x-access-token:${TOKEN}@${SERVER}/${GITHUB_REPOSITORY}.git" + git fetch --depth 1 origin "${GITHUB_SHA}" + git checkout FETCH_HEAD + + - name: Install buildozer and cython + run: pip install buildozer cython==3.0.10 virtualenv + + - name: Create build user + run: | + useradd -m builder + chown -R builder:builder . + chown -R builder:builder "${RUNNER_TOOL_CACHE}" + + - name: Prepare source tree + run: | + # buildozer symlink workaround (from build.sh) + rm -rf src/pybitmessage + mkdir -p src/pybitmessage + cp src/*.py src/pybitmessage + cp -r src/bitmessagekivy src/backend src/mockbm src/images src/pybitmessage + + # Symlink both buildozer directories to persistent tool cache: + # ~/.buildozer holds SDK/NDK downloads + # packages/android/.buildozer holds p4a toolchain and build artifacts + mkdir -p "${RUNNER_TOOL_CACHE}/buildozer-home" "${RUNNER_TOOL_CACHE}/buildozer-builddir" + ln -sfn "${RUNNER_TOOL_CACHE}/buildozer-home" /home/builder/.buildozer + ln -sfn "${RUNNER_TOOL_CACHE}/buildozer-builddir" packages/android/.buildozer + chown -R builder:builder "${RUNNER_TOOL_CACHE}/buildozer-home" "${RUNNER_TOOL_CACHE}/buildozer-builddir" + + - name: Build APK + env: + LC_ALL: en_US.UTF-8 + LANG: en_US.UTF-8 + run: | + runuser -u builder -- bash -c ' + # gradle OOM workaround + mkdir -p ~/.gradle + echo "org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8" \ + > ~/.gradle/gradle.properties + cd packages/android + buildozer android debug + ' + + - name: Verify APK contents + run: | + RELEASE_ARTIFACT=$(grep release_artifact packages/android/buildozer.spec | cut -d= -f2 | tr -Cd 'a-z') + if [ "$RELEASE_ARTIFACT" = "aab" ]; then + echo "Release artifact is AAB, skipping APK verification" + exit 0 + fi + unzip -p packages/android/bin/*.apk assets/private.tar \ + | tar --list -z > package.list + cat package.list + grep '\.sql$' package.list || exit 1 + + diff --git a/.gitea/workflows/tox-lint.yml b/.gitea/workflows/tox-lint.yml new file mode 100644 index 0000000000..144f4c871d --- /dev/null +++ b/.gitea/workflows/tox-lint.yml @@ -0,0 +1,76 @@ +name: Tox Linter Tests + +on: + push: + branches: [master, main, v0.6] + pull_request: + branches: [master, main, v0.6] + +jobs: + lint: + name: "${{ matrix.tox-env }} / python ${{ matrix.python-version }}" + runs-on: ubuntu-latest + container: ${{ matrix.container }} + strategy: + fail-fast: false + matrix: + tox-env: [bandit, flake8, pycodestyle, pylint] + python-version: ["2.7", "3.10"] + include: + - python-version: "2.7" + container: "python:2.7-buster" + tox-suffix: "-py27" + - python-version: "3.10" + tox-suffix: "" + + steps: + # ── System packages ──────────────────────────────────────── + # Container (Python 2): runs as root, needs git for checkout + - name: Install system dependencies (container) + if: matrix.python-version == '2.7' + run: | + sed -i 's|deb.debian.org|archive.debian.org|g' /etc/apt/sources.list + sed -i 's|security.debian.org|archive.debian.org|g' /etc/apt/sources.list + sed -i '/buster-updates/d' /etc/apt/sources.list + apt-get update -q + apt-get install -qy git libcap-dev + + # Host VM (Python 3): git is pre-installed, just need libcap-dev + - name: Install system dependencies + if: matrix.python-version != '2.7' + run: | + sudo apt-get update -q + sudo apt-get install -qy libcap-dev + + # GitHub mounts Node into containers, so actions/checkout works everywhere. + # Gitea runners don't, so the buster container needs a manual git clone. + - name: Checkout repository + if: "!(matrix.python-version == '2.7' && env.GITEA_ACTIONS == 'true')" + uses: actions/checkout@v4 + + - name: Checkout repository (Gitea container) + if: matrix.python-version == '2.7' && env.GITEA_ACTIONS == 'true' + env: + TOKEN: ${{ github.token }} + run: | + git config --global --add safe.directory "$PWD" + git init + SERVER="${GITHUB_SERVER_URL#https://}" + git remote add origin "https://x-access-token:${TOKEN}@${SERVER}/${GITHUB_REPOSITORY}.git" + git fetch --depth 1 origin "${GITHUB_SHA}" + git checkout FETCH_HEAD + + # ── Python 3 ─────────────────────────────────────────────── + - name: Set up Python ${{ matrix.python-version }} + if: matrix.python-version != '2.7' + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + # ── Common ───────────────────────────────────────────────── + - name: Install tox + run: | + pip install "tox<4" "virtualenv<20.22.0" + + - name: Run tox -e ${{ matrix.tox-env }}${{ matrix.tox-suffix }} + run: tox -e ${{ matrix.tox-env }}${{ matrix.tox-suffix }} diff --git a/packages/android/buildozer.spec b/packages/android/buildozer.spec index edad9241e7..9649459f3d 100644 --- a/packages/android/buildozer.spec +++ b/packages/android/buildozer.spec @@ -107,13 +107,13 @@ android.ndk_api = 21 android.private_storage = True # (str) Android NDK directory (if empty, it will be automatically downloaded.) -android.ndk_path = /opt/android/android-ndk +#android.ndk_path = # (str) Android SDK directory (if empty, it will be automatically downloaded.) -android.sdk_path = /opt/android/android-sdk +#android.sdk_path = # (str) ANT directory (if empty, it will be automatically downloaded.) -android.ant_path = /opt/android/apache-ant +#android.ant_path = # (bool) If True, then skip trying to update the Android sdk # This can be useful to avoid excess Internet downloads or save time @@ -124,7 +124,7 @@ android.ant_path = /opt/android/apache-ant # agreements. This is intended for automation only. If set to False, # the default, you will be shown the license when first running # buildozer. -# android.accept_sdk_license = False +android.accept_sdk_license = True # (str) Android entry point, default is ok for Kivy-based app #android.entrypoint = org.renpy.android.PythonActivity