diff --git a/.github/workflows/package_avd.yml b/.github/workflows/package_waydroid.yml similarity index 71% rename from .github/workflows/package_avd.yml rename to .github/workflows/package_waydroid.yml index 49d938ebcb..6d0aa97b39 100644 --- a/.github/workflows/package_avd.yml +++ b/.github/workflows/package_waydroid.yml @@ -15,17 +15,17 @@ ## limitations under the License. ## -name: Packages-TUR-AVD +name: Packages-TUR-Waydroid on: push: branches: - tur-avd paths: - - 'tur-avd/**' + - 'tur-waydroid/**' pull_request: paths: - - 'tur-avd/**' + - 'tur-waydroid/**' workflow_dispatch: inputs: packages: @@ -34,26 +34,57 @@ on: jobs: build: - runs-on: macos-latest + runs-on: ubuntu-22.04 + env: + ANDROID_HOME: "/opt/termux/android-sdk" + NDK: "/opt/termux/android-ndk" + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} strategy: matrix: - target_arch: - # Disabled for aarch64 due to arm64-v8a emulator cannot start. - # - {"TERMUX_ARCH": "aarch64", "EMU_ARCH": "arm64-v8a"} - - {"TERMUX_ARCH": "arm", "EMU_ARCH": "armeabi-v7a"} - - {"TERMUX_ARCH": "i686", "EMU_ARCH": "x86"} - - {"TERMUX_ARCH": "x86_64", "EMU_ARCH": "x86_64"} + target_arch: [i686, x86_64] + # target_arch: [aarch64, arm, i686, x86_64] fail-fast: false steps: + - name: Install DKMS and missing modules + run: | + sudo apt update + sudo apt install dkms -y + git clone https://github.com/licy183/anbox-modules + cd anbox-modules && ./INSTALL.sh + - name: Install wayland + run: | + sudo apt update + sudo apt install xwayland mutter -y + mutter --wayland --headless & + - name: Install waydroid + run: | + sudo apt update + sudo apt install curl ca-certificates -y + curl https://repo.waydro.id | sudo bash + sudo apt update + sudo apt install waydroid -y + sudo waydroid init + - name: Solve network issues for waydroid + run: | + # https://unix.stackexchange.com/a/743946 + sudo sed -i~ -E 's/=.\$\(command -v (nft|ip6?tables-legacy).*/=/g' \ + /usr/lib/waydroid/data/scripts/waydroid-net.sh + - name: Start waydroid + run: | + waydroid session start & + waydroid show-full-ui + sleep 30s + sudo waydroid shell -- curl -v https://www.google.com + - name: Clone repository uses: actions/checkout@v3 with: fetch-depth: 1000 - path: ${{ github.workspace }} - - name: Install basic tools - run: brew install coreutils + submodules: true + - name: Merge repos run: ./setup-environment.sh + - name: Gather build summary run: | if [ "${{ github.event_name }}" != "workflow_dispatch" ]; then @@ -79,16 +110,29 @@ jobs: fi mkdir -p ./artifacts ./debs touch ./debs/.placeholder - echo "File changed: ${CHANGED_FILES}" if [ "${{ github.event_name }}" != "workflow_dispatch" ]; then + # Process tag '%ci:no-build' that may be added as line to commit message. + # Forces CI to cancel current build with status 'passed' + if grep -qiP '^\s*%ci:no-build\s*$' <(git log --format="%B" -n 1 "HEAD"); then + tar cf artifacts/debs-${{ matrix.target_arch }}.tar debs + echo "[!] Force exiting as tag '%ci:no-build' was applied to HEAD commit message." + exit 0 + fi + # XXX: TUR uses the termux-builder directly and may add custom builder image later. + # Build local Docker image if setup scripts were changed. + # Useful for pull requests submitting changes for both build environment and packages. + # if grep -qP '^scripts/(Dockerfile|setup-android-sdk\.sh|setup-ubuntu\.sh)$' <<< "$CHANGED_FILES"; then + # echo "Detected changes for environment setup scripts. Building custom Docker image now." + # cd ./scripts + # docker build -t termux/package-builder:latest . + # cd .. + # fi for repo_path in $(jq --raw-output 'keys | .[]' repo.json); do repo=$(jq --raw-output '.["'${repo_path}'"].name' repo.json) - echo "Processing on repo: ${repo}" # Parse changed files and identify new packages and deleted packages. # Create lists of those packages that will be passed to upload job for # further processing. - for file in $(echo "${CHANGED_FILES}"); do - echo "File path: ${file}" + while read -r file; do if ! [[ $file == ${repo_path}/* ]]; then # This file does not belong to a package, so ignore it continue @@ -114,7 +158,7 @@ jobs: echo "$pkg" >> ./deleted_${repo}_packages fi fi - done + done<<<${CHANGED_FILES} done else for pkg in ${{ github.event.inputs.packages }}; do @@ -141,20 +185,24 @@ jobs: if [ -f ./built_${repo}_packages.txt ]; then uniq ./built_${repo}_packages.txt > ./built_${repo}_packages.txt.tmp mv ./built_${repo}_packages.txt.tmp ./built_${repo}_packages.txt - echo "./built_${repo}_packages.txt: " - cat ./built_${repo}_packages.txt fi if [ -f ./built_${repo}_subpackages.txt ]; then uniq ./built_${repo}_subpackages.txt > ./built_${repo}_subpackages.txt.tmp mv ./built_${repo}_subpackages.txt.tmp ./built_${repo}_subpackages.txt - echo "./built_${repo}_subpackages.txt: " - cat ./built_${repo}_subpackages.txt fi if [ -f ./deleted_${repo}_packages.txt ]; then uniq ./deleted_${repo}_packages.txt > ./deleted_${repo}_packages.txt.tmp mv ./deleted_${repo}_packages.txt.tmp ./deleted_${repo}_packages.txt fi done + - name: Free additional disk space (if necessary) + run: | + if grep -q '^code-server$\|^demo-package2$\$' ./built_tur_packages.txt; then + sudo apt purge -yq $(dpkg -l | grep '^ii' | awk '{ print $2 }' | grep -P '(cabal-|dotnet-|ghc-|libmono|php|aspnetcore)') \ + mono-runtime-common monodoc-manual ruby + sudo apt autoremove -yq + sudo rm -rf /opt/hostedtoolcache /usr/local /usr/share/dotnet /usr/share/swift + fi - name: Lint packages run: | declare -a package_recipes @@ -167,39 +215,22 @@ jobs: if [ ! -z "$package_recipes" ]; then ./scripts/lint-packages.sh $package_recipes fi - - # TODO: Generate AVD Snapshot for caching - # - name: Check AVD Cache - # uses: actions/cache@v3 - # id: avd-cache - # with: - # path: | - # ~/.android/avd/* - # ~/.android/adb* - # key: avd-24-${{ matrix.build_env.MAJOR_VERSION }} - - # - name: Create AVD and Generate Snapshot for Caching - # if: steps.avd-cache.outputs.cache-hit != 'true' - # uses: reactivecircus/android-emulator-runner@v2 - # with: - # api-level: 24 - # force-avd-creation: false - # emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - # disable-animations: false - # script: echo "Generated AVD snapshot for caching." - - name: Build packages - uses: licy183/android-emulator-runner@v2.27.0.1 - with: - arch: ${{ matrix.target_arch.EMU_ARCH }} - api-level: 24 - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: true - script: env TERMUX_ARCH=${{ matrix.target_arch.TERMUX_ARCH }} ./common-files/action-avd-step-build-packages.sh + run: | + declare -a packages + for repo_path in $(jq --raw-output 'keys | .[]' repo.json); do + repo=$(jq --raw-output '.["'${repo_path}'"].name' repo.json) + if [ -f ./built_${repo}_packages.txt ]; then + packages="$packages $(cat ./built_${repo}_packages.txt)" + fi + done + if [ ! -z "$packages" ]; then + PACKAGE_TO_BUILD="$packages" bash -x ./waydroid-build-wrapper.sh + fi - name: Generate build artifacts if: always() run: | + test -d tur/output && mv tur/output/* ./output/ for repo in $(jq --raw-output '.[].name' repo.json); do # Put package lists into directory with *.deb files so they will be transferred to # upload job. @@ -216,8 +247,7 @@ jobs: done # Files containing certain symbols (e.g. ":") will cause failure in actions/upload-artifact. # Archiving *.deb files in a tarball to avoid issues with uploading. - tar cf artifacts/debs-${{ matrix.target_arch.TERMUX_ARCH }}-${{ github.sha }}.tar debs - rm -rf output + tar cf artifacts/debs-${{ matrix.target_arch }}-${{ github.sha }}.tar debs - name: Checksums for built *.deb files if: always() run: | @@ -226,7 +256,7 @@ jobs: if: always() uses: actions/upload-artifact@v3 with: - name: debs-${{ matrix.target_arch.TERMUX_ARCH }}-${{ github.sha }} + name: debs-${{ matrix.target_arch }}-${{ github.sha }} path: ./artifacts upload: diff --git a/adb-build-wrapper.sh b/adb-build-wrapper.sh deleted file mode 100755 index 278a27373b..0000000000 --- a/adb-build-wrapper.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env bash -set -e -u -o pipefail - -REPO_DIR=$(cd "$(realpath "$(dirname "$0")")"; pwd) -TERMUX_BASE_DIR="/data/data/com.termux/files" -TERMUX_HOME="$TERMUX_BASE_DIR/home" -TERMUX_PREFIX="$TERMUX_BASE_DIR/usr" - -: ${TERMUX_ARCH:=x86_64} - -# Test if PACKAGE_TO_BUILD is set or not -echo "Package(s) to build: $PACKAGE_TO_BUILD" - -ABI= -case $TERMUX_ARCH in - aarch64) - ABI="arm64-v8a" - ;; - arm) - ABI="armeabi-v7a" - ;; - i686) - ABI="x86" - ;; - x86_64) - ABI="x86_64" - ;; - *) - echo "Invalid arch." - exit 1 - ;; -esac - -# Get and install Termux APK -URL=https://github.com/termux/termux-app/releases/download/v0.118.0/termux-app_v0.118.0+github-debug_$ABI.apk -wget $URL -adb install -r -t -g $REPO_DIR/$(basename $URL) -rm -f $REPO_DIR/$(basename $URL) - -# Start Termux -adb shell am start -n com.termux/com.termux.app.TermuxActivity - -# Sleep 10s to ensure that Termux has been successfully started. -sleep 10 - -# Switch to root mode -adb root -sleep 10 - -# Use custom shell script to build packages -adb push ./common-files/run-as-termux.sh /data/local/tmp/run-as-termux.sh -adb shell chmod +x /data/local/tmp/run-as-termux.sh - -# Push local git repository to AVD -TERMUX_APP_ID=$(adb shell /data/local/tmp/run-as-termux.sh id -u) -adb push $REPO_DIR $TERMUX_HOME/repo - -# Build packages -adb shell /data/local/tmp/run-as-termux.sh login -c "cd $TERMUX_HOME/repo && ./build-package.sh -I $PACKAGE_TO_BUILD" - -# Pull result -rm -rf ./output -adb pull $TERMUX_HOME/repo/output ./ diff --git a/common-files/action-avd-step-build-packages.sh b/common-files/action-avd-step-build-packages.sh deleted file mode 100755 index 6a1897d312..0000000000 --- a/common-files/action-avd-step-build-packages.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -packages="" -for repo_path in $(jq --raw-output 'keys | .[]' repo.json); do - repo=$(jq --raw-output '.["'${repo_path}'"].name' repo.json) - if [ -f ./built_${repo}_packages.txt ]; then - echo "./built_${repo}_packages.txt: $(cat ./built_${repo}_packages.txt)" - packages="$packages $(cat ./built_${repo}_packages.txt)" - fi -done -if [ ! -z "$packages" ]; then - env TERMUX_ARCH=$TERMUX_ARCH PACKAGE_TO_BUILD="$packages" ./adb-build-wrapper.sh -fi diff --git a/repo.json b/repo.json index 9422a4a292..d1b1ce6923 100644 --- a/repo.json +++ b/repo.json @@ -17,10 +17,10 @@ "component": "tur-on-device", "url": "https://tur.kcubeterm.com" }, - "tur-avd": { - "name": "tur-avd", + "tur-waydroid": { + "name": "tur-waydroid", "distribution": "tur-packages", - "component": "tur-avd", + "component": "tur-waydroid", "url": "https://tur.kcubeterm.com" }, "tur-hacking": { diff --git a/tur-avd/hello-tur-avd/build.sh b/tur-waydroid/hello-tur-waydroid/build.sh similarity index 71% rename from tur-avd/hello-tur-avd/build.sh rename to tur-waydroid/hello-tur-waydroid/build.sh index 935ce40cfd..f54e0fe694 100644 --- a/tur-avd/hello-tur-avd/build.sh +++ b/tur-waydroid/hello-tur-waydroid/build.sh @@ -1,5 +1,5 @@ TERMUX_PKG_HOMEPAGE=https://github.com/termux-user-repository/tur -TERMUX_PKG_DESCRIPTION="Dummy test for TUR AVD" +TERMUX_PKG_DESCRIPTION="Dummy test for TUR Waydroid" TERMUX_PKG_LICENSE="GPL-2.0" TERMUX_PKG_MAINTAINER="@termux-user-repository" TERMUX_PKG_VERSION=0.1 @@ -7,9 +7,9 @@ TERMUX_PKG_SKIP_SRC_EXTRACT=true TERMUX_PKG_BUILD_IN_SRC=true termux_step_make() { - $CC $CFLAGS $CPPFLAGS $TERMUX_PKG_BUILDER_DIR/main.c -o hello-tur-avd + $CC $CFLAGS $CPPFLAGS $TERMUX_PKG_BUILDER_DIR/main.c -o hello-tur-waydroid } termux_step_make_install() { - install -Dm700 hello-tur-avd $TERMUX_PREFIX/bin/hello-tur-avd + install -Dm700 hello-tur-waydroid $TERMUX_PREFIX/bin/hello-tur-waydroid } diff --git a/tur-avd/hello-tur-avd/main.c b/tur-waydroid/hello-tur-waydroid/main.c similarity index 50% rename from tur-avd/hello-tur-avd/main.c rename to tur-waydroid/hello-tur-waydroid/main.c index 5a57b298b7..c4762db6fa 100644 --- a/tur-avd/hello-tur-avd/main.c +++ b/tur-waydroid/hello-tur-waydroid/main.c @@ -1,4 +1,4 @@ #include int main() { - puts("Hello TUR AVD."); + puts("Hello TUR Waydroid."); } diff --git a/waydroid-build-wrapper.sh b/waydroid-build-wrapper.sh new file mode 100755 index 0000000000..9be87b2601 --- /dev/null +++ b/waydroid-build-wrapper.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash +set -e -u -o pipefail + +REPO_DIR=$(cd "$(realpath "$(dirname "$0")")"; pwd) +TERMUX_BASE_DIR="/data/data/com.termux/files" +TERMUX_HOME="$TERMUX_BASE_DIR/home" +TERMUX_PREFIX="$TERMUX_BASE_DIR/usr" + +: ${TERMUX_ARCH:=x86_64} + +# Test if PACKAGE_TO_BUILD is set or not +echo "Package(s) to build: $PACKAGE_TO_BUILD" + +ABI= +case $TERMUX_ARCH in + aarch64) + ABI="arm64-v8a" + ;; + arm) + ABI="armeabi-v7a" + ;; + i686) + ABI="x86" + ;; + x86_64) + ABI="x86_64" + ;; + *) + echo "Invalid arch." + exit 1 + ;; +esac + +# Work around possible frozen +waydroid prop set persist.waydroid.suspend false +waydroid session stop +waydroid session start & +waydroid show-full-ui +waydroid prop set persist.waydroid.suspend false + +# Get IP address of Waydroid container +waydroid_ip="$(waydroid status | grep -oP 'IP address:\s+\K[\d.]+')" + +# Get and install Termux APK +URL=https://github.com/termux/termux-app/releases/download/v0.118.0/termux-app_v0.118.0+github-debug_$ABI.apk +wget $URL +waydroid app install $REPO_DIR/$(basename $URL) +rm -f $REPO_DIR/$(basename $URL) + +# Start Termux +sudo waydroid shell -- am start -n com.termux/com.termux.app.TermuxActivity + +# Sleep 10s to ensure that Termux has been successfully started +sleep 10 + +# OK. Now we have Termux bootstrap installed. Kill Termux now +sudo waydroid shell -- am force-stop com.termux + +# Install openssh in Termux +sudo waydroid shell -- run-as com.termux sh -c "echo 'apt update && touch 1 && apt dist-upgrade -o Dpkg::Options::=--force-confnew -y && touch 2 && apt update && touch 3 && apt install openssh -yqq && touch 4' > /data/data/com.termux/files/home/.bashrc" +sudo waydroid shell -- am start -n com.termux/com.termux.app.TermuxActivity +sleep 60 +sudo waydroid shell -- am force-stop com.termux + +# Generate ssh-key for Termux +ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa +public_key="$(cat ~/.ssh/id_rsa.pub)" + +# Add ssh-key to Termux's authorized_keys +sudo waydroid shell -- run-as com.termux sh -c "echo '$public_key' >> /data/data/com.termux/files/home/.ssh/authorized_keys" + +# Start sshd in Termux +sudo waydroid shell -- run-as com.termux sh -c "echo 'sshd' > /data/data/com.termux/files/home/.bashrc" +sudo waydroid shell -- am start -n com.termux/com.termux.app.TermuxActivity +sleep 10 + +# Execute `ls -al` with ssh for testing +ssh -o StrictHostKeyChecking=no "$waydroid_ip" -p 8022 -- ls -al + +# Connect to Waydroid connect with adb +scp -r -o StrictHostKeyChecking=no $REPO_DIR/ "$waydroid_ip":$TERMUX_HOME/repo -p 8022 + +# Build packages +ssh -o StrictHostKeyChecking=no "$waydroid_ip" -p 8022 -- "cd $TERMUX_HOME/repo && ./scripts/setup-termux.sh" +ssh -o StrictHostKeyChecking=no "$waydroid_ip" -p 8022 -- "cd $TERMUX_HOME/repo && ./build-package.sh -I $PACKAGE_TO_BUILD" + +# Pull result +rm -rf ./output +scp -r -o StrictHostKeyChecking=no $TERMUX_HOME/repo/output "$waydroid_ip":./ -p 8022