Release a Build via TestFlight

Has anyone had any luck using a combination of workflows to actually release an app build via TestFlight?

I have my builds being uploaded to iTunes Connect but they aren’t getting released to testers automatically.

I’m wondering if maybe fastlane pilot would be a good option, added in after the ipa has been made?

Has anyone tried anything like this?

1 Like

No need for pilot, deliver supports this. All you have to do is:

  1. Use the Deploy to iTunes Connect / TestFlight (with Deliver) step
  2. And make sure to set the step’s Submit for TestFlight External Testing? option to yes

Note: as mentioned in the option’s description, enabling this option can significantly increase the run time of this step, as it’ll have to wait for the uploaded app to be “processed” by iTunes Connect before the version can be enabled for TestFlight beta testing.

I thought it would have been the default way for this to work but when I went into TestFlight external testing on iTunesConnect, the currently set build for testing hadn’t been updated to the new build.

So I had to select a new build for testing (the new build was there to select, and processed), and go through the manual steps to send it out.

Here are some of my logs/configuration. Let me know if you’d like the full build url.

  • SubmitForBeta: yes
  • SkipMetadata: yes
  • SkipScreenshots: yes
  • TeamID:
  • TeamName:
  • Options:
  • UpdateDeliver: yes

fastlane “deliver” “–username” “" “–app” "**” “–ipa” “/Users/vagrant/deploy/*********.ipa” “–skip_screenshots” “–skip_metadata” “–force” “–submit_for_review”

| skip_screenshots | true |
| skip_metadata | true |
| force | true |
| submit_for_review | true |
| app_identifier | com.********.app |
| screenshots_path | ./screenshots |
| metadata_path | ./metadata |
| app_version | 0.31 |
| edit_live | false |
| platform | ios |
| skip_binary_upload | false |
| automatic_release | false |
| overwrite_screenshots | false

[04:17:33]: Selecting build 0.31 (69)…
[04:17:34]: Successfully selected build
[04:17:34]: Submitting the app for review…
[04:17:42]: Successfully submitted the app for review!
Success
The app (.ipa) was successfully uploaded to iTunes Connect, you should see it in the Prerelease section on the app’s iTunes Connect page!
Don’t forget to enable the TestFlight Beta Testing switch on iTunes Connect (on the Prerelease tab of the app) if this is a new version of the app!

Thanks for the logs!

Hmm… This might be a recent change in fastlane deliver, it used to be enough to pass the --submit_for_review flag to enable TestFlight external testing for the build…

We’ll check it on Monday to see if we can figure this out, or if in the meantime you have the time and you can figure out what’s the current way to do this with fastlane tools, just let us know and we’ll update the step ASAP!

From what I can see that’s no longer enough. From the fastlane github page:

“To upload builds to TestFlight check out pilot.”

And from the fastlane pilot github page:

fastlane pilot upload --changelog “Something that is new here”

Would you need to work this pilot command into the existing iTunesConnect step?

Did you try that pilot command? Did that work? I’m not sure that’ll be enough.

You can try these commands locally, if you have fastlane installed on your Mac - you can copy paste the fastlane deliver ... command from the bitrise log, to get started quickly.

Let me know if you can figure out the right fastlane command(s) / combination!

Actually I’ve gone with the entire fastlane step after configuring it all locally. It worked and submitted the build for testing (from local), so assume that Bitrise will be pretty similar. Now to deploy I just use ‘fastlane beta’ which uses gym and match to get the certs in order before uploading and releasing on TestFlight.

That should work of course @AndyDunn

This step is meant to be used in case you don’t want to integrate the whole fastlane configuration into your project, but if you do, you can use fastlane for it instead of this step, of course.

Just a question @AndyDunn - so the step did upload the build and it made it available for TestFlight Internal Testing, the issue was that it did not made it available for External Testing, right?

I don’t think it made it available for internal testing either, because it didn’t seem to actually select the build in anyway. Only upload it for processing and that was it as far as I could tell (I never use internal testing).

1 Like

I tested the current version and it made the new build properly available for Internal Testers, but not for External Testers. Note, I did not start a new version of the app, just pushed a new build (with incremented build number, but same version number), not a new version.

This setup, that the step does not make the app available for External Testers actually makes sense, although might be a limitation / possibility for a future update. External Testing of the build requires a review from Apple, and the build can’t be propagated to External Testers before that review. The review (AFAIK) also requires a couple of mandatory information, e.g. change log, which this step does not require.

Maybe we should note this better for this step, but right now the purpose of this step is to automate the uploading of your builds and the propagation to internal testers. Ideally, once the build is available, your internal testers (QA team) will pick up the build and test it, and you only release it for external testers once the internal test was successful.

Of course, if you don’t have an internal testing team, this might be a limitation, depends on your development workflow.

In any case, thanks for the infos @AndyDunn! :wink:

@viktorbenei
Im facing a similar problem. The Bitrise step uploads a new build to iTC, but Im getting the following error:

[!] The request could not be completed because:
[en-US]: You must detail what’s new in this version in English (U.S.).
Deploy failed, error: exit status 1

If I go manually to iTC and set the what is new text, the problem goes away.

My question is: Is there a way to set the “What is new” text from Bitrise?
I have “Skip Metadata” to false, but I have no idea how to send the metada.

You can follow fastlane deliver’s guide to set-up meta-data uploading: https://github.com/fastlane/fastlane/tree/master/deliver

The what’s new will be ‘release_notes’.

Hope that helps! :slightly_smiling_face:

Is there a way to populate the ‘What to Test’ field in TestFlight?

I have an automated build for my staging and production environments based on the branch commit. I would like to indicate in the field which environment the build is pointing to.

1 Like

You should turn off the skip_metadata option ( https://github.com/bitrise-io/steps-deploy-to-itunesconnect-deliver/blob/master/step.yml#L132 ) and follow the fastlane deliver guide https://docs.fastlane.tools/actions/deliver/ to setup the release_notes (Metadata: Localised release notes for this version).

1 Like

We use fastlane pilot with the distribute_external and changelog parameters to submit TestFlight betas to external testers almost every day and it usually works great. However, we occasionally run into issues with BitRise and the amount of time it takes to process the binary on iTunesConnect. Occasionally that exceeds BitRise’s 75 minute timeout and BitRise aborts the build.

@jeffremer sure, no problem at all! Please ping our support via the on-site chat, we’re happy to bump your build time :wink:

P.S.: if you’d have some time the setup you mentioned seems interesting - would you mind sharing it there? Just the related part of the bitrise.yml or similar, I think that could help a ton of iOS developers :slight_smile:

@viktorbenei Hi, sorry for bumping the thread, ATM the step no longer include Submit for TestFlight External Testing, both with and without application loader. Is there anyway to also submit for external group? Or I have to use fastlane?

2 Likes

Hi @tien.vu.nano! :wave: It would appear that since this thread was active, the Notify External Testers function of deliver has been moved over to pilot. So in this case, you’d unfortunately have to use a Fastlane or Script step to trigger pilot, which does have that option available according to the fastlane docs. Not as neat as having everything done via our step, but it should get the job done. :smile:

1 Like