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.
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 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 🚀