Fastlane plugin to upload both Android (.apk) and iOS (.ipa) apps to TestApp.io and notify your team for testing and feedback. One action, both platforms, release notes from git, optional team notifications.

๐ŸŽ‰ v2.0.0 โ€” May 28, 2026: Critical bug fixes, --api_token masked in verbose logs, better error messages, and Ruby 3.0+ required. See what changed ยท Full release notes

Getting started

This project is a Fastlane plugin. To get started with fastlane-plugin-testappio, add it to your project:

fastlane add_plugin testappio

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

Compatibility

Plugin versionRubyStatus
2.x>= 3.0Active โ€” feature work + security fixes
1.x>= 2.6Maintenance 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"

Configuration

KeyDescriptionEnv VarDefault
api_tokenAPI token from portal.testapp.io/profile/tokensTESTAPPIO_API_TOKENโ€”
app_idApp ID from portal.testapp.io/appsTESTAPPIO_APP_IDโ€”
releaseios, android, or bothTESTAPPIO_RELEASEcurrent platform
apk_filePath to the Android .apkTESTAPPIO_ANDROID_PATHgradle's output
ipa_filePath to the iOS .ipaTESTAPPIO_IOS_PATHgym's output
release_notesManual release notes shown to testersTESTAPPIO_RELEASE_NOTESโ€”
git_release_notesUse the latest git commit message as release notesTESTAPPIO_GIT_RELEASE_NOTEStrue
git_commit_idAppend the latest commit SHA to release notesTESTAPPIO_GIT_COMMIT_IDfalse
notifyNotify team members about the new releaseTESTAPPIO_NOTIFYfalse
self_updateAuto-update ta-cli when a new version is availableTESTAPPIO_SELF_UPDATEtrue

Check the TA-CLI guide for what happens under the hood.

Usage

The upload_to_testappio action takes these parameters:

upload_to_testappio(
  api_token: ENV["TESTAPPIO_API_TOKEN"],
  app_id:    ENV["TESTAPPIO_APP_ID"],
  release_notes: "My release notes here...",
  git_release_notes: true,
  git_commit_id: false,
  notify: true,
  self_update: true
)
๐Ÿ’ก You can replace all the parameters with environment variables: see configuration.
โš ๏ธ api_token and app_id should be kept secret. Use your CI's secret store or environment variables instead of literals.
๐Ÿ’ช release, apk_file, and ipa_file can be omitted โ€” the plugin detects the platform context and fills them in automatically.

Check the example Fastfile for a runnable end-to-end example. Try it by cloning the repo, running fastlane install_plugins and bundle exec fastlane test.

iOS
lane :beta do
  increment_build_number
  match(type: "adhoc")
  gym(export_method: "ad-hoc")

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

  clean_build_artifacts # optional
end

And finally ๐ŸŽ‰

fastlane ios beta

Android

Optional:

fastlane add_plugin increment_version_code
lane :beta do
  increment_version_code # [Optional] fastlane add_plugin increment_version_code

  gradle(task: "clean assembleRelease") # or clean assembleDebug

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

And finally ๐ŸŽ‰

fastlane android beta

What's new in v2.0.0

Released May 28, 2026. Full release notes on GitHub.

โš ๏ธ Breaking

  • Ruby 3.0+ is now required. Customers on Ruby 2.6 or 2.7 should pin to ~> 1.0 in their Pluginfile until they upgrade Ruby. Existing Gemfile.lock entries stay on 1.0.5 and won't auto-upgrade.

๐Ÿ› Fixed

  • fastlane action upload_to_testappio (the help/docs introspection command) no longer crashes with NameError. A typo in the action's metadata was breaking this path โ€” actual uploads were unaffected; only the introspection command was broken.
  • validate_file_path no longer raises TypeError when only one of apk_file or ipa_file is set โ€” fixes iOS-only and Android-only lanes that didn't pass the other file param.
  • Uploads no longer fail when ta-cli writes warnings or info to stderr โ€” only real Error: lines fail the lane now.
  • --api_token is now masked as ******** in fastlane --verbose logs โ€” previously echoed in plain text.

โœจ Improved

  • When an upload fails, the actual ta-cli error message now appears in your CI logs (e.g. "provisioning profile expired" or "Invalid authorization") โ€” no more generic "Error while calling ta-cli".
  • Modern toolchain: rubocop 1.50+, simplecov 0.22, fastlane 2.217.
  • GitHub Actions CI matrix across Ruby 3.0โ€“3.3 ร— ubuntu/macos.
  • Test coverage raised from 36.79% to 100% line / 86% branch.

Best practices

  • Store secrets in env vars or your CI's secret store. Never commit api_token or app_id to source control.
  • Use git_release_notes: true for automatic release notes drawn from your latest commit. Pair with descriptive commit messages.
  • Enable notify: true on builds that should reach testers immediately. Disable for internal-only or silent uploads.
  • Leave self_update: true (the default) unless you have a reason to pin ta-cli to a specific version.
  • Pin to a major version (e.g. ~> 2.0) in your Pluginfile to allow non-breaking fixes while protecting against breaking changes.

Troubleshooting

  • Bundler error on install: ensure Ruby >= 3.0 for plugin v2.x. Check with ruby -v. If you need Ruby 2.6 / 2.7 compatibility, pin to ~> 1.0.
  • 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 it in 1.x, upgrade.
  • fastlane action upload_to_testappio crashes: known bug in v1.0.5 (introspection only โ€” uploads unaffected). Fixed in v2.0.0.

For general Fastlane plugin issues, see the official Fastlane plugins troubleshooting guide.

Using Fastlane plugins

Check the Fastlane Plugins documentation for more on how the plugin system works.

About Fastlane

Fastlane is the easiest way to automate beta deployments and releases for iOS and Android apps. Learn more at fastlane.tools.


Tip: Once your CI/CD pipeline uploads a build, team members using the TestApp.io mobile app receive a push notification and can install the build with a single tap. You can also create share links to distribute builds to external testers and clients.

Need help? Contact us. We're happy to assist!