203 lines
8.8 KiB
YAML
203 lines
8.8 KiB
YAML
name: android-device-test
|
|
|
|
on:
|
|
workflow_run:
|
|
workflows: [android-ci]
|
|
types:
|
|
- completed
|
|
|
|
permissions:
|
|
id-token: write # needed for AWS
|
|
|
|
jobs:
|
|
android-device-test:
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
test: [
|
|
{
|
|
artifactName: android-render-tests-opengl,
|
|
testFile: RenderTests-opengl.apk,
|
|
appFile: RenderTestsApp-opengl.apk,
|
|
name: "Android Render Tests (OpenGL)",
|
|
# Google Pixel 7 Pro
|
|
devicePool: "arn:aws:devicefarm:us-west-2:373521797162:devicepool:20687d72-0e46-403e-8f03-0941850665bc/9692fe7f-86a9-4ecc-908f-175600968564"
|
|
},
|
|
{
|
|
artifactName: android-render-tests-vulkan,
|
|
testFile: RenderTests-vulkan.apk,
|
|
appFile: RenderTestsApp-vulkan.apk,
|
|
name: "Android Render Tests (Vulkan)",
|
|
# Google Pixel 7 Pro
|
|
devicePool: "arn:aws:devicefarm:us-west-2:373521797162:devicepool:20687d72-0e46-403e-8f03-0941850665bc/9692fe7f-86a9-4ecc-908f-175600968564",
|
|
# android-render-test.yml
|
|
# see https://github.com/maplibre/ci-runners/tree/main/aws-device-farm/custom-test-envs
|
|
testSpecArn: "arn:aws:devicefarm:us-west-2:373521797162:upload:20687d72-0e46-403e-8f03-0941850665bc/c1fc7d3e-dfe3-4a31-9ee0-7b0f71b08872"
|
|
},
|
|
{
|
|
artifactName: benchmarkAPKs,
|
|
testFile: "MapLibreAndroidTestApp-drawable-release-androidTest.apk",
|
|
appFile: "MapLibreAndroidTestApp-drawable-release.apk",
|
|
name: "Android Benchmark",
|
|
testFilter: "org.maplibre.android.benchmark.Benchmark",
|
|
# Google Pixel 7 Pro
|
|
# query with `aws list-device-pools --arn <project_arn>`
|
|
devicePool: "arn:aws:devicefarm:us-west-2:373521797162:devicepool:20687d72-0e46-403e-8f03-0941850665bc/9692fe7f-86a9-4ecc-908f-175600968564",
|
|
# benchmark-android.yaml
|
|
# see https://github.com/maplibre/ci-runners/tree/main/aws-device-farm/custom-test-envs
|
|
testSpecArn: "arn:aws:devicefarm:us-west-2:373521797162:upload:20687d72-0e46-403e-8f03-0941850665bc/14862afb-cf88-44aa-9f1e-5131cbb22f01"
|
|
},
|
|
{
|
|
artifactName: android-ui-test,
|
|
testFile: InstrumentationTests.apk,
|
|
appFile: InstrumentationTestApp.apk,
|
|
name: "Android Instrumentation Tests",
|
|
# Google Pixel 7 Pro
|
|
devicePool: "arn:aws:devicefarm:us-west-2:373521797162:devicepool:20687d72-0e46-403e-8f03-0941850665bc/9692fe7f-86a9-4ecc-908f-175600968564",
|
|
testSpecArn: "arn:aws:devicefarm:us-west-2:373521797162:upload:20687d72-0e46-403e-8f03-0941850665bc/09e0738e-c91e-4c5f-81e6-06a06cc340d8"
|
|
},
|
|
{
|
|
artifactName: android-cpp-tests,
|
|
testFile: app-release-androidTest.apk,
|
|
appFile: app-debug.apk,
|
|
name: "Android C++ Unit Tests",
|
|
# Google Pixel 7 Pro
|
|
devicePool: "arn:aws:devicefarm:us-west-2:373521797162:devicepool:20687d72-0e46-403e-8f03-0941850665bc/9692fe7f-86a9-4ecc-908f-175600968564"
|
|
}
|
|
]
|
|
runs-on: ubuntu-latest
|
|
if: github.repository_owner == 'maplibre' && github.event.workflow_run.conclusion == 'success'
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version-file: '.nvmrc'
|
|
|
|
- id: parent_workflow
|
|
run: |
|
|
conclusion=$(curl --retry 5 ${{ github.event.workflow_run.jobs_url }} | jq -r '.jobs[] | select(.name == "android-build").conclusion')
|
|
was_skipped=$([[ "$conclusion" = "skipped" || "$conclusion" = "cancelled" ]] && echo "true" || echo "false")
|
|
echo "was_skipped=$was_skipped" >> "$GITHUB_OUTPUT"
|
|
|
|
# get comment from PR
|
|
|
|
- uses: ./.github/actions/get-pr-number
|
|
id: get-pr-number
|
|
|
|
- name: Generate token
|
|
id: generate_token
|
|
uses: tibdex/github-app-token@v2
|
|
with:
|
|
revoke: false # revoking will fail for long running workflows, because the token will already have expired
|
|
app_id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }}
|
|
private_key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }}
|
|
|
|
- name: Check if comment on PR contains '!benchmark android'
|
|
if: matrix.test.name == 'Android Benchmark' && steps.get-pr-number.outputs.pr-number
|
|
uses: peter-evans/find-comment@v3
|
|
id: benchmark_comment
|
|
with:
|
|
issue-number: ${{ steps.get-pr-number.outputs.pr-number }}
|
|
body-regex: '^!benchmark.*android.*$'
|
|
|
|
- name: Should we run this device test?
|
|
# always run when something was merged into main
|
|
# run benchmark when comment with '!benchmark android' exists in PR
|
|
if: |
|
|
steps.parent_workflow.outputs.was_skipped == 'false' &&
|
|
((github.event.workflow_run.head_branch == 'main' && github.event.workflow_run.event == 'push') ||
|
|
matrix.test.name == 'Android Benchmark' && steps.benchmark_comment.outputs.comment-id ||
|
|
matrix.test.name != 'Android Benchmark')
|
|
run:
|
|
echo "run_device_test=true" >> "$GITHUB_ENV"
|
|
|
|
- uses: LouisBrunner/checks-action@v2.0.0
|
|
id: create_check
|
|
with:
|
|
token: ${{ steps.generate_token.outputs.token }}
|
|
details_url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
|
status: in_progress
|
|
name: ${{ matrix.test.name }}
|
|
sha: ${{ github.event.workflow_run.head_sha }}
|
|
|
|
- uses: ./.github/actions/download-workflow-run-artifact
|
|
if: env.run_device_test == 'true'
|
|
with:
|
|
artifact-name: ${{ matrix.test.artifactName }}
|
|
expect-files: "${{ matrix.test.testFile }}, ${{ matrix.test.appFile }}"
|
|
|
|
- name: Configure AWS Credentials
|
|
if: env.run_device_test == 'true'
|
|
uses: aws-actions/configure-aws-credentials@v4
|
|
with:
|
|
aws-region: us-west-2
|
|
role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }}
|
|
role-session-name: ${{ github.run_id }}
|
|
role-duration-seconds: 14400
|
|
|
|
- name: Run ${{ matrix.test.name }} on AWS Device Farm
|
|
if: env.run_device_test == 'true'
|
|
run: |
|
|
export name="${{ matrix.test.name }}"
|
|
export appType=ANDROID_APP
|
|
export appFile="${{ matrix.test.appFile }}"
|
|
export testFile="${{ matrix.test.testFile }}"
|
|
export testPackageType=INSTRUMENTATION_TEST_PACKAGE
|
|
export testType=INSTRUMENTATION
|
|
export testFilter="${{ matrix.test.testFilter }}"
|
|
export AWS_DEVICE_FARM_PROJECT_ARN="${{ vars.AWS_DEVICE_FARM_PROJECT_ARN }}"
|
|
export AWS_DEVICE_FARM_DEVICE_POOL_ARN="${{ matrix.test.devicePool }}"
|
|
export testSpecArn="${{ matrix.test.testSpecArn }}"
|
|
export wait_for_completion=true
|
|
|
|
set +e
|
|
|
|
run_arn="$(./scripts/aws-device-farm/aws-device-farm-run.sh)"
|
|
exit_status=$?
|
|
echo "run_arn=$run_arn" >> "$GITHUB_ENV"
|
|
|
|
# make sure workflow fails
|
|
if [ $exit_status -ne 0 ]; then
|
|
exit $exit_status
|
|
fi
|
|
|
|
- name: Store Test Artifacts
|
|
if: (matrix.test.name == 'Android Benchmark' || failure()) && env.run_device_test == 'true'
|
|
run: |
|
|
npm install
|
|
results_dir="$(mktemp -d)"
|
|
echo results_dir="$results_dir" >> "$GITHUB_ENV"
|
|
node scripts/aws-device-farm/store-test-artifacts.mjs --runArn ${{ env.run_arn }} --outputDir "$results_dir"
|
|
zip -r test_artifacts.zip "$results_dir"
|
|
|
|
- name: Store Benchmark Results
|
|
if: matrix.test.name == 'Android Benchmark' && env.run_device_test == 'true'
|
|
run: |
|
|
benchmark_results_dir="$(mktemp -d)"
|
|
node scripts/aws-device-farm/collect-benchmark-outputs.mjs --inputDir "${{ env.results_dir }}" --outputDir "$benchmark_results_dir"
|
|
node scripts/aws-device-farm/upload-benchmark-outputs-to-s3.mjs --dir "$benchmark_results_dir"
|
|
|
|
- name: Upload Test Artifacts
|
|
if: (matrix.test.name == 'Android Benchmark' || failure()) && env.run_device_test == 'true'
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: "Test Artifacts ${{ matrix.test.name }}"
|
|
path: test_artifacts.zip
|
|
|
|
- name: Generate another token (previous one could have expired)
|
|
if: always()
|
|
id: generate_token_2
|
|
uses: tibdex/github-app-token@v2
|
|
with:
|
|
app_id: ${{ secrets.MAPLIBRE_NATIVE_BOT_APP_ID }}
|
|
private_key: ${{ secrets.MAPLIBRE_NATIVE_BOT_PRIVATE_KEY }}
|
|
|
|
- uses: LouisBrunner/checks-action@v2.0.0
|
|
if: always()
|
|
with:
|
|
token: ${{ steps.generate_token_2.outputs.token }}
|
|
check_id: ${{ steps.create_check.outputs.check_id }}
|
|
conclusion: ${{ job.status }}
|
|
sha: ${{ github.event.workflow_run.sha }}
|