NewiPhone Duo, live in your browser. Try it →
Vibeview
Pricing
Integration

Mobile App Testing in GitLab CI

On GitLab, a mobile test job usually needs a hosted macOS runner for iOS (on GitLab.com, a Premium and Ultimate feature still in beta) and an Android emulator that boots inside the job. With VibeView, an ordinary Linux job is enough. It hands VibeView the APK your pipeline built, or has VibeView build iOS in its cloud, and VibeView runs your tagged test groups against that exact build on a live iOS simulator, Android emulator, Apple TV, Android TV or Roku. The result comes back as a JUnit report, which GitLab puts in the merge request’s test summary. Smart, the default, replays recorded and learned paths, and uses AI (beta) only where the screen changed or a step has no path yet.

How it works

  1. 1. Store the token as a masked CI/CD variable

    In VibeView, under Settings > API token, create a token with the Developer role, CI only access and an expiry. In GitLab, add it under Settings > CI/CD > Variables as VIBEVIEW_API_TOKEN and tick Masked, so it never shows in a job log. Leave Protected off: a merge request pipeline gets a protected variable only when both of its branches are protected and the project allows it. A CI-only token can upload builds, start cloud builds, create tests from a spec, and start, cancel and read test runs. It can’t manage your team, billing, build secrets, signing credentials, webhooks or other tokens, or open live device sessions.

  2. 2. Add the job to .gitlab-ci.yml

    Tag the groups the pipeline should run (smoke here) in VibeView, when you create a group or later on its page; every tagged group must belong to the app the APK is for. The job runs only in merge request pipelines and takes the APK from your build-android job through needs:, so that job must run in merge request pipelines too, or GitLab refuses to create the pipeline. The npm cache is kept in the project folder, because GitLab caches only paths inside it. The APK must include the x86_64 ABI.

    vibeview-android:
      image: node:22
      needs: [build-android]
      rules:
        - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      cache:
        key: vibeview-cli
        paths: [.npm/]
      script:
        - npm install --global --cache .npm vibeview@0.58.0
        - |
          BUILD_ID=$(vibeview upload-app build/app-release.apk --output json \
            | node -p 'JSON.parse(require("fs").readFileSync(0)).build_id')
          vibeview run-suites --tag smoke --platform android --build "$BUILD_ID" \
            --commit-sha "$CI_COMMIT_SHA" --output junit > vibeview-results.xml
      artifacts:
        when: always
        reports:
          junit: vibeview-results.xml
  3. 3. Let the merge request show the result

    artifacts: when: always uploads the report even when a test failed, which is when you need it. GitLab shows it in the merge request’s test summary and on the pipeline’s Tests tab, a test case per VibeView test, and each one’s output holds the link to its run page with the step-by-step result and screenshots. vibeview run-suites exits 1 when a test failed and 2 when the run couldn’t complete, so the job, and the pipeline, fail with it. --commit-sha labels the runs with the commit; VibeView posts commit statuses to GitHub only, so on GitLab the report is the result.

  4. 4. iOS on a Linux runner, and TV

    For iOS, replace the upload with vibeview build --cloud --platform ios --json, which builds the ios entry of the vibeview.json in your repository on VibeView’s macOS builders; its build_finished line carries the build id for --build. A React Native or Expo app adds --profile preview, because its default development build waits for a Metro server the pipeline doesn’t have (run vibeview build --cloud --profile preview once on your machine to save that profile). Apple TV and Android TV jobs pass --platform tvos or androidtv, and a Roku job uploads the channel zip with --platform roku.

Full setup instructions live in the documentation.

Add GitLab CI to your pipeline

Start free and run your first check on a live device.