diff --git a/.github/cuttlefish.sh b/.github/cuttlefish.sh new file mode 100755 index 0000000..5565fef --- /dev/null +++ b/.github/cuttlefish.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash + +set -xe +export PATH="$PATH:$ANDROID_HOME/platform-tools" +sdk="$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" +cvd_args="-daemon -enable_sandbox=false -memory_mb=8192 -report_anonymous_usage_stats=n" + +print_title() { + echo -e "\n\033[44;39m${1}\033[0m\n" +} + +print_error() { + echo -e "\n\033[41;39m${1}\033[0m\n" +} + +cleanup() { + print_error "! An error occurred" + run_cvd_bin stop_cvd || true +} + +run_cvd_bin() { + local exe=$1 + shift + HOME=$CF_HOME $CF_HOME/bin/$exe "$@" +} + +setup_env() { + curl -LO https://github.com/user-attachments/files/18728876/cuttlefish-base_1.2.0_amd64.zip + sudo dpkg -i ./cuttlefish-base_*_*64.zip || sudo apt-get install -f + rm cuttlefish-base_*_*64.zip + echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules + sudo udevadm control --reload-rules + sudo udevadm trigger + sudo usermod -aG kvm,cvdnetwork,render $USER + yes | "$sdk" --licenses > /dev/null + "$sdk" --channel=3 platform-tools +} + +download_cf() { + local branch=$1 + local device=$2 + + if [ -z $branch ]; then + branch='aosp-main' + fi + if [ -z $device ]; then + device='aosp_cf_x86_64_phone' + fi + local target="${device}-trunk_staging-userdebug" + + local build_id=$(curl -sL https://ci.android.com/builds/branches/${branch}/status.json | \ + jq -r ".targets[] | select(.name == \"$target\") | .last_known_good_build") + local sys_img_url="https://ci.android.com/builds/submitted/${build_id}/${target}/latest/raw/${device}-img-${build_id}.zip" + local host_pkg_url="https://ci.android.com/builds/submitted/${build_id}/${target}/latest/raw/cvd-host_package.tar.gz" + + curl -L $sys_img_url -o aosp_cf_phone-img.zip + curl -LO $host_pkg_url + rm -rf $CF_HOME + mkdir -p $CF_HOME + tar xvf cvd-host_package.tar.gz -C $CF_HOME + unzip aosp_cf_phone-img.zip -d $CF_HOME + rm -f cvd-host_package.tar.gz aosp_cf_phone-img.zip +} + + +test_main() { + run_cvd_bin launch_cvd $cvd_args + adb wait-for-device + ./gradlew connectedCheck + run_cvd_bin stop_cvd || true +} + +if [ -z $CF_HOME ]; then + print_error "! Environment variable CF_HOME is required" + exit 1 +fi + +case "$1" in + setup ) + setup_env + ;; + download ) + download_cf $2 $3 + ;; + test ) + trap cleanup EXIT + export -f run_cvd_bin + test_main + trap - EXIT + ;; + * ) + exit 1 + ;; +esac diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2b11cc2..dedea6a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,15 +24,15 @@ jobs: submodules: 'recursive' ssh-key: ${{ secrets.SSH_KEY }} fetch-depth: 0 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' + java-version: '21' cache: 'gradle' - uses: seanmiddleditch/gha-setup-ninja@master with: - version: 1.12.0 + version: 1.12.1 - name: ccache uses: hendrikmuhs/ccache-action@v1 with: @@ -58,6 +58,7 @@ jobs: with: name: ${{ matrix.os }}-library path: ~/.m2 + include-hidden-files: true test: needs: build @@ -157,15 +158,15 @@ jobs: with: submodules: 'recursive' ssh-key: ${{ secrets.SSH_KEY }} - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' + java-version: '21' cache: 'gradle' - uses: seanmiddleditch/gha-setup-ninja@master with: - version: 1.12.0 + version: 1.12.1 - name: ccache uses: hendrikmuhs/ccache-action@v1 with: @@ -200,3 +201,56 @@ jobs: path: | test/build/outputs !test/build/outputs/apk + + cf-test: + name: Test ${{ matrix.device }} + runs-on: ubuntu-24.04 + env: + CF_HOME: /home/runner/aosp_cf_phone + strategy: + fail-fast: false + matrix: + include: + - branch: "aosp-main" + device: "aosp_cf_x86_64_phone" + + steps: + - name: checkout + uses: actions/checkout@v4 + with: + submodules: 'recursive' + ssh-key: ${{ secrets.SSH_KEY }} + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '21' + cache: 'gradle' + - name: ccache + uses: hendrikmuhs/ccache-action@v1 + with: + key: ${{ runner.os }}-${{ github.sha }} + restore-keys: ${{ runner.os }} + save: false + - name: Setup Cuttlefish environment + run: | + .github/cuttlefish.sh setup + .github/cuttlefish.sh download ${{ matrix.branch }} ${{ matrix.device }} + curl -LO https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-linux.zip + unzip ninja-linux.zip -d $ANDROID_HOME/platform-tools + chmod +x $ANDROID_HOME/platform-tools/ninja + rm -rf $ANDROID_HOME/cmake + ccache -o cache_dir=${{ github.workspace }}/.ccache + ccache -o hash_dir=false + ccache -o compiler_check='%compiler% -dumpmachine; %compiler% -dumpversion' + - name: Run Cuttlefish test + timeout-minutes: 10 + run: su $USER -c '.github/cuttlefish.sh test' + - name: Upload logs on error + if: ${{ failure() }} + uses: actions/upload-artifact@v4 + with: + name: "cvd-logs-${{ matrix.device }}" + path: | + /home/runner/aosp_cf_phone/cuttlefish/instances/cvd-1/logs + /home/runner/aosp_cf_phone/cuttlefish/instances/cvd-1/cuttlefish_config.json