Files
EA 9d02421f08 Extract whole app codebase to WalletCore package
- remove dependency of Widget and Intent extensions from app codebase
2026-05-29 17:48:52 +06:00

202 lines
5.0 KiB
Ruby

default_platform(:ios)
APP_ID = ENV["APP_ID"]
TEMP_KEYCHAIN_USER = ENV["TEMP_KEYCHAIN_USER"]
TEMP_KEYCHAIN_PASSWORD = ENV["TEMP_KEYCHAIN_PASSWORD"]
APPLE_ISSUER_ID = ENV["APPLE_ISSUER_ID"]
APPLE_KEY_ID = ENV["APPLE_KEY_ID"]
APPLE_KEY_CONTENT = ENV["APPLE_KEY_CONTENT"]
GIT_AUTHORIZATION = ENV["GIT_AUTHORIZATION"]
TEAM_ID = "HC4MCAXJ66"
WORKSPACE = "Wallet.xcworkspace"
XCODEPROJ = "./Unstoppable/Unstoppable.xcodeproj"
XCCONFIG_PATH = "Unstoppable/Unstoppable/Configuration/Config.xcconfig"
BASE_APP_ID = "io.horizontalsystems.bank-wallet"
PROD_APP_IDS = [
BASE_APP_ID,
"#{BASE_APP_ID}.widget",
"#{BASE_APP_ID}.intent"
].freeze
DEV_APP_IDS = [
"#{BASE_APP_ID}.dev",
"#{BASE_APP_ID}.dev.widget",
"#{BASE_APP_ID}.dev.intent"
].freeze
ALL_APP_IDS = (PROD_APP_IDS + DEV_APP_IDS).freeze
MATCH_TYPE_PROFILE_NAMES = {
'development' => 'Development',
'adhoc' => 'AdHoc',
'appstore' => 'AppStore'
}.freeze
XCCONFIG_KEYS = %w[
ARBISCAN_API_KEYS
BASESCAN_API_KEYS
BSCSCAN_API_KEYS
CHAINALYSIS_API_KEY
DEFIYIELD_API_KEY
ERA_ZKSYNC_API_KEYS
ETHERSCAN_API_KEYS
FTMSCAN_API_KEYS
GNOSISSCAN_API_KEYS
HASHDIT_API_KEY
HS_PROVIDER_API_KEY
JUPITER_API_KEY
MERKLE_API_PATH
ONE_INCH_API_KEY
OPEN_SEA_API_KEY
OPTIMISM_ETHERSCAN_API_KEYS
POLYGONSCAN_API_KEYS
SNOWTRACE_API_KEYS
SOLANA_ALCHEMY_API_KEYS
TRONGRID_API_KEYS
TWITTER_BEARER_TOKEN
UNSTOPPABLE_DOMAINS_API_KEY
USWAP_API_KEY
WALLET_CONNECT_V2_PROJECT_KEY
MAYA_AFFILIATE
MAYA_AFFILIATE_BPS
ONE_INCH_COMMISSION
ONE_INCH_COMMISSION_ADDRESS
THORCHAIN_AFFILIATE
THORCHAIN_AFFILIATE_BPS
].freeze
def with_temp_keychain
name = TEMP_KEYCHAIN_USER
delete_temp_keychain(name)
create_keychain(name: name, password: TEMP_KEYCHAIN_PASSWORD, unlock: false, timeout: 0)
yield name
ensure
delete_temp_keychain(name) if name
end
def delete_temp_keychain(name)
delete_keychain(name: name) if File.exist?(File.expand_path("~/Library/Keychains/#{name}-db"))
end
def app_store_api_key
app_store_connect_api_key(
key_id: APPLE_KEY_ID,
issuer_id: APPLE_ISSUER_ID,
key_content: APPLE_KEY_CONTENT,
duration: 1200,
in_house: false
)
end
def apply_xcconfig
template_path = XCCONFIG_PATH.sub(/Config\.xcconfig\z/, 'Config.template.xcconfig')
sh("cp ../#{template_path} ../#{XCCONFIG_PATH}")
XCCONFIG_KEYS.each do |key|
update_xcconfig_value(path: XCCONFIG_PATH, name: key, value: ENV["XCCONFIG_#{key}"])
end
end
def provisioning_profiles_for(app_ids, match_type)
profile_name = MATCH_TYPE_PROFILE_NAMES.fetch(match_type)
app_ids.map { |id| [id, "match #{profile_name} #{id}"] }.to_h
end
def build_and_sign(match_type:, export_method:, app_ids:, scheme:, keychain_name:, icloud_env:)
apply_xcconfig
increment_build_number(build_number: ENV['BUILD_NUMBER'], xcodeproj: XCODEPROJ)
match(
type: match_type,
app_identifier: app_ids,
git_basic_authorization: Base64.strict_encode64(GIT_AUTHORIZATION),
readonly: true,
keychain_name: keychain_name,
keychain_password: TEMP_KEYCHAIN_PASSWORD,
api_key: app_store_api_key
)
gym(
workspace: WORKSPACE,
scheme: scheme,
export_method: export_method,
clean: true,
include_symbols: true,
export_options: {
compileBitcode: false,
iCloudContainerEnvironment: icloud_env,
provisioningProfiles: provisioning_profiles_for(app_ids, match_type)
}
)
end
def run_match(type:, options: {})
app_ids = type == 'appstore' ? PROD_APP_IDS : ALL_APP_IDS
match(app_identifier: app_ids, type: type, **options)
end
platform :ios do
lane :dev do
with_temp_keychain do |keychain_name|
build_and_sign(
match_type: 'adhoc',
export_method: 'ad-hoc',
app_ids: DEV_APP_IDS,
scheme: 'Development',
icloud_env: 'Development',
keychain_name: keychain_name
)
firebase_app_distribution(
app: "1:407994911754:ios:8bdd4910f96ecaee69e3f3",
groups: "dev-testers",
release_notes: last_git_commit[:message],
service_credentials_json_data: ENV["FIREBASE_CREDENTIALS"]
)
end
end
lane :release do
with_temp_keychain do |keychain_name|
build_and_sign(
match_type: 'appstore',
export_method: 'app-store',
app_ids: PROD_APP_IDS,
scheme: 'Production',
icloud_env: 'Production',
keychain_name: keychain_name
)
pilot(
apple_id: APP_ID,
app_identifier: BASE_APP_ID,
skip_waiting_for_build_processing: true,
skip_submission: true,
distribute_external: false,
notify_external_testers: false
)
end
end
lane :match_readonly do
%w[development adhoc appstore].each do |type|
run_match(type: type, options: { readonly: true })
end
end
lane :match_generate do |options|
base = { username: options[:username], team_id: TEAM_ID }
%w[development adhoc].each do |type|
run_match(type: type, options: base.merge(force_for_new_devices: true))
end
run_match(type: 'appstore', options: base)
end
end