TestApp.io Fastlane Plugin

Upload your Android (.apk) and iOS (.ipa) builds to TestApp.io straight from your Fastlane lane. One action, both platforms, release notes from git, optional team notifications.

fastlane Plugin Badge Gem Version CI codecov Downloads License Ruby


Install

fastlane add_plugin testappio

That's it. The plugin will install the underlying ta-cli binary the first time you upload.

Quick start

lane :beta do
  gym(export_method: "ad-hoc")        # or gradle(task: "assembleRelease")

  upload_to_testappio(
    api_token: ENV["TESTAPPIO_API_TOKEN"],
    app_id:    ENV["TESTAPPIO_APP_ID"],
    notify:    true
  )
end

Get your api_token at https://portal.testapp.io/profile/tokens. Get your app_id at https://portal.testapp.io/apps.

Configuration

Key Description Env var Default
api_token API token from https://portal.testapp.io/profile/tokens TESTAPPIO_API_TOKEN
app_id App ID from your https://portal.testapp.io/apps page TESTAPPIO_APP_ID
release ios, android, or both TESTAPPIO_RELEASE current platform
apk_file Path to the Android .apk TESTAPPIO_ANDROID_PATH gradle's output
ipa_file Path to the iOS .ipa TESTAPPIO_IOS_PATH gym's output
release_notes Manual release notes TESTAPPIO_RELEASE_NOTES
git_release_notes Use the latest git commit message as release notes TESTAPPIO_GIT_RELEASE_NOTES true
git_commit_id Append the latest commit SHA to the release notes TESTAPPIO_GIT_COMMIT_ID false
notify Notify team members about the new release TESTAPPIO_NOTIFY false
self_update Auto-update ta-cli when a new version is available TESTAPPIO_SELF_UPDATE true

Examples

iOS only

lane :beta_ios do
  match(type: "adhoc")
  gym(export_method: "ad-hoc")

  upload_to_testappio(
    api_token:     ENV["TESTAPPIO_API_TOKEN"],
    app_id:        ENV["TESTAPPIO_APP_ID"],
    release:       "ios",
    release_notes: "Bug fixes and improvements",
    notify:        true
  )
end

Android only

lane :beta_android do
  gradle(task: "clean assembleRelease")

  upload_to_testappio(
    api_token:         ENV["TESTAPPIO_API_TOKEN"],
    app_id:            ENV["TESTAPPIO_APP_ID"],
    release:           "android",
    git_release_notes: true,
    git_commit_id:     true,
    notify:            true
  )
end

Both platforms in one lane

lane :beta_both do
  gradle(task: "clean assembleRelease")
  gym(export_method: "ad-hoc")

  upload_to_testappio(
    api_token: ENV["TESTAPPIO_API_TOKEN"],
    app_id:    ENV["TESTAPPIO_APP_ID"],
    release:   "both",
    notify:    true
  )
end

A runnable example lives in fastlane/Fastfile. Try it with bundle exec fastlane test.

Compatibility

Plugin version Ruby Status
2.x >= 3.0 Active — feature work + security fixes
1.x >= 2.6 Maintenance only — security fixes through May 2027

If your CI image uses Ruby 2.6 or 2.7, pin to ~> 1.0 in your Pluginfile:

gem "fastlane-plugin-testappio", "~> 1.0"

When you upgrade your CI to Ruby 3.0+, drop the pin and you'll get 2.x automatically.

Troubleshooting

  • fastlane add_plugin testappio fails on Bundler 2.0 issues — make sure your Ruby is 3.0 or higher (ruby -v).
  • Upload fails with a ta-cli error — the error message now includes the underlying ta-cli output so you can see exactly what went wrong (auth, network, provisioning, etc.). Run with fastlane --verbose for full context.
  • Token visible in CI logs — should never happen in 2.x; tokens are masked as ********. If you see this in 1.x, upgrade.
  • Other plugin issues — see the official Fastlane plugin troubleshooting guide.

Contributing

PRs welcome. Local development:

bundle install                  # install dev dependencies
bundle exec rspec               # run the unit test suite (49 specs)
bundle exec rubocop             # lint
bundle exec rake                # spec + rubocop together
INTEGRATION=1 bundle exec rspec # also run the 2 :integration specs (needs ta-cli installed)

Every PR adds an entry under ## [Unreleased] in CHANGELOG.md. See it for the full list of what changed between versions.

Feedback & support

Built by TestApp.io — happy releasing 🚀