Skip to content

CLI

The Semaloop CLI pushes iOS and Android builds to Semaloop from your terminal or any CI system. It is in early access, so get in touch if you’d like to use it.

Download the latest binary for your platform from the releases page. On macOS you can also use Homebrew:

Terminal window
brew tap semaloop/tap
brew install semaloop

Create an API key in Settings → API keys, then either set it as the SEMALOOP_API_KEY environment variable or run semaloop auth login. A key is scoped to one app. See API keys.

Terminal window
semaloop build push build/YourApp.app

semaloop build push accepts an .app or .ipa for iOS, or a standalone .apk for Android. App bundles (.aab), XAPK or APK-set containers, and split APKs aren’t accepted. See exporting an APK from an app bundle.

Pass --git-repo, --git-commit and --git-ref together to let Semaloop report the results as checks on your pull request. This needs your repository to be connected under Settings → GitHub integration. See the GitHub integration.

In GitHub Actions you can use the semaloop/cli/actions/build-push action instead, which fills in the git details for you. The full command reference is in the CLI repository.

On Bitrise, add the Semaloop step to your workflow instead of installing the CLI. Add your API key to your project’s secrets as SEMALOOP_API_KEY, then add the step after the one that builds your app, usually xcode-archive. For a device build (.ipa):

- git::https://github.com/semaloop/bitrise-step-semaloop-submit-build.git@main:
title: Submit build to Semaloop
inputs:
- api_key: "$SEMALOOP_API_KEY"
- ipa_path: "$BITRISE_IPA_PATH"

For a simulator build (.app):

- git::https://github.com/semaloop/bitrise-step-semaloop-submit-build.git@main:
title: Submit build to Semaloop
inputs:
- api_key: "$SEMALOOP_API_KEY"
- test_bundle_path: "$BITRISE_TEST_BUNDLE_PATH"

On any other CI system, such as Codemagic or Azure DevOps, download the CLI binary in your pipeline and run semaloop build push.

By default, every active test runs on each build you push. To choose which tests run from your own pipeline instead, for example only the tests a pull request touches:

  1. In Settings → Test runs, set the uploads channel to Don’t run tests automatically.
  2. Push the build. semaloop build push returns the new build’s ID, and the GitHub Action exposes it as steps.<step id>.outputs.build-id.
  3. Connect to the MCP server with an API key and call tests_list to get your tests.
  4. Call test_runs_trigger with your appId, the buildId, and either the testIds to run or a tag.

A coding agent can do steps 3 and 4 for you, for example by comparing the pull request’s diff with your tests and picking the ones it affects.

The same call works from a scheduled job, for a test that has to run at a particular time of day, such as checking how your app behaves just after midnight in another time zone. Call test_runs_trigger with the latest build’s ID from builds_list.