mirror of
https://github.com/yattee/yattee.git
synced 2026-02-19 17:29:45 +00:00
Without explicit identity, xcodebuild defaults to "iOS Development" which doesn't exist on CI. Set "Apple Distribution" for App Store builds and "Developer ID Application" for notarized builds.
336 lines
9.8 KiB
Ruby
336 lines
9.8 KiB
Ruby
# Yattee v2 Fastlane configuration
|
|
# Single unified "Yattee" scheme, platform selected via destination parameter
|
|
|
|
APP_NAME = ENV['APP_NAME'] || 'Yattee'
|
|
DEVELOPER_KEY_ID = ENV['DEVELOPER_KEY_ID']
|
|
DEVELOPER_KEY_ISSUER_ID = ENV['DEVELOPER_KEY_ISSUER_ID']
|
|
DEVELOPER_KEY_CONTENT = ENV['DEVELOPER_KEY_CONTENT']
|
|
TEAM_ID = ENV['TEAM_ID']
|
|
TEMP_KEYCHAIN_USER = ENV['TEMP_KEYCHAIN_USER']
|
|
TEMP_KEYCHAIN_PASSWORD = ENV['TEMP_KEYCHAIN_PASSWORD']
|
|
DEVELOPER_APP_IDENTIFIER = ENV['DEVELOPER_APP_IDENTIFIER']
|
|
GIT_AUTHORIZATION = ENV['GIT_AUTHORIZATION']
|
|
TESTFLIGHT_EXTERNAL_GROUPS = ENV['TESTFLIGHT_EXTERNAL_GROUPS']
|
|
|
|
XCODEPROJ = "#{APP_NAME}.xcodeproj"
|
|
SCHEME = APP_NAME
|
|
|
|
def delete_temp_keychain(name)
|
|
delete_keychain(
|
|
name: name
|
|
) if File.exist? File.expand_path("~/Library/Keychains/#{name}-db")
|
|
end
|
|
|
|
def create_temp_keychain(name, password)
|
|
create_keychain(
|
|
name: name,
|
|
password: password,
|
|
unlock: false,
|
|
timeout: 0
|
|
)
|
|
end
|
|
|
|
def ensure_temp_keychain(name, password)
|
|
delete_temp_keychain(name)
|
|
create_temp_keychain(name, password)
|
|
end
|
|
|
|
add_extra_platforms(platforms: [:tvos])
|
|
|
|
before_all do
|
|
# Skipping update_fastlane in CI for stability
|
|
end
|
|
|
|
desc "Get latest TestFlight build number across all platforms"
|
|
lane :latest_build_number do
|
|
api_key = app_store_connect_api_key(
|
|
key_id: DEVELOPER_KEY_ID,
|
|
issuer_id: DEVELOPER_KEY_ISSUER_ID,
|
|
key_content: DEVELOPER_KEY_CONTENT,
|
|
is_key_content_base64: true
|
|
)
|
|
|
|
ios_build = latest_testflight_build_number(api_key: api_key, app_identifier: DEVELOPER_APP_IDENTIFIER, platform: "ios")
|
|
tvos_build = latest_testflight_build_number(api_key: api_key, app_identifier: DEVELOPER_APP_IDENTIFIER, platform: "appletvos")
|
|
macos_build = latest_testflight_build_number(api_key: api_key, app_identifier: DEVELOPER_APP_IDENTIFIER, platform: "osx")
|
|
|
|
max_build = [ios_build, tvos_build, macos_build].max
|
|
# Write to repo root (Fastfile is in fastlane/ subdir)
|
|
output_path = File.expand_path("../latest_build_number.txt", __dir__)
|
|
File.write(output_path, max_build.to_s)
|
|
UI.success("Latest TestFlight build number: #{max_build}")
|
|
max_build
|
|
end
|
|
|
|
desc "Bump build number and commit"
|
|
lane :bump_build do
|
|
increment_build_number(xcodeproj: XCODEPROJ)
|
|
|
|
commit_version_bump(
|
|
message: "Bump build number to #{get_build_number(xcodeproj: XCODEPROJ)}",
|
|
xcodeproj: XCODEPROJ
|
|
)
|
|
end
|
|
|
|
desc "Bump version number and commit"
|
|
lane :bump_version do
|
|
increment_version_number(xcodeproj: XCODEPROJ)
|
|
|
|
commit_version_bump(
|
|
message: "Bump version number to #{get_version_number(xcodeproj: XCODEPROJ, target: SCHEME)}",
|
|
xcodeproj: XCODEPROJ
|
|
)
|
|
end
|
|
|
|
platform :ios do
|
|
desc "Push a new beta build to TestFlight"
|
|
lane :beta do
|
|
ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD)
|
|
|
|
api_key = app_store_connect_api_key(
|
|
key_id: DEVELOPER_KEY_ID,
|
|
issuer_id: DEVELOPER_KEY_ISSUER_ID,
|
|
key_content: DEVELOPER_KEY_CONTENT,
|
|
is_key_content_base64: true
|
|
)
|
|
|
|
build = get_build_number(xcodeproj: XCODEPROJ)
|
|
version = get_version_number(
|
|
xcodeproj: XCODEPROJ,
|
|
target: SCHEME
|
|
)
|
|
|
|
match(
|
|
type: 'appstore',
|
|
platform: 'ios',
|
|
app_identifier: ["#{DEVELOPER_APP_IDENTIFIER}", "#{DEVELOPER_APP_IDENTIFIER}.ShareExtension"],
|
|
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
|
|
readonly: true,
|
|
keychain_name: TEMP_KEYCHAIN_USER,
|
|
keychain_password: TEMP_KEYCHAIN_PASSWORD,
|
|
api_key: api_key
|
|
)
|
|
|
|
update_code_signing_settings(
|
|
use_automatic_signing: false,
|
|
path: XCODEPROJ,
|
|
team_id: TEAM_ID,
|
|
code_sign_identity: "Apple Distribution",
|
|
profile_name: "match AppStore #{DEVELOPER_APP_IDENTIFIER}",
|
|
targets: [SCHEME]
|
|
)
|
|
|
|
update_code_signing_settings(
|
|
use_automatic_signing: false,
|
|
path: XCODEPROJ,
|
|
team_id: TEAM_ID,
|
|
code_sign_identity: "Apple Distribution",
|
|
profile_name: "match AppStore #{DEVELOPER_APP_IDENTIFIER}.ShareExtension",
|
|
targets: ["YatteeShareExtension"]
|
|
)
|
|
|
|
build_app(
|
|
scheme: SCHEME,
|
|
destination: "generic/platform=iOS",
|
|
output_directory: "fastlane/builds/#{version}-#{build}/iOS",
|
|
output_name: "#{APP_NAME}-#{version}-iOS.ipa",
|
|
export_options: {
|
|
provisioningProfiles: {
|
|
"#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER}",
|
|
"#{DEVELOPER_APP_IDENTIFIER}.ShareExtension" => "match AppStore #{DEVELOPER_APP_IDENTIFIER}.ShareExtension"
|
|
}
|
|
}
|
|
)
|
|
|
|
changelog_path = File.expand_path('../CHANGELOG.md', __dir__)
|
|
changelog = File.exist?(changelog_path) ? File.read(changelog_path) : ""
|
|
|
|
upload_to_testflight(
|
|
api_key: api_key,
|
|
ipa: lane_context[SharedValues::IPA_OUTPUT_PATH],
|
|
changelog: changelog
|
|
)
|
|
end
|
|
end
|
|
|
|
platform :tvos do
|
|
desc "Push a new beta build to TestFlight"
|
|
lane :beta do
|
|
ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD)
|
|
|
|
api_key = app_store_connect_api_key(
|
|
key_id: DEVELOPER_KEY_ID,
|
|
issuer_id: DEVELOPER_KEY_ISSUER_ID,
|
|
key_content: DEVELOPER_KEY_CONTENT,
|
|
is_key_content_base64: true
|
|
)
|
|
|
|
build = get_build_number(xcodeproj: XCODEPROJ)
|
|
version = get_version_number(
|
|
xcodeproj: XCODEPROJ,
|
|
target: SCHEME
|
|
)
|
|
|
|
match(
|
|
type: 'appstore',
|
|
platform: 'tvos',
|
|
app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
|
|
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
|
|
readonly: true,
|
|
keychain_name: TEMP_KEYCHAIN_USER,
|
|
keychain_password: TEMP_KEYCHAIN_PASSWORD,
|
|
api_key: api_key
|
|
)
|
|
|
|
update_code_signing_settings(
|
|
use_automatic_signing: false,
|
|
path: XCODEPROJ,
|
|
team_id: TEAM_ID,
|
|
code_sign_identity: "Apple Distribution",
|
|
profile_name: "match AppStore #{DEVELOPER_APP_IDENTIFIER} tvos",
|
|
targets: [SCHEME]
|
|
)
|
|
|
|
build_app(
|
|
scheme: SCHEME,
|
|
destination: "generic/platform=tvOS",
|
|
output_directory: "fastlane/builds/#{version}-#{build}/tvOS",
|
|
output_name: "#{APP_NAME}-#{version}-tvOS.ipa",
|
|
export_method: "app-store",
|
|
export_options: {
|
|
provisioningProfiles: {
|
|
"#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER} tvos"
|
|
}
|
|
}
|
|
)
|
|
|
|
changelog_path = File.expand_path('../CHANGELOG.md', __dir__)
|
|
changelog = File.exist?(changelog_path) ? File.read(changelog_path) : ""
|
|
|
|
upload_to_testflight(
|
|
api_key: api_key,
|
|
ipa: lane_context[SharedValues::IPA_OUTPUT_PATH],
|
|
changelog: changelog
|
|
)
|
|
end
|
|
end
|
|
|
|
platform :mac do
|
|
desc "Push a new beta build to TestFlight"
|
|
lane :beta do
|
|
ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD)
|
|
|
|
api_key = app_store_connect_api_key(
|
|
key_id: DEVELOPER_KEY_ID,
|
|
issuer_id: DEVELOPER_KEY_ISSUER_ID,
|
|
key_content: DEVELOPER_KEY_CONTENT,
|
|
is_key_content_base64: true
|
|
)
|
|
|
|
build = get_build_number(xcodeproj: XCODEPROJ)
|
|
version = get_version_number(
|
|
xcodeproj: XCODEPROJ,
|
|
target: SCHEME
|
|
)
|
|
|
|
match(
|
|
type: 'appstore',
|
|
platform: 'macos',
|
|
additional_cert_types: ['mac_installer_distribution'],
|
|
app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
|
|
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
|
|
readonly: true,
|
|
keychain_name: TEMP_KEYCHAIN_USER,
|
|
keychain_password: TEMP_KEYCHAIN_PASSWORD,
|
|
api_key: api_key
|
|
)
|
|
|
|
update_code_signing_settings(
|
|
use_automatic_signing: false,
|
|
path: XCODEPROJ,
|
|
team_id: TEAM_ID,
|
|
code_sign_identity: "Apple Distribution",
|
|
profile_name: "match AppStore #{DEVELOPER_APP_IDENTIFIER} macos",
|
|
targets: [SCHEME]
|
|
)
|
|
|
|
build_mac_app(
|
|
scheme: SCHEME,
|
|
output_directory: "fastlane/builds/#{version}-#{build}/macOS",
|
|
output_name: "#{APP_NAME}-#{version}-macOS.app",
|
|
export_method: "app-store",
|
|
export_options: {
|
|
provisioningProfiles: {
|
|
"#{DEVELOPER_APP_IDENTIFIER}" => "match AppStore #{DEVELOPER_APP_IDENTIFIER} macos"
|
|
}
|
|
}
|
|
)
|
|
|
|
changelog_path = File.expand_path('../CHANGELOG.md', __dir__)
|
|
changelog = File.exist?(changelog_path) ? File.read(changelog_path) : ""
|
|
|
|
upload_to_testflight(
|
|
api_key: api_key,
|
|
pkg: lane_context[SharedValues::PKG_OUTPUT_PATH],
|
|
changelog: changelog
|
|
)
|
|
end
|
|
|
|
desc "Build for Developer ID distribution and notarize"
|
|
lane :build_and_notarize do
|
|
ensure_temp_keychain(TEMP_KEYCHAIN_USER, TEMP_KEYCHAIN_PASSWORD)
|
|
|
|
api_key = app_store_connect_api_key(
|
|
key_id: DEVELOPER_KEY_ID,
|
|
issuer_id: DEVELOPER_KEY_ISSUER_ID,
|
|
key_content: DEVELOPER_KEY_CONTENT,
|
|
is_key_content_base64: true
|
|
)
|
|
|
|
build = get_build_number(xcodeproj: XCODEPROJ)
|
|
version = get_version_number(
|
|
xcodeproj: XCODEPROJ,
|
|
target: SCHEME
|
|
)
|
|
|
|
match(
|
|
type: 'developer_id',
|
|
platform: 'macos',
|
|
app_identifier: "#{DEVELOPER_APP_IDENTIFIER}",
|
|
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
|
|
readonly: true,
|
|
keychain_name: TEMP_KEYCHAIN_USER,
|
|
keychain_password: TEMP_KEYCHAIN_PASSWORD,
|
|
api_key: api_key
|
|
)
|
|
|
|
update_code_signing_settings(
|
|
use_automatic_signing: false,
|
|
path: XCODEPROJ,
|
|
team_id: TEAM_ID,
|
|
code_sign_identity: "Developer ID Application",
|
|
profile_name: "match Direct #{DEVELOPER_APP_IDENTIFIER} macos",
|
|
targets: [SCHEME]
|
|
)
|
|
|
|
build_mac_app(
|
|
scheme: SCHEME,
|
|
output_directory: "fastlane/builds/#{version}-#{build}/macOS",
|
|
output_name: APP_NAME,
|
|
export_method: "developer-id",
|
|
export_options: {
|
|
provisioningProfiles: {
|
|
"#{DEVELOPER_APP_IDENTIFIER}" => "match Direct #{DEVELOPER_APP_IDENTIFIER} macos"
|
|
}
|
|
}
|
|
)
|
|
|
|
notarize(
|
|
package: "fastlane/builds/#{version}-#{build}/macOS/#{APP_NAME}.app",
|
|
bundle_id: "#{DEVELOPER_APP_IDENTIFIER}",
|
|
api_key: api_key,
|
|
print_log: true
|
|
)
|
|
end
|
|
end
|