.apk or .aab for Android, an .ipa for iOS. Your pipeline uploads each new build and reports it as a deployment, and a trigger you create starts the runs.
How it works
1
Upload the build
Your pipeline sends the build to QA Wolf storage and gets back the path it is stored under.
2
Report the deployment
Your pipeline calls
deployment.reportStatus, carrying the build’s path on the runner as the RUN_INPUT_PATH environment variable.3
A trigger matches
The deployment’s first
success report evaluates your triggers. Each one that matches creates a run, and the run carries RUN_INPUT_PATH.4
The flow launches the build
launch falls back to RUN_INPUT_PATH when the flow names no app, so the run executes against the build that was just uploaded.Requirements
- An API key, created under Workspace Settings → API Keys. A workspace, organization or user key all work.
- The workspace id, shown on the same page.
- A QA Wolf environment to report into. The deploy resolves to an environment by alias or name, and a name that matches nothing creates a new environment that no trigger targets.
- One of: the QA Wolf Fastlane plugin 1.0.0 or later,
qawolf/notify-qawolf-on-deploy-action@v3, or@qawolf/ci-sdk3.1.0 or later. Earlier versions report through the legacy deploy webhook, which triggers never see. See Mobile build testing with legacy triggers.
Name the build file
You choose the name the build is stored under, and your flows resolve the build by that name. Use one stable name per environment and platform, so each upload replaces the last:The path the run needs
Uploaded builds are mounted on the runner under/home/wolf/run-inputs-executables/. RUN_INPUT_PATH has to carry the absolute path:
Set up the pipeline
- Fastlane
- GitHub Actions
- Node.js
- Webhook
The plugin is not published to RubyGems, so point the Run
Gemfile at the repository and pin a tag.fastlane install_plugins, then add both actions to the lane that builds your app. upload_to_qawolf stores the build and leaves its filename in the lane context; notify_deploy_qawolf reports the deployment and sets RUN_INPUT_PATH to that build for you.notify_deploy_qawolf reports a success status by default, which is the status that evaluates triggers. It sets QAWOLF_DEPLOYMENT_ID and QAWOLF_ENVIRONMENT_RUNS_URL in the lane context and the environment, and returns the deployment id. Runs start asynchronously afterwards, so no run id comes back.The plugin’s README lists every option, including repository and pull_request_number for PR testing, and the upgrade steps from 0.x.These examples upload an Android
.apk. iOS works identically — point the same steps at your .ipa, and name the service ios.Create a trigger
A deployment starts nothing until a trigger matches it. Create one on the workspace’s triggers page, with conditions that match the deployments you now report:
Shipping both platforms into one environment needs two triggers, one per
servicePattern, each selecting that platform’s flows. Without the service condition both triggers fire on both builds, and the Android flows run against the iOS build.
deployTargetPattern matches on the deploy target URL, which a mobile build has none of, so it is not a way to tell builds apart.
See Trigger fields for every condition and for the action that selects which flows run.
Use the build in a flow
A flow that names no app launches whateverRUN_INPUT_PATH points at, so the run uses the build that was just uploaded:
app at all stops the fallback: launch({ app: ... }) resolves app.path, then app.env, then app.url, and never falls back to RUN_INPUT_PATH. On Android and iOS these paths must be absolute too. See App resolution for Android or iOS.
Verify the integration
1
Run the pipeline
Run the CI job that builds your app.
2
Check the upload and the report
The upload step succeeds, and the report step logs the deployment id and the environment’s runs page.
3
Check the trigger fired
Open the deployment in QA Wolf. It lists a verdict for every trigger, including the reason a trigger did not match. See Deployments.
4
Check the run used the build
Open the run the trigger created and confirm it launched the build you just uploaded.
Troubleshooting
- The build uploads, the deployment is recorded, and nothing runs — no trigger matched. Open the deployment and read the per-trigger verdicts. The usual causes are an environment name that created a new environment instead of resolving an existing one, and a
servicePatternon the trigger that the report does not send aservicefor. - Only one of the two platforms runs — both legs reported under the same
providerDeploymentId, so the second updated the first deployment instead of creating one, and only a deployment’s firstsuccessreport evaluates triggers. Give each leg its own identity:provider_deployment_discriminatoron Fastlane,discriminatorondetectProviderDeploymentId,deployment-idon the GitHub Action. - The Android flows ran against the iOS build — the triggers have no
servicePattern, so both fired on both deployments. - The flow can’t find the build — most often
RUN_INPUT_PATHis a bare filename rather than an absolute path under/home/wolf/run-inputs-executables/. Otherwise check that the report carriedenvironmentVariables, that the name matches what was uploaded, and that a later report of the same deployment did not replace the variables — a report that sendsenvironmentVariablesreplaces the stored map rather than merging into it. - The pipeline step passes but the workspace never sees the deploy — the step is still on the legacy path.
@v1and@v2of the GitHub Action, Fastlane plugin 0.4.8 and below, and the SDK’sattemptNotifyDeployall report through the legacy deploy webhook, which triggers never see. - Authentication errors — check
QAWOLF_API_KEY, and thatworkspaceIdnames the workspace the key may act on.
Related
- Triggers and Trigger fields
- Deployments — how a deployment resolves to an environment, and the verdict per trigger.
- v0/run-inputs-executables-signed-urls
@qawolf/ci-sdk- Mobile build testing with legacy triggers