amplify-swift/fastlane/Fastfile

185 lines
5.4 KiB
Ruby

require 'json'
require_relative './amplify_pods.rb'
opt_out_usage
default_platform(:ios)
PLIST_KEY = "CFBundleShortVersionString"
platform :ios do
before_all do
# Perform a fetch before inferring the next version
# to reduce race conditions with simultaneous pipelines attempting to create the same tag
sh('git', 'fetch', '--tags', '-f')
sh('git', 'fetch')
sh('git', 'status')
end
desc "Create a pre-release version by pushing a tag to GitHub, and pushing pods to CocoaPods"
lane :unstable do
next_version = calculate_next_canary_version
if next_version >= '2.0.0'
UI.message("Received version: #{next_version}, exiting lane because version is larger than 2.0.0")
next
end
UI.message("Releasing unstable version: #{next_version}")
# Increment all specs and plists
increment_versions(version: next_version)
# Create tag and push to origin
add_tag(version: next_version)
# Push to CocoaPods
release_pods()
end
desc "Create a release version by building and committing a changelog, pushing a tag to GitHub, and pushing pods to CocoaPods"
lane :release do
next_version, commits = calculate_next_release_version(version_limit:'v2.0.0')
if next_version >= '2.0.0'
UI.message("Received version: #{next_version}, exiting lane because version is larger than 2.0.0")
next
end
UI.message("Releasing version: #{next_version}")
# Increment all specs and plists
increment_versions(version: next_version)
changelog = build_changelog(version: next_version, commits: commits)
# Commit and push
release_commit(version: next_version)
# Create tag and push to origin
add_tag(version: next_version)
# Push pods
release_pods()
post_release(version: next_version, changelog: changelog)
end
desc "Increment versions"
private_lane :increment_versions do |options|
version = options[:version].to_s
AmplifyPods.pods.each do |pod|
spec, constants, plist_paths = pod.values
UI.message("Incrementing version for #{spec}")
constants.each do |constant|
set_key_value(file: spec, key: constant, value: version)
end
plist_paths.each do |plist_path|
set_info_plist_value(path: plist_path, key: PLIST_KEY, value: version)
end
# One-offs
set_key_value(file: "AmplifyPlugins/Core/AWSPluginsCore/ServiceConfiguration/AmplifyAWSServiceConfiguration.swift", key: "version", value: version)
set_key_value(file: "build-support/dependencies.rb", key: "AMPLIFY_VERSION", value: version)
end
end
desc "Commit and push"
private_lane :release_commit do |options|
next_version = options[:version]
sh('git', 'config', '--global', 'user.email', ENV['GITHUB_EMAIL'])
sh('git', 'config', '--global', 'user.name', ENV['GITHUB_USER'])
commit_message = "chore: release #{next_version} [skip ci]"
sh('git', 'commit', '-am', commit_message)
# push to origin
sh('git', 'push', 'origin', 'release-v1')
end
desc "Tag in git and push to GitHub"
private_lane :add_tag do |options|
next_version = options[:version]
next_tag = "#{next_version}"
add_git_tag(tag: next_tag)
push_git_tags(tag: next_tag)
end
desc "Release pods"
private_lane :release_pods do
# Define `COCOAPODS_TRUNK_TOKEN` env var for trunk authentication
# https://github.com/CocoaPods/cocoapods-trunk/commit/9e6ec1c1faf96fa837dc2ed70b5f54006b181ed6
secret = sh(
command: 'aws secretsmanager get-secret-value --secret-id ${COCOAPODS_SECRET_ARN}',
log: false
)
ENV['COCOAPODS_TRUNK_TOKEN'] = JSON.parse(secret)["SecretString"]
AmplifyPods.pods.each do |pod|
if pod[:no_push]
UI.message "Skipping pushing pod #{pod[:spec]}"
next
end
UI.message "Pushing pod #{pod[:spec]}"
with_retry do
begin
pod_push(path: pod[:spec], allow_warnings: true, synchronous: true)
rescue StandardError => e
raise e unless e.message =~ /Unable to accept duplicate entry/i
UI.important("Version already exists. Ignoring")
end
end
unless pod == AmplifyPods.pods.last
# This shouldn't be necessary... but it is
sh('bundle', 'exec', 'pod', 'repo', 'update')
end
end
end
desc "Post-release"
private_lane :post_release do |options|
version = options[:version].to_s
changelog = options[:changelog]
tag = "#{version}"
plugin_root = File.expand_path("#{ENV['CIRCLE_WORKING_DIRECTORY']}/AmplifyPlugins")
sh('bundle', 'exec', 'swift', 'package', 'update')
sh('bundle', 'exec', 'pod', 'repo', 'update')
# increment plugin lock files by calling pod update on each
AmplifyPods.plugins.each do |plugin|
path = "#{plugin_root}/#{plugin}"
Dir.chdir(path){ sh('pod', 'update') }
end
write_changelog(changelog: changelog, path: 'CHANGELOG.md')
commit_message = "chore: finalize release #{version} [skip ci]"
sh('git', 'commit', '-am', commit_message)
add_git_tag(tag: tag, force: true)
push_git_tags(tag: tag, force: true)
# push to origin
sh('git', 'push', 'origin', 'release-v1')
sh('git', 'push', 'origin', 'release-v1:v1')
end
end
def with_retry(retries=5, wait=60)
begin
yield
rescue StandardError => e
retries -= 1
raise e if retries.zero?
UI.error("Error occurred: #{e}; retrying...")
sleep(wait)
retry
end
end