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 notesGetting started
This project is a Fastlane plugin. To get started with fastlane-plugin-testappio, add it to your project:
fastlane add_plugin testappioThat's it. The plugin will install the underlying ta-cli binary the first time you upload.
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"Configuration
| Key | Description | Env Var | Default |
|---|---|---|---|
api_token | API token from portal.testapp.io/profile/tokens | TESTAPPIO_API_TOKEN | โ |
app_id | App ID from portal.testapp.io/apps | 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 shown to testers | 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 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 |
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_tokenandapp_idshould be kept secret. Use your CI's secret store or environment variables instead of literals.
๐ชrelease,apk_file, andipa_filecan 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
endAnd finally ๐
fastlane ios betaAndroid
Optional:
fastlane add_plugin increment_version_codelane :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
)
endAnd finally ๐
fastlane android betaWhat'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.0in theirPluginfileuntil they upgrade Ruby. ExistingGemfile.lockentries stay on 1.0.5 and won't auto-upgrade.
๐ Fixed
fastlane action upload_to_testappio(the help/docs introspection command) no longer crashes withNameError. A typo in the action's metadata was breaking this path โ actual uploads were unaffected; only the introspection command was broken.validate_file_pathno longer raisesTypeErrorwhen only one ofapk_fileoripa_fileis set โ fixes iOS-only and Android-only lanes that didn't pass the other file param.- Uploads no longer fail when
ta-cliwrites warnings or info to stderr โ only realError:lines fail the lane now. --api_tokenis now masked as********infastlane --verboselogs โ previously echoed in plain text.
โจ Improved
- When an upload fails, the actual
ta-clierror 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_tokenorapp_idto source control. - Use
git_release_notes: truefor automatic release notes drawn from your latest commit. Pair with descriptive commit messages. - Enable
notify: trueon 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 pinta-clito a specific version. - Pin to a major version (e.g.
~> 2.0) in yourPluginfileto allow non-breaking fixes while protecting against breaking changes.
Troubleshooting
- Bundler error on install: ensure Ruby
>= 3.0for plugin v2.x. Check withruby -v. If you need Ruby 2.6 / 2.7 compatibility, pin to~> 1.0. - Upload fails with a
ta-clierror: the error message now includes the underlyingta-clioutput so you can see exactly what went wrong (auth, network, provisioning, etc.). Run withfastlane --verbosefor 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_testappiocrashes: 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.
Related articles
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!