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.
Install
fastlane add_plugin testappioThat'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
)
endGet 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
)
endAndroid 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
)
endBoth 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
)
endA 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 testappiofails on Bundler 2.0 issues — make sure your Ruby is 3.0 or higher (ruby -v). -
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 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
- Help center: https://help.testapp.io/
- Community: https://help.testapp.io/faq/join-our-community/
- Bug reports / feature requests: GitHub issues
Built by TestApp.io — happy releasing 🚀