From f54e43c52a15b3f11b154894873832a811699d2d Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Tue, 10 Sep 2024 22:16:32 +0100 Subject: [PATCH] Attach render test artifacts AWS Device Farm to workflow (#2812) --- .github/workflows/android-ci.yml | 17 ----- .github/workflows/android-device-test.yml | 16 ++++- .../android/app/src/main/AndroidManifest.xml | 7 +- .../aws-device-farm/log-test-spec-output.mjs | 47 ------------- .../aws-device-farm/store-test-artifacts.mjs | 69 +++++++++++++++++++ 5 files changed, 88 insertions(+), 68 deletions(-) delete mode 100644 scripts/aws-device-farm/log-test-spec-output.mjs create mode 100644 scripts/aws-device-farm/store-test-artifacts.mjs diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml index 73cfa5276..5477d63c1 100644 --- a/.github/workflows/android-ci.yml +++ b/.github/workflows/android-ci.yml @@ -278,23 +278,6 @@ jobs: ./render-test/android/RenderTestsApp-${{ matrix.flavor }}.apk ./render-test/android/RenderTests-${{ matrix.flavor }}.apk - # these two can be (and should be) removed once merged into main - - name: Copy render tests and render test app - if: matrix.flavor == 'opengl' - run: | - cp ./render-test/android/RenderTestsApp-opengl.apk ./render-test/android/RenderTestsApp.apk - cp ./render-test/android/RenderTests-opengl.apk ./render-test/android/RenderTests.apk - - - name: Store Render Test .apk files - if: matrix.flavor == 'opengl' - uses: actions/upload-artifact@v4 - with: - name: android-render-tests - if-no-files-found: error - path: | - ./render-test/android/RenderTestsApp.apk - ./render-test/android/RenderTests.apk - android-ci-result: runs-on: ubuntu-latest if: needs.pre_job.outputs.should_skip != 'true' && always() diff --git a/.github/workflows/android-device-test.yml b/.github/workflows/android-device-test.yml index 022815c26..177b98c59 100644 --- a/.github/workflows/android-device-test.yml +++ b/.github/workflows/android-device-test.yml @@ -29,7 +29,10 @@ jobs: 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" + 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, @@ -165,7 +168,16 @@ jobs: if: failure() && env.run_device_test == 'true' run: | npm install - node scripts/aws-device-farm/log-test-spec-output.mjs ${{ steps.aws_device_farm_run.outputs.runArn }} + temp_dir="$(mktemp -d)" + node scripts/aws-device-farm/store-test-artifacts.mjs ${{ steps.aws_device_farm_run.outputs.runArn }} "$temp_dir" + zip -r test_artifacts.zip "$temp_dir" + + - name: Upload Test Artifacts + if: failure() && env.run_device_test == 'true' + uses: actions/upload-artifact@v4 + with: + name: test-artifacts + path: test_artifacts.zip - name: Generate another token (previous one could have expired) if: always() diff --git a/render-test/android/app/src/main/AndroidManifest.xml b/render-test/android/app/src/main/AndroidManifest.xml index a601f3ca5..c091e7bf3 100644 --- a/render-test/android/app/src/main/AndroidManifest.xml +++ b/render-test/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + android:hasCode="true" + android:debuggable="true" + tools:ignore="HardcodedDebugMode"> { + const suites = await deviceFarmClient.send(new ListSuitesCommand({arn: job.arn})); + await Promise.all((suites.suites || []).map(async (suite) => { + const artifacts = await deviceFarmClient.send(new ListArtifactsCommand({ + arn: suite.arn, + type: 'FILE' + })); + await Promise.all((artifacts.artifacts || []).map(async (artifact) => { + if (!artifact.name || !artifact.url || !artifact.type) return; + if (['TESTSPEC_OUTPUT', 'CUSTOMER_ARTIFACT', 'CUSTOMER_ARTIFACT_LOG', 'DEVICE_LOG'].includes(artifact.type)) { + const filename = `${artifact.name.replaceAll(' ', '_')}-${crypto.randomBytes(10).toString('hex')}.${artifact.extension}`; + const res = await fetch(artifact.url); + if (!res.ok || !res.body) return; + const destination = path.resolve(outputDir, filename); + const fileStream = fs.createWriteStream(destination, { flags: 'wx' }); + await finished(Readable.fromWeb(/** @type {any} **/ (res.body)).pipe(fileStream)); + } + })); + })); + })); +} + +await getTestSpecOutput(arn);