name: 'CI VM' description: 'Run main CI steps in VMs for VM-only platforms.' inputs: target: description: 'Rust target to build for.' required: true working-directory: description: 'Working directory.' default: '.' ndk-version: description: 'NDK version to install.' # https://searchfox.org/mozilla-central/search?q=NDK_VERSION =&path=python/mozboot/mozboot/android.py default: '27.2.12479018' api-level: description: 'Android API level to use.' # https://searchfox.org/mozilla-central/search?q=\bapi_level=&path=taskcluster/scripts/misc/build-llvm-common.sh®exp=true # However, NSS requires an API >= 23 for a few symbols. default: '23' minimum-nss-version: description: 'If NSS is required, the minimum version required.' default: '' github-token: description: 'A Github PAT' required: true runs: using: composite steps: - uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e # v5.1.0 with: distribution: zulu java-version: 23 - uses: android-actions/setup-android@9fc6c4e9069bf8d3d10b2204b1fb8f6ef7065407 # v3.2.2 with: accept-android-sdk-licenses: true log-accepted-android-sdk-licenses: false - shell: bash env: NDK_VERSION: ${{ inputs.ndk-version }} WD: ${{ inputs.working-directory }} run: cd "$WD" && sdkmanager --install "ndk;$NDK_VERSION" - uses: ./.github/actions/rust with: version: stable targets: ${{ inputs.target }} tools: cargo-ndk@^4 token: ${{ inputs.github-token }} - uses: ./.github/actions/nss if: ${{ inputs.minimum-nss-version != '' }} with: minimum-version: ${{ inputs.minimum-nss-version }} target: ${{ inputs.target }} - shell: bash env: TARGET: ${{ startsWith(inputs.target, 'arm') && 'arm64-v8a' || inputs.target }} API_LEVEL: ${{ inputs.api-level }} WD: ${{ inputs.working-directory }} run: cd "$WD" && cargo ndk --platform "$API_LEVEL" --target "$TARGET" test --no-run - shell: bash env: TARGET: ${{ inputs.target }} API_LEVEL: ${{ inputs.api-level }} run: | 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 --name-match=kvm cat <<'EOF' > /tmp/rust-android-run-tests-on-emulator.sh #!/bin/bash set -ex adb wait-for-device while [ -z "$(adb shell getprop sys.boot_completed | tr -d '\r')" ]; do sleep 1; done any_failures=0 TMP=/data/local/tmp [ -e "$WD/test-fixture/db" ] && adb push "test-fixture/db" "$TMP/" [ "$LD_LIBRARY_PATH" ] && adb push "$LD_LIBRARY_PATH" "$TMP/" for test in $(find $WD/target/$TARGET/debug/deps/ -type f -executable ! -name "*.so" -name "*-*"); do adb push "$test" "$TMP/" adb shell chmod +x "$TMP/$(basename "$test")" # See https://unix.stackexchange.com/a/451140/409256 adb shell "CARGO_TERM_COLOR=always RUST_BACKTRACE=1 LD_LIBRARY_PATH=$TMP/lib NSS_DB_PATH=$TMP/db API_LEVEL=$API_LEVEL $TMP/$(basename "$test") || echo _FAIL_" 2>&1 | tee output grep _FAIL_ output > /dev/null && any_failures=1 done exit $any_failures EOF chmod a+x /tmp/rust-android-run-tests-on-emulator.sh - uses: reactivecircus/android-emulator-runner@b530d96654c385303d652368551fb075bc2f0b6b # v2.35.0 with: api-level: ${{ inputs.api-level }} arch: ${{ startsWith(inputs.target, 'x86_64') && 'x86_64' || (startsWith(inputs.target, 'i686') && 'x86' || (startsWith(inputs.target, 'aarch64') && 'arm64-v8a')) }} ndk: ${{ inputs.ndk-version }} emulator-boot-timeout: 120 disk-size: 2G script: /tmp/rust-android-run-tests-on-emulator.sh