Skip to content

Instantly share code, notes, and snippets.

@Valpertui
Created June 3, 2019 15:34
Show Gist options
  • Save Valpertui/e50559a77e23827b1c44a157d45e7ce8 to your computer and use it in GitHub Desktop.
Save Valpertui/e50559a77e23827b1c44a157d45e7ce8 to your computer and use it in GitHub Desktop.
Fastfile with different schemes and configs
fastlane_require 'xcodeproj'
update_fastlane
default_platform(:ios)
platform :ios do
@xcodeproj = "ProjectName.xcodeproj"
@xcworkspace = "WorkspaceName.xcworkspace"
@target = "TargetName"
@version_number = get_version_number(xcodeproj: @xcodeproj, target: @target)
@default_production_release_config = "AppStore"
@default_production_scheme = "AppStore"
@default_beta_release_config = "Beta"
@default_beta_scheme = "Beta"
@default_staging_release_config = "Staging Release"
@default_staging_scheme = "Staging"
@default_dev_release_config = "Dev Release"
@default_dev_scheme = "Dev"
before_all do |lane, options|
print lane
if lane == :tests
next
end
if git_branch == "master"
UI.user_error!("Fastlane should never run directly on master, please create a release branch")
next
end
ensure_git_status_clean
if lane == :release
xcode_select "/Applications/Xcode.app"
ensure_xcode_version
end
clear_derived_data
cocoapods
end
def tag_name(build_type:, version_number: get_version_number, build_number: get_build_number)
"#{build_type}/#{version_number}/#{build_number}"
end
desc "Push a new production beta build to TestFlight"
lane :beta do |options|
testflight_beta(scheme: @default_production_scheme, configuration: @default_production_release_config)
end
desc "Push a new private beta build to TestFlight"
lane :private_beta do |options|
testflight_beta(scheme: @default_beta_scheme, configuration: @default_beta_release_config)
end
desc "Push a new staging beta build to TestFlight"
lane :staging do |options|
testflight_beta(scheme: @default_staging_scheme, configuration: @default_staging_release_config)
end
desc "Push a new dev beta build to TestFlight"
lane :dev do |options|
testflight_beta(scheme: @default_dev_scheme, configuration: @default_dev_release_config)
end
private_lane :testflight_beta do |options|
configuration = options[:configuration]
remote_build_number = 0
begin
remote_build_number = latest_testflight_build_number(version: @version_number)
rescue
end
bump(remote_build_number: remote_build_number)
build_appstore_app(scheme: options[:scheme], configuration: configuration)
upload_to_testflight(skip_waiting_for_build_processing: true)
upload_symbols(configuration: configuration)
validate_upload
end
lane :release do
configuration = @default_production_release_config
bump(remote_build_number: app_store_build_number(version: @version_number))
build_appstore_app(scheme: @default_production_scheme, configuration: configuration)
add_git_tag(tag: "#{tag_name(build_type: "release", version_number: version_number)}")
upload_to_app_store
upload_symbols(configuration: configuration)
validate_upload
end
# Specific to my project
def upload_symbols(configuration:)
project = Xcodeproj::Project.open("../#{@xcodeproj}")
plistPath = "./XXX/FirebasePlists/" + project.targets.find { |target| target.name == @target }.build_configurations.find { |config| config.name == configuration }.build_settings['FIREBASE_PLIST_NAME'] + ".plist"
upload_symbols_to_crashlytics(dsym_path: "./XXX.app.dSYM.zip", gsp_path: plistPath)
end
def validate_upload
push_to_git_remote
end
def bump(remote_build_number:)
local_build_number = get_build_number(xcodeproj: @xcodeproj)
increment_build_number(xcodeproj: @xcodeproj, build_number: [remote_build_number.to_i, local_build_number.to_i].max + 1)
commit_version_bump(xcodeproj: @xcodeproj, force: true)
end
def build_appstore_app(scheme: @default_production_scheme, configuration: @default_production_release_config)
build_app(workspace: @xcworkspace, scheme: scheme, configuration: configuration, include_bitcode: true, include_symbols: true, export_xcargs: "-allowProvisioningUpdates")
end
lane :tests do |options|
run_all_tests = options[:all] || options == nil
run_logic_tests = run_all_tests || options[:logic]
run_release_build = run_all_tests || options[:release_build]
run_debug_build = run_all_tests || options[:debug_build]
if run_logic_tests
run_tests(workspace: @xcworkspace, scheme: "LogicTests")
end
if run_release_build
run_tests(workspace: @xcworkspace, scheme: "UITestsRelease")
end
if run_debug_build
run_tests(workspace: @xcworkspace, scheme: "UITestsDebug")
end
end
error do |lane, options|
if lane == :tests
next
end
reset_git_repo(skip_clean: true)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment