stripe-ios/fastlane/Fastfile

358 lines
10 KiB
Ruby
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
# https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
# https://docs.fastlane.tools/plugins/available-plugins
#
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:ios)
# The .env variable name to lookup our the URL to our Slack webhook
SLACK_URL_ENV_VAR = "SLACK_URL"
# You must invoke fastlane with the app:X parameter which maps to one
# of the apps so we know which to build.
#
# Adding to this list?
# * Run `fastlane docs` to regenerate the README.
# * Instructions: https://confluence.corp.stripe.com/pages/viewpage.action?pageId=279069568
APPS = {
# NOTE(mludowise): The following is commented out because the identity example
# app only exists on the `identity-beta` branch.
#
# To add a different example app to TestFlight, duplicate and update the entry
# below.
#
# "identity_example" => {
# # Describes the use of this app. This will be included in the ./fastlane/README.md
# "description" => "Demonstrates capabilities of IdentityVerificationSheet",
# # Path to project
# "project" => "./Example/IdentityVerification Example/IdentityVerification Example.xcodeproj",
# # Bundle identifier for this app. This must be registered in App Store Connect before uploading via fastlane.
# "identifier" => "com.stripe.example.IdentityVerification-Example",
# # Name of the run scheme
# "scheme" => "IdentityVerification Example",
# # Will be used in the git tag for this version (e.g. 'build-2-identity_example')
# "tag_postfix" => "identity_example",
# }
}
platform :ios do
use_cache = false
before_all do
setup_circle_ci
end
desc "Generate new localized screenshots"
lane :screenshots do
capture_screenshots(workspace: "Stripe.xcworkspace", scheme: "LocalizationTester")
end
lane :all_ci do
ci_builds
main_tests
ui_apps_analyze_tests
install_tests
paymentsheet_tests
basic_integration_tests
linting_tests
ui_tests
legacy_tests_11
legacy_tests_12
end
lane :linting_tests do
preflight
check_docs
builds
analyze
end
lane :install_tests do
install_cocoapods_without_frameworks_objc
installation_cocoapods_frameworks_objc
installation_cocoapods_frameworks_swift
installation_carthage
installation_spm
end
lane :preflight do
Dir.chdir("..") do
sh("./ci_scripts/check_version.rb")
sh("./ci_scripts/check_for_new_localized_strings.sh")
end
end
lane :ci_builds do
Dir.chdir("..") do
sh("rm -rf build-ci-tests")
sh("./ci_scripts/test.rb --build-only --scheme StripeiOS")
sh("./ci_scripts/test.rb --build-only --scheme 'Basic Integration'")
sh("./ci_scripts/test.rb --build-only --scheme 'IntegrationTester'")
sh("./ci_scripts/test.rb --build-only --scheme 'LocalizationTester'")
sh("./ci_scripts/test.rb --build-only --scheme 'PaymentSheet Example'")
end
end
lane :main_tests do
Dir.chdir("..") do
sh("./ci_scripts/test.rb --scheme StripeiOS --device 'iPhone 8' --version 13.7")
end
end
lane :paymentsheet_tests do
Dir.chdir("..") do
sh("./ci_scripts/test.rb --scheme 'PaymentSheet Example' --device 'iPhone 12' --version 14.2")
end
end
lane :basic_integration_tests do
Dir.chdir("..") do
sh("./ci_scripts/test.rb --scheme 'Basic Integration' --device 'iPhone 11' --version 13.7")
end
end
lane :integration_all do
Dir.chdir("..") do
sh("./ci_scripts/test.rb --scheme 'IntegrationTester' --device 'iPhone 12 Pro Max' --version 14.2")
sh("./ci_scripts/test.rb --scheme 'IntegrationTester' --device 'iPhone 8' --version 14.2")
end
end
lane :ui_tests do
Dir.chdir("..") do
sh("./ci_scripts/test.rb --scheme 'LocalizationTester' --device 'iPhone 8' --version 13.7")
end
end
lane :legacy_tests_11 do
Dir.chdir("..") do
sh("./ci_scripts/test.rb --scheme 'StripeiOS' --device 'iPhone 6' --version 11.4 --skip-snapshot-tests")
end
end
lane :legacy_tests_12 do
Dir.chdir("..") do
sh("./ci_scripts/test.rb --scheme 'StripeiOS' --device 'iPhone 6' --version 12.4 --skip-snapshot-tests")
end
end
lane :e2e_only do
Dir.chdir("..") do
sh("./ci_scripts/test.rb --scheme 'StripeiOS' --device 'iPhone 8' --version 13.7 --only-test 'StripeiOS Tests/STPE2ETest'")
end
end
lane :analyze do
Dir.chdir("..") do
sh("./ci_scripts/run_analyzer.sh")
end
end
lane :builds do
Dir.chdir("..") do
sh("./ci_scripts/run_builds.sh")
end
end
lane :install_cocoapods_without_frameworks_objc do
Dir.chdir("..") do
sh("./Tests/installation_tests/cocoapods/without_frameworks_objc/test.sh")
end
end
lane :installation_cocoapods_frameworks_objc do
Dir.chdir("..") do
sh("./Tests/installation_tests/cocoapods/with_frameworks_objc/test.sh")
end
end
lane :installation_cocoapods_frameworks_swift do
Dir.chdir("..") do
sh("./Tests/installation_tests/cocoapods/with_frameworks_swift/test.sh")
end
end
lane :installation_carthage do
Dir.chdir("..") do
sh("./Tests/installation_tests/carthage/test.sh")
end
end
lane :installation_spm do
Dir.chdir("..") do
sh("./Tests/installation_tests/swift_package_manager/test.sh")
end
end
lane :check_docs do
Dir.chdir("..") do
sh("./ci_scripts/check_documentation.sh")
end
end
lane :tests do
run_tests(scheme: "StripeiOS",
devices: ["iPhone 8"])
end
desc """
Submit a new build to TestFlight.
#### Example:
```fastlane ios store app:identity_example username:mludowise@stripe.com```
#### Options:
| Argument | Description | Expected Value |
| -------- | ----------- | -------------- |
| `app` | The app to build and submit (required). | <ul>#{APPS.map {|key, app| "<li>`#{key}` #{app["description"]}</li>"}.join()}</ul> |
| `username` | Your Apple Developer username (required). | {{youruser}}@stripe.com |
"""
lane :store do |options|
app = get_app_from_options(options)
username = get_username_from_options(options)
# Get slack url
slack_url = get_slack_url()
match(app_identifier: app["identifier"], username: username)
echo(message: "")
echo(message: "👋 Running push_to_git_remote to ensure push of tags later will succeed")
echo(message: "If this step fails, you may have local commits on a protected branch.")
echo(message: "Either get that merged or move to a non-protected branch.")
echo(message: "")
push_to_git_remote
# Before we start committing version bumps, what was the last commit & branch name
target_commit = last_git_commit
target_branch = git_branch
version = get_version_number(xcodeproj: app["project"])
target_build_number = latest_testflight_build_number(app_identifier: app["identifier"], username: username) + 1
increment_build_number(
build_number: target_build_number,
xcodeproj: app["project"]
)
# gym builds, packages, and signs the ipa file
gym(
configuration: "Release",
scheme: app["scheme"],
disable_xcpretty: true
)
# pilot submits the ipa to testflight
pilot(
app_identifier: app["identifier"],
skip_submission: true,
distribute_external: false,
skip_waiting_for_build_processing: true,
username: username
)
# Make sure our directory is clean, except for changes Fastlane has made
clean_build_artifacts
# We had previously verified we had a clean git status before running fastlane match.
# Fastlane made the branch dirty, so let's clean up after ourselves here.
sh("git", "checkout", "--", ".")
# ex tag: fastlane-tag/store/v1.0/build-39-identity_example
add_git_tag(
grouping: "fastlane-tag",
prefix: "v#{version}/build-",
postfix: "-#{app["tag_postfix"]}",
)
push_to_git_remote
slack(
slack_url: slack_url,
pretext: 'New TestFlight Submission:',
message: "App Store #{app["scheme"]} v#{version} build #{target_build_number}",
channel: '#mobile-team',
fail_on_error: false,
default_payloads: [
],
payload: {
'Build Date': Time.new.to_s,
'Submitted by': ENV["USER"],
'Last Git Commit': target_commit[:message],
'Last Commit Hash': target_commit[:abbreviated_commit_hash],
'Branch': target_branch,
}
)
end
desc """
Test building the way we do for TestFlight submission. No submissions made.
#### Example:
```fastlane ios test_store app:identity_example username:mludowise@stripe.com```
#### Options:
| Argument | Description | Expected Value |
| -------- | ----------- | -------------- |
| `app` | The app to build and submit (required). | <ul>#{APPS.map {|key, app| "<li>`#{key}` #{app["description"]}</li>"}.join()}</ul> |
| `username` | Your Apple Developer username (required). | {{youruser}}@stripe.com |
"""
lane :store_test do |options|
app = get_app_from_options(options)
username = get_username_from_options(options)
match(app_identifier: app["identifier"], username: username)
target_build_number = latest_testflight_build_number(app_identifier: app["identifier"], username: username) + 1
UI.important("If you had run `fastlane ios store`, we'd be submitting this to Testflight as build '#{target_build_number}'")
gym(
configuration: "Release",
scheme: app["scheme"],
disable_xcpretty: true
)
end
end
def get_app_from_options(options)
app = APPS[options[:app]]
if not options[:app] then
UI.abort_with_message!("Missing `app` argument. Please specify `app:{{your_app_id}}`.")
end
if not app then
UI.abort_with_message!("Unrecognized app `#{options[:app]}`.")
end
return app
end
def get_username_from_options(options)
username = options[:username]
if not username then
UI.abort_with_message!("Missing `username` argument. Please specify `username:{{your_user}}@stripe.com`.")
end
return username
end
def get_slack_url()
# Attempt to retreive slack url from .env
slack_url = ENV[SLACK_URL_ENV_VAR]
# If there's no slack URL saved in .env, then error
if not slack_url then
UI.abort_with_message!("Missing definition for #{SLACK_URL_ENV_VAR} in .env. Follow go/mobile/sdk-fastlane-env to setup your .env.")
end
return slack_url
end