fastlane Tutorial: Getting Started
In this fastlane tutorial, you’ll learn how to provision, screenshot, build and upload an app to the App Store using fastlane. By Lyndsey Scott.
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Sign up/Sign in
With a free Kodeco account you can download source code, track your progress, bookmark, personalise your learner profile and more!
Create accountAlready a member of Kodeco? Sign in
Contents
fastlane Tutorial: Getting Started
30 mins
- Getting Started
- Setting Up fastlane
- The fastlane Toolchain
- Adding fastlane to Your Project
- Creating Your App
- Generating the Deliverfile
- Automating Screenshots
- Creating a Test Target
- Creating the IPA File
- Uploading to App Store Connect
- Putting It All Together
- Supporting Multiple Targets
- Setting Up Multiple Environments
- Where to Go From Here?
Putting It All Together
You now have separate lanes for creating your app, taking screenshots, building and uploading. While you could call them one-by-one, you don’t want to, right?
Oh, no — you want
Open Fastfile. After the upload
lane, add:
desc “Create app, take screenshots, build and upload to App Store"
lane :do_everything do
create_app
screenshot
build
upload
end
Fittingly, do_everything
takes care of everything. :]
Furthermore, to make the lane completely hands-free, open Deliverfile and, at the bottom, add:
force(true)
This causes fastlane to skip screenshot and metadata approval.
Now, to let fastlane do all the heavy lifting, run:
bundle exec fastlane do_everything
Supporting Multiple Targets
See that Multiple_Targets folder in mZone_Sample_Project? Open Multiple_Targets/mZone-2/mZone Poker.xcodeproj in Xcode. This project should look a lot like the first except with two new targets: mZone Poker Pro and mZone Poker Pro UITest.
To switch between running mZone Poker and mZone Poker Pro, click the button immediately to the right of the Run and Stop buttons, then select the scheme of whichever app you wish to run.
Build and run mZone Poker Pro. It’s almost identical to mZone Poker, but returns more detailed suggestions.
On the General page, set mZone Poker’s bundle identifier to the one you created earlier.
Then, set a tentative new bundle ID for mZone Poker Pro; for example:
com.mZone-Poker-Pro.[Insert your email address minus “@” and “.”]
Now, return to Finder. Copy and paste Gemfile and the fastlane directory from mZone into mZone-2. Then, drag mZone-2/fastlane/SnapshotHelper.swift into the new project. When the Choose options for adding these files window appears, select:
- Copy items if needed.
- Create groups.
- mZone Poker UITests.
- mZone Poker Pro UITests.
Then, click Finish.
Setting Up Multiple Environments
Environment (.env) files hold configuration settings that an app may access variably during its execution. For this project, you’ll create two environments — one for each app target.
Open up your favorite text editor, disable smart quotes and enter:
SCHEME = "mZone Poker"
TEST_SCHEME = "mZone Poker UITests"
BUNDLE_IDENTIFIER = "[[YOUR UNIQUE BUNDLE IDENTIFIER]]"
APP_NAME = "[[YOUR UNIQUE APP NAME]]"
This environment holds mZone Poker’s environment scheme, test scheme, bundle identifier and app name. Replace [[YOUR UNIQUE BUNDLE IDENTIFIER]] with mZone Poker’s bundle ID and [[YOUR UNIQUE APP NAME]] with the app’s unique name.
Save the file to mZone-2/fastlane as .env.mZone_Poker (with no file suffix). Since .env variables are hidden files by default, if you can’t see .env.mZone_Poker in Finder, press Shift-Command-. while in Finder to make your hidden files visible.
Similarly, create a second file containing:
SCHEME = "mZone Poker Pro"
TEST_SCHEME = "mZone Poker Pro UITests"
BUNDLE_IDENTIFIER = "[[YOUR UNIQUE BUNDLE IDENTIFIER]]"
APP_NAME = "[[YOUR UNIQUE APP NAME]]"
Replace [[YOUR UNIQUE BUNDLE IDENTIFIER]] mZone Poker Pro’s current bundle ID. Then create a tentative unique app name, ex.:
mZone Poker Pro [Insert your email address minus “@” and “.”]
Remember, app names can’t be longer than 30 characters, so truncate as necessary.
Save the file as .env.mZone_Poker_Pro in the same directory.
Now, you’ll be able to use variables to access the current settings as you switch between schemes.
For starters, open Appfile, uncomment the app_identifier line and replace:
app_identifier("[[APP_IDENTIFIER]]")
With:
app_identifier(ENV['BUNDLE_IDENTIFIER'])
“ENV[‘BUNDLE_IDENTIFIER’]” tells fastlane to grab the bundle ID from whichever you set as the current environment.
In Deliverfile, replace the .ipa line with:
ipa("./fastlane/builds/#{ENV['APP_NAME']}.ipa")
In Gymfile, replace the scheme line with:
scheme(ENV['SCHEME'])
In Snapfile, replace the scheme and output_directory lines with:
scheme(ENV['TEST_SCHEME'])
And:
output_directory "./fastlane/screenshots/#{ENV['SCHEME']}"
Respectively.
Lastly, return to the new metadata directory. Select all of its contents and place them in a new folder named mZone Poker.
Then, duplicate that folder and name that duplicate mZone Poker Pro.
Change the contents of mZone Poker Pro/en-US/name.txt and mZone Poker Pro/fr-FR/name.txt to the new app’s name. Keep all the other metadata the same for now for simplicity’s sake.
Now, to run all the commands for the second target, you can enter:
bundle exec fastlane do_everything --env mZone_Poker_Pro
This will run do_everything
using .env.mZone_Poker_Pro’s variables.
But what if you want to run all the commands for all the targets at once?
Open Fastfile. Below do_everything
, add:
def execute_for_all_envs
# 1
schemeList = Dir.glob(".env.*”)
# 2
schemeList.each do |file|
# 3
Dotenv.overload(file)
# 4
yield
end
end
This method:
- Puts the current directory’s .env. files into an array.
- Loops through each .env file.
- Overloads
ENV
with the current .env file. - Executes the block following
execute_for_all_envs
invocation.
Then, to call execute_for_all_envs
from do_everything
, replace the content of do_everything
with:
if ENV['SCHEME'] != nil
create_app
screenshot
build
upload
else
execute_for_all_envs{ do_everything }
end
Now, if you don’t specify an environment in the command line, ENV[‘SCHEME’] == nil and thus execute_for_all_envs
runs. execute_for_all_envs
sets ENV to the first environment, returns to the calling block, which then re-runs do_everything
.
After do_everything
does everything for that environment, the loop in execute_for_all_envs
continues and returns the next environment, and so on.
That’s it!
Now you can run:
bundle exec fastlane do_everything
To have fastlane do all the heavy lifting for both targets while you sit back and relax.
Caution: It might feel weird having so much time on your hands compared to your pre-fastlane existence, but trust us, you’ll get used to it. :]
Where to Go From Here?
Check out mZone-Final and mZone-Final-2 using the Download Materials button at the top or bottom of the tutorial to see how the final projects stack up compared to yours.
fastlane also supports TestFlight submission and a ton of integrations. You can customize your lanes to provide real-time feedback on Slack, interact with Jira boards, etc. Visit the the official fastlane website to learn more.
Questions or comments? Feel free to join the forum discussion below!