with one click
maestro-ci-integration
// Integrate Maestro mobile UI tests into CI/CD pipelines via GitHub Actions or generic CLI for any CI platform (Jenkins, GitLab CI, Azure DevOps, etc.)
// Integrate Maestro mobile UI tests into CI/CD pipelines via GitHub Actions or generic CLI for any CI platform (Jenkins, GitLab CI, Azure DevOps, etc.)
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | maestro-ci-integration |
| description | Integrate Maestro mobile UI tests into CI/CD pipelines via GitHub Actions or generic CLI for any CI platform (Jenkins, GitLab CI, Azure DevOps, etc.) |
| tech_stack | ["maestro","mobile-native"] |
| language | ["bash"] |
| capability | ["ci-cd","e2e-testing"] |
| version | Maestro unversioned |
| collected_at | "2025-07-17T00:00:00.000Z" |
Source: https://docs.maestro.dev/maestro-cloud/ci-cd-integration/generic-ci-platform, https://docs.maestro.dev/maestro-cloud/ci-cd-integration/github-actions, https://docs.maestro.dev/maestro-cli, https://docs.maestro.dev/maestro-cli/maestro-cli-commands-and-options
Run Maestro mobile UI tests automatically in CI/CD pipelines. Two integration paths exist: the official GitHub Action (mobile-dev-inc/action-maestro-cloud) for turnkey GitHub integration, and the generic maestro cloud CLI command that works with any CI provider. Both upload an app binary + Flow YAML directory to Maestro Cloud and return exit codes plus a console report URL.
maestro cloud as a shell step.maestro test against emulators/simulators before pushing.maestro test -c (continuous mode) watches YAML files and reruns on save.1. Add secrets — Repo → Settings → Secrets and variables → Actions:
MAESTRO_API_KEY — from Maestro DashboardMAESTRO_PROJECT_ID — from project settings2. Workflow file (.github/workflows/maestro.yml):
name: Maestro Cloud Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
maestro-cloud:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-java@v3
with:
java-version: 11
distribution: 'temurin'
- run: ./gradlew assembleDebug
- uses: mobile-dev-inc/action-maestro-cloud@v1
with:
api-key: ${{ secrets.MAESTRO_API_KEY }}
project-id: ${{ secrets.MAESTRO_PROJECT_ID }}
app-file: app/build/outputs/apk/debug/app-debug.apk
# Install CLI
curl -Ls "https://get.maestro.mobile.dev" | bash
# Run cloud tests
maestro cloud \
--api-key "$MAESTRO_API_KEY" \
--project-id "$MAESTRO_PROJECT_ID" \
--app-file app/build/outputs/apk/debug/app-debug.apk \
--flows "./e2e"
Exit codes: 0 = all passed, 1 = at least one Flow failed. Standard CI behavior.
maestro-tests:
stage: test
image: ubuntu:latest
before_script:
- curl -Ls "https://get.maestro.mobile.dev" | bash
script:
- maestro cloud
--api-key "$MAESTRO_API_KEY"
--project-id "$MAESTRO_PROJECT_ID"
--app-file "app/build/outputs/apk/debug/app-debug.apk"
--flows "./e2e"
--device-os android-34
--include-tags smoke
--format JUNIT
--output report.xml
artifacts:
when: always
paths:
- report.xml
| Input | Required | Description |
|---|---|---|
api-key | Yes | Maestro Cloud API key |
project-id | Yes | Project ID from dashboard |
app-file | Yes* | Path to APK/AAB/.app ZIP (*unless app-binary-id used) |
app-binary-id | No | Reuse previously uploaded binary to skip re-upload |
async | No | If true, exits immediately after upload (default: false) |
env | No | Environment variables passed to Flows |
include-tags | No | Comma-separated tags — only matching flows run |
exclude-tags | No | Comma-separated tags — matching flows are skipped |
workspace | No | Flow directory path (default: .maestro) |
timeout | No | Max minutes to wait for completion (default: 30) |
device-os | No | OS version e.g. android-34, iOS-26-2 |
device-model | No | Device model e.g. pixel_6, iPhone-17-Pro |
device-locale | No | Locale e.g. de_DE |
mapping-file | No | ProGuard map (Android) or dSYM (iOS) for symbolication |
maestro cloud CLI flags (most-used)| Flag | Purpose |
|---|---|
--api-key | API key (required) |
--project-id | Project ID (required) |
--app-file | App binary path (required unless --app-binary-id) |
--app-binary-id | Reuse cached binary |
--flows | Flow directory path (required) |
--device-os | Target OS version |
--device-model | Target device model |
--include-tags / --exclude-tags | Tag-based flow filtering |
--async | Fire-and-forget upload |
--format | Report format: JUNIT, HTML, NOOP |
--output | Report output path (default: report.xml) |
--name | Human-readable upload name |
-e, --env | Environment variables: --env KEY=VALUE |
maestro test flow.yaml # Run single flow
maestro test ./e2e # Run all flows in directory
maestro test -c ./e2e # Continuous mode (watch & rerun)
maestro test --include-tags=smoke ./e2e # Tag filter
maestro test --format JUNIT --output report.xml ./e2e # Report output
maestro start-device --platform ios --device-model iPhone-17-Pro --device-os iOS-26-2
maestro hierarchy # Print view hierarchy for selector debugging
android-api-level and ios-version are deprecated. Always use --device-os instead (e.g., android-34, iOS-26-2). Old flags still work but emit warnings.--app-file and --flows exclusively in scripts.--async exits immediately; the pipeline won't know if tests passed. Only use when you don't need to block on results.export MAESTRO_DRIVER_STARTUP_TIMEOUT=180000 (value in ms).*.app directory or zipped .app — not .ipa.runFlow).--headless flag on maestro test does not apply to Android/iOS.maestro cloud require a Maestro Cloud Plan.maestro-cloud-execution: The CI integration calls maestro cloud — configure device matrices, locales, and parallel execution in the cloud execution layer.maestro-flow-yaml-basics: CI runs the flows you author — ensure flows use proper selectors, launchApp with clearState, and subflow modularity.maestro-assertions-conditions: Flows with assertVisible/assertNotVisible and conditional branching give CI meaningful pass/fail signals.--app-binary-id / app-binary-id to skip re-uploading the app — dramatically faster CI runs.include-tags for smoke tests on PRs, and run full suites on main branch merges. Use exclude-tags to skip flaky or slow flows in CI.--format JUNIT --output report.xml in generic CI and collect the XML as a build artifact for test result visualization.