fastlane_hotfix 2.165.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +1 -0
- data/LICENSE +21 -0
- data/README.md +208 -0
- data/bin/bin-proxy +19 -0
- data/bin/fastlane +23 -0
- data/cert/README.md +17 -0
- data/cert/lib/cert.rb +4 -0
- data/cert/lib/cert/commands_generator.rb +60 -0
- data/cert/lib/cert/module.rb +16 -0
- data/cert/lib/cert/options.rb +132 -0
- data/cert/lib/cert/runner.rb +239 -0
- data/credentials_manager/README.md +64 -0
- data/credentials_manager/lib/credentials_manager.rb +7 -0
- data/credentials_manager/lib/credentials_manager/account_manager.rb +157 -0
- data/credentials_manager/lib/credentials_manager/appfile_config.rb +196 -0
- data/credentials_manager/lib/credentials_manager/cli.rb +69 -0
- data/deliver/README.md +17 -0
- data/deliver/lib/assets/DeliverfileDefault +3 -0
- data/deliver/lib/assets/DeliverfileDefault.swift +13 -0
- data/deliver/lib/assets/ScreenshotsHelp +7 -0
- data/deliver/lib/assets/summary.html.erb +299 -0
- data/deliver/lib/deliver.rb +15 -0
- data/deliver/lib/deliver/app_screenshot.rb +354 -0
- data/deliver/lib/deliver/app_screenshot_iterator.rb +95 -0
- data/deliver/lib/deliver/commands_generator.rb +190 -0
- data/deliver/lib/deliver/detect_values.rb +102 -0
- data/deliver/lib/deliver/download_screenshots.rb +76 -0
- data/deliver/lib/deliver/generate_summary.rb +13 -0
- data/deliver/lib/deliver/html_generator.rb +78 -0
- data/deliver/lib/deliver/languages.rb +7 -0
- data/deliver/lib/deliver/loader.rb +55 -0
- data/deliver/lib/deliver/module.rb +18 -0
- data/deliver/lib/deliver/options.rb +465 -0
- data/deliver/lib/deliver/queue_worker.rb +49 -0
- data/deliver/lib/deliver/runner.rb +233 -0
- data/deliver/lib/deliver/setup.rb +199 -0
- data/deliver/lib/deliver/submit_for_review.rb +214 -0
- data/deliver/lib/deliver/upload_metadata.rb +688 -0
- data/deliver/lib/deliver/upload_price_tier.rb +40 -0
- data/deliver/lib/deliver/upload_screenshots.rb +333 -0
- data/fastlane/README.md +11 -0
- data/fastlane/lib/assets/ActionDetails.md.erb +106 -0
- data/fastlane/lib/assets/Actions.md.erb +43 -0
- data/fastlane/lib/assets/AppfileTemplate +6 -0
- data/fastlane/lib/assets/AppfileTemplate.swift +7 -0
- data/fastlane/lib/assets/AppfileTemplateAndroid +2 -0
- data/fastlane/lib/assets/DefaultFastfileTemplate +20 -0
- data/fastlane/lib/assets/DefaultFastfileTemplate.swift +13 -0
- data/fastlane/lib/assets/completions/completion.bash +23 -0
- data/fastlane/lib/assets/completions/completion.fish +39 -0
- data/fastlane/lib/assets/completions/completion.sh +12 -0
- data/fastlane/lib/assets/completions/completion.zsh +23 -0
- data/fastlane/lib/assets/custom_action_template.rb +82 -0
- data/fastlane/lib/assets/mailgun_html_template.erb +142 -0
- data/fastlane/lib/assets/report_template.xml.erb +15 -0
- data/fastlane/lib/assets/s3_html_template.erb +105 -0
- data/fastlane/lib/assets/s3_plist_template.erb +31 -0
- data/fastlane/lib/assets/s3_version_template.erb +4 -0
- data/fastlane/lib/fastlane.rb +53 -0
- data/fastlane/lib/fastlane/action.rb +198 -0
- data/fastlane/lib/fastlane/action_collector.rb +35 -0
- data/fastlane/lib/fastlane/actions/README.md +5 -0
- data/fastlane/lib/fastlane/actions/actions_helper.rb +185 -0
- data/fastlane/lib/fastlane/actions/adb.rb +78 -0
- data/fastlane/lib/fastlane/actions/adb_devices.rb +71 -0
- data/fastlane/lib/fastlane/actions/add_extra_platforms.rb +45 -0
- data/fastlane/lib/fastlane/actions/add_git_tag.rb +122 -0
- data/fastlane/lib/fastlane/actions/app_store_build_number.rb +249 -0
- data/fastlane/lib/fastlane/actions/app_store_connect_api_key.rb +134 -0
- data/fastlane/lib/fastlane/actions/appaloosa.rb +266 -0
- data/fastlane/lib/fastlane/actions/appetize.rb +188 -0
- data/fastlane/lib/fastlane/actions/appetize_viewing_url_generator.rb +146 -0
- data/fastlane/lib/fastlane/actions/appium.rb +206 -0
- data/fastlane/lib/fastlane/actions/appledoc.rb +226 -0
- data/fastlane/lib/fastlane/actions/appstore.rb +14 -0
- data/fastlane/lib/fastlane/actions/apteligent.rb +105 -0
- data/fastlane/lib/fastlane/actions/artifactory.rb +157 -0
- data/fastlane/lib/fastlane/actions/automatic_code_signing.rb +226 -0
- data/fastlane/lib/fastlane/actions/backup_file.rb +41 -0
- data/fastlane/lib/fastlane/actions/backup_xcarchive.rb +135 -0
- data/fastlane/lib/fastlane/actions/badge.rb +155 -0
- data/fastlane/lib/fastlane/actions/build_and_upload_to_appetize.rb +107 -0
- data/fastlane/lib/fastlane/actions/build_android_app.rb +14 -0
- data/fastlane/lib/fastlane/actions/build_app.rb +165 -0
- data/fastlane/lib/fastlane/actions/build_ios_app.rb +47 -0
- data/fastlane/lib/fastlane/actions/build_mac_app.rb +46 -0
- data/fastlane/lib/fastlane/actions/bundle_install.rb +156 -0
- data/fastlane/lib/fastlane/actions/capture_android_screenshots.rb +63 -0
- data/fastlane/lib/fastlane/actions/capture_ios_screenshots.rb +61 -0
- data/fastlane/lib/fastlane/actions/capture_screenshots.rb +14 -0
- data/fastlane/lib/fastlane/actions/carthage.rb +230 -0
- data/fastlane/lib/fastlane/actions/cert.rb +14 -0
- data/fastlane/lib/fastlane/actions/changelog_from_git_commits.rb +197 -0
- data/fastlane/lib/fastlane/actions/chatwork.rb +94 -0
- data/fastlane/lib/fastlane/actions/check_app_store_metadata.rb +54 -0
- data/fastlane/lib/fastlane/actions/clean_build_artifacts.rb +72 -0
- data/fastlane/lib/fastlane/actions/clean_cocoapods_cache.rb +52 -0
- data/fastlane/lib/fastlane/actions/clear_derived_data.rb +70 -0
- data/fastlane/lib/fastlane/actions/clipboard.rb +52 -0
- data/fastlane/lib/fastlane/actions/cloc.rb +89 -0
- data/fastlane/lib/fastlane/actions/cocoapods.rb +170 -0
- data/fastlane/lib/fastlane/actions/commit_github_file.rb +186 -0
- data/fastlane/lib/fastlane/actions/commit_version_bump.rb +301 -0
- data/fastlane/lib/fastlane/actions/copy_artifacts.rb +114 -0
- data/fastlane/lib/fastlane/actions/crashlytics.rb +211 -0
- data/fastlane/lib/fastlane/actions/create_app_on_managed_play_store.rb +174 -0
- data/fastlane/lib/fastlane/actions/create_app_online.rb +75 -0
- data/fastlane/lib/fastlane/actions/create_keychain.rb +177 -0
- data/fastlane/lib/fastlane/actions/create_pull_request.rb +265 -0
- data/fastlane/lib/fastlane/actions/danger.rb +131 -0
- data/fastlane/lib/fastlane/actions/debug.rb +32 -0
- data/fastlane/lib/fastlane/actions/default_platform.rb +47 -0
- data/fastlane/lib/fastlane/actions/delete_keychain.rb +68 -0
- data/fastlane/lib/fastlane/actions/deliver.rb +14 -0
- data/fastlane/lib/fastlane/actions/deploygate.rb +210 -0
- data/fastlane/lib/fastlane/actions/device_grid/README.md +157 -0
- data/fastlane/lib/fastlane/actions/docs/build_app.md +245 -0
- data/fastlane/lib/fastlane/actions/docs/capture_android_screenshots.md +333 -0
- data/fastlane/lib/fastlane/actions/docs/capture_ios_screenshots.md +371 -0
- data/fastlane/lib/fastlane/actions/docs/check_app_store_metadata.md +103 -0
- data/fastlane/lib/fastlane/actions/docs/create_app_online.md +282 -0
- data/fastlane/lib/fastlane/actions/docs/frame_screenshots.md +349 -0
- data/fastlane/lib/fastlane/actions/docs/get_certificates.md +86 -0
- data/fastlane/lib/fastlane/actions/docs/get_provisioning_profile.md +223 -0
- data/fastlane/lib/fastlane/actions/docs/get_push_certificate.md +134 -0
- data/fastlane/lib/fastlane/actions/docs/run_tests.md +151 -0
- data/fastlane/lib/fastlane/actions/docs/sync_code_signing.md +573 -0
- data/fastlane/lib/fastlane/actions/docs/upload_to_app_store.md.erb +725 -0
- data/fastlane/lib/fastlane/actions/docs/upload_to_play_store.md +203 -0
- data/fastlane/lib/fastlane/actions/docs/upload_to_testflight.md +250 -0
- data/fastlane/lib/fastlane/actions/dotgpg_environment.rb +57 -0
- data/fastlane/lib/fastlane/actions/download.rb +76 -0
- data/fastlane/lib/fastlane/actions/download_dsyms.rb +369 -0
- data/fastlane/lib/fastlane/actions/download_from_play_store.rb +61 -0
- data/fastlane/lib/fastlane/actions/dsym_zip.rb +93 -0
- data/fastlane/lib/fastlane/actions/echo.rb +14 -0
- data/fastlane/lib/fastlane/actions/ensure_bundle_exec.rb +59 -0
- data/fastlane/lib/fastlane/actions/ensure_env_vars.rb +58 -0
- data/fastlane/lib/fastlane/actions/ensure_git_branch.rb +69 -0
- data/fastlane/lib/fastlane/actions/ensure_git_status_clean.rb +92 -0
- data/fastlane/lib/fastlane/actions/ensure_no_debug_code.rb +135 -0
- data/fastlane/lib/fastlane/actions/ensure_xcode_version.rb +125 -0
- data/fastlane/lib/fastlane/actions/environment_variable.rb +77 -0
- data/fastlane/lib/fastlane/actions/erb.rb +96 -0
- data/fastlane/lib/fastlane/actions/fastlane_version.rb +15 -0
- data/fastlane/lib/fastlane/actions/flock.rb +82 -0
- data/fastlane/lib/fastlane/actions/frame_screenshots.rb +64 -0
- data/fastlane/lib/fastlane/actions/frameit.rb +14 -0
- data/fastlane/lib/fastlane/actions/gcovr.rb +163 -0
- data/fastlane/lib/fastlane/actions/get_build_number.rb +106 -0
- data/fastlane/lib/fastlane/actions/get_build_number_repository.rb +120 -0
- data/fastlane/lib/fastlane/actions/get_certificates.rb +77 -0
- data/fastlane/lib/fastlane/actions/get_github_release.rb +166 -0
- data/fastlane/lib/fastlane/actions/get_info_plist_value.rb +78 -0
- data/fastlane/lib/fastlane/actions/get_ipa_info_plist_value.rb +82 -0
- data/fastlane/lib/fastlane/actions/get_managed_play_store_publishing_rights.rb +120 -0
- data/fastlane/lib/fastlane/actions/get_provisioning_profile.rb +101 -0
- data/fastlane/lib/fastlane/actions/get_push_certificate.rb +87 -0
- data/fastlane/lib/fastlane/actions/get_version_number.rb +200 -0
- data/fastlane/lib/fastlane/actions/git_add.rb +93 -0
- data/fastlane/lib/fastlane/actions/git_branch.rb +61 -0
- data/fastlane/lib/fastlane/actions/git_commit.rb +80 -0
- data/fastlane/lib/fastlane/actions/git_pull.rb +64 -0
- data/fastlane/lib/fastlane/actions/git_submodule_update.rb +52 -0
- data/fastlane/lib/fastlane/actions/git_tag_exists.rb +74 -0
- data/fastlane/lib/fastlane/actions/github_api.rb +262 -0
- data/fastlane/lib/fastlane/actions/google_play_track_release_names.rb +74 -0
- data/fastlane/lib/fastlane/actions/google_play_track_version_codes.rb +77 -0
- data/fastlane/lib/fastlane/actions/gradle.rb +329 -0
- data/fastlane/lib/fastlane/actions/gym.rb +10 -0
- data/fastlane/lib/fastlane/actions/hg_add_tag.rb +48 -0
- data/fastlane/lib/fastlane/actions/hg_commit_version_bump.rb +183 -0
- data/fastlane/lib/fastlane/actions/hg_ensure_clean_status.rb +53 -0
- data/fastlane/lib/fastlane/actions/hg_push.rb +64 -0
- data/fastlane/lib/fastlane/actions/hipchat.rb +200 -0
- data/fastlane/lib/fastlane/actions/hockey.rb +406 -0
- data/fastlane/lib/fastlane/actions/ifttt.rb +96 -0
- data/fastlane/lib/fastlane/actions/import.rb +49 -0
- data/fastlane/lib/fastlane/actions/import_certificate.rb +77 -0
- data/fastlane/lib/fastlane/actions/import_from_git.rb +83 -0
- data/fastlane/lib/fastlane/actions/increment_build_number.rb +117 -0
- data/fastlane/lib/fastlane/actions/increment_version_number.rb +180 -0
- data/fastlane/lib/fastlane/actions/install_on_device.rb +95 -0
- data/fastlane/lib/fastlane/actions/install_provisioning_profile.rb +58 -0
- data/fastlane/lib/fastlane/actions/install_xcode_plugin.rb +91 -0
- data/fastlane/lib/fastlane/actions/installr.rb +132 -0
- data/fastlane/lib/fastlane/actions/ipa.rb +246 -0
- data/fastlane/lib/fastlane/actions/is_ci.rb +51 -0
- data/fastlane/lib/fastlane/actions/jazzy.rb +56 -0
- data/fastlane/lib/fastlane/actions/jira.rb +115 -0
- data/fastlane/lib/fastlane/actions/lane_context.rb +60 -0
- data/fastlane/lib/fastlane/actions/last_git_commit.rb +58 -0
- data/fastlane/lib/fastlane/actions/last_git_tag.rb +60 -0
- data/fastlane/lib/fastlane/actions/latest_testflight_build_number.rb +155 -0
- data/fastlane/lib/fastlane/actions/lcov.rb +102 -0
- data/fastlane/lib/fastlane/actions/mailgun.rb +197 -0
- data/fastlane/lib/fastlane/actions/make_changelog_from_jenkins.rb +81 -0
- data/fastlane/lib/fastlane/actions/match.rb +14 -0
- data/fastlane/lib/fastlane/actions/min_fastlane_version.rb +57 -0
- data/fastlane/lib/fastlane/actions/modify_services.rb +173 -0
- data/fastlane/lib/fastlane/actions/nexus_upload.rb +230 -0
- data/fastlane/lib/fastlane/actions/notarize.rb +193 -0
- data/fastlane/lib/fastlane/actions/notification.rb +75 -0
- data/fastlane/lib/fastlane/actions/notify.rb +40 -0
- data/fastlane/lib/fastlane/actions/number_of_commits.rb +75 -0
- data/fastlane/lib/fastlane/actions/oclint.rb +269 -0
- data/fastlane/lib/fastlane/actions/onesignal.rb +186 -0
- data/fastlane/lib/fastlane/actions/opt_out_crash_reporting.rb +33 -0
- data/fastlane/lib/fastlane/actions/opt_out_usage.rb +40 -0
- data/fastlane/lib/fastlane/actions/pem.rb +14 -0
- data/fastlane/lib/fastlane/actions/pilot.rb +14 -0
- data/fastlane/lib/fastlane/actions/pod_lib_lint.rb +189 -0
- data/fastlane/lib/fastlane/actions/pod_push.rb +173 -0
- data/fastlane/lib/fastlane/actions/podio_item.rb +217 -0
- data/fastlane/lib/fastlane/actions/precheck.rb +14 -0
- data/fastlane/lib/fastlane/actions/println.rb +14 -0
- data/fastlane/lib/fastlane/actions/produce.rb +14 -0
- data/fastlane/lib/fastlane/actions/prompt.rb +119 -0
- data/fastlane/lib/fastlane/actions/push_git_tags.rb +76 -0
- data/fastlane/lib/fastlane/actions/push_to_git_remote.rb +127 -0
- data/fastlane/lib/fastlane/actions/puts.rb +68 -0
- data/fastlane/lib/fastlane/actions/read_podspec.rb +90 -0
- data/fastlane/lib/fastlane/actions/recreate_schemes.rb +46 -0
- data/fastlane/lib/fastlane/actions/register_device.rb +151 -0
- data/fastlane/lib/fastlane/actions/register_devices.rb +214 -0
- data/fastlane/lib/fastlane/actions/reset_git_repo.rb +121 -0
- data/fastlane/lib/fastlane/actions/reset_simulator_contents.rb +92 -0
- data/fastlane/lib/fastlane/actions/resign.rb +132 -0
- data/fastlane/lib/fastlane/actions/restore_file.rb +44 -0
- data/fastlane/lib/fastlane/actions/rocket.rb +83 -0
- data/fastlane/lib/fastlane/actions/rsync.rb +74 -0
- data/fastlane/lib/fastlane/actions/ruby_version.rb +56 -0
- data/fastlane/lib/fastlane/actions/run_tests.rb +114 -0
- data/fastlane/lib/fastlane/actions/s3.rb +174 -0
- data/fastlane/lib/fastlane/actions/say.rb +56 -0
- data/fastlane/lib/fastlane/actions/scan.rb +14 -0
- data/fastlane/lib/fastlane/actions/scp.rb +114 -0
- data/fastlane/lib/fastlane/actions/screengrab.rb +14 -0
- data/fastlane/lib/fastlane/actions/set_build_number_repository.rb +76 -0
- data/fastlane/lib/fastlane/actions/set_changelog.rb +204 -0
- data/fastlane/lib/fastlane/actions/set_github_release.rb +274 -0
- data/fastlane/lib/fastlane/actions/set_info_plist_value.rb +92 -0
- data/fastlane/lib/fastlane/actions/set_pod_key.rb +78 -0
- data/fastlane/lib/fastlane/actions/setup_ci.rb +132 -0
- data/fastlane/lib/fastlane/actions/setup_circle_ci.rb +58 -0
- data/fastlane/lib/fastlane/actions/setup_jenkins.rb +202 -0
- data/fastlane/lib/fastlane/actions/setup_travis.rb +57 -0
- data/fastlane/lib/fastlane/actions/sh.rb +71 -0
- data/fastlane/lib/fastlane/actions/sigh.rb +14 -0
- data/fastlane/lib/fastlane/actions/skip_docs.rb +52 -0
- data/fastlane/lib/fastlane/actions/slack.rb +288 -0
- data/fastlane/lib/fastlane/actions/slather.rb +329 -0
- data/fastlane/lib/fastlane/actions/snapshot.rb +14 -0
- data/fastlane/lib/fastlane/actions/sonar.rb +177 -0
- data/fastlane/lib/fastlane/actions/spaceship_logs.rb +135 -0
- data/fastlane/lib/fastlane/actions/spaceship_stats.rb +73 -0
- data/fastlane/lib/fastlane/actions/splunkmint.rb +156 -0
- data/fastlane/lib/fastlane/actions/spm.rb +138 -0
- data/fastlane/lib/fastlane/actions/ssh.rb +162 -0
- data/fastlane/lib/fastlane/actions/supply.rb +14 -0
- data/fastlane/lib/fastlane/actions/swiftlint.rb +240 -0
- data/fastlane/lib/fastlane/actions/sync_code_signing.rb +109 -0
- data/fastlane/lib/fastlane/actions/team_id.rb +42 -0
- data/fastlane/lib/fastlane/actions/team_name.rb +42 -0
- data/fastlane/lib/fastlane/actions/testfairy.rb +285 -0
- data/fastlane/lib/fastlane/actions/testflight.rb +14 -0
- data/fastlane/lib/fastlane/actions/tryouts.rb +149 -0
- data/fastlane/lib/fastlane/actions/twitter.rb +89 -0
- data/fastlane/lib/fastlane/actions/typetalk.rb +93 -0
- data/fastlane/lib/fastlane/actions/unlock_keychain.rb +132 -0
- data/fastlane/lib/fastlane/actions/update_app_group_identifiers.rb +91 -0
- data/fastlane/lib/fastlane/actions/update_app_identifier.rb +124 -0
- data/fastlane/lib/fastlane/actions/update_code_signing_settings.rb +203 -0
- data/fastlane/lib/fastlane/actions/update_fastlane.rb +137 -0
- data/fastlane/lib/fastlane/actions/update_icloud_container_identifiers.rb +99 -0
- data/fastlane/lib/fastlane/actions/update_info_plist.rb +143 -0
- data/fastlane/lib/fastlane/actions/update_keychain_access_groups.rb +94 -0
- data/fastlane/lib/fastlane/actions/update_plist.rb +115 -0
- data/fastlane/lib/fastlane/actions/update_project_code_signing.rb +76 -0
- data/fastlane/lib/fastlane/actions/update_project_provisioning.rb +173 -0
- data/fastlane/lib/fastlane/actions/update_project_team.rb +95 -0
- data/fastlane/lib/fastlane/actions/update_urban_airship_configuration.rb +91 -0
- data/fastlane/lib/fastlane/actions/update_url_schemes.rb +123 -0
- data/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb +231 -0
- data/fastlane/lib/fastlane/actions/upload_symbols_to_sentry.rb +165 -0
- data/fastlane/lib/fastlane/actions/upload_to_app_store.rb +67 -0
- data/fastlane/lib/fastlane/actions/upload_to_play_store.rb +80 -0
- data/fastlane/lib/fastlane/actions/upload_to_play_store_internal_app_sharing.rb +78 -0
- data/fastlane/lib/fastlane/actions/upload_to_testflight.rb +119 -0
- data/fastlane/lib/fastlane/actions/validate_play_store_json_key.rb +104 -0
- data/fastlane/lib/fastlane/actions/verify_build.rb +199 -0
- data/fastlane/lib/fastlane/actions/verify_pod_keys.rb +67 -0
- data/fastlane/lib/fastlane/actions/verify_xcode.rb +159 -0
- data/fastlane/lib/fastlane/actions/version_bump_podspec.rb +105 -0
- data/fastlane/lib/fastlane/actions/version_get_podspec.rb +71 -0
- data/fastlane/lib/fastlane/actions/xcode_install.rb +105 -0
- data/fastlane/lib/fastlane/actions/xcode_select.rb +68 -0
- data/fastlane/lib/fastlane/actions/xcode_server_get_assets.rb +312 -0
- data/fastlane/lib/fastlane/actions/xcodebuild.rb +641 -0
- data/fastlane/lib/fastlane/actions/xcov.rb +66 -0
- data/fastlane/lib/fastlane/actions/xctool.rb +55 -0
- data/fastlane/lib/fastlane/actions/xcversion.rb +55 -0
- data/fastlane/lib/fastlane/actions/zip.rb +120 -0
- data/fastlane/lib/fastlane/auto_complete.rb +82 -0
- data/fastlane/lib/fastlane/boolean.rb +5 -0
- data/fastlane/lib/fastlane/cli_tools_distributor.rb +207 -0
- data/fastlane/lib/fastlane/command_line_handler.rb +49 -0
- data/fastlane/lib/fastlane/commands_generator.rb +369 -0
- data/fastlane/lib/fastlane/configuration_helper.rb +26 -0
- data/fastlane/lib/fastlane/core_ext/bundler_monkey_patch.rb +14 -0
- data/fastlane/lib/fastlane/documentation/actions_list.rb +214 -0
- data/fastlane/lib/fastlane/documentation/docs_generator.rb +89 -0
- data/fastlane/lib/fastlane/documentation/markdown_docs_generator.rb +228 -0
- data/fastlane/lib/fastlane/environment_printer.rb +303 -0
- data/fastlane/lib/fastlane/erb_template_helper.rb +30 -0
- data/fastlane/lib/fastlane/fast_file.rb +439 -0
- data/fastlane/lib/fastlane/fastlane_require.rb +75 -0
- data/fastlane/lib/fastlane/features.rb +4 -0
- data/fastlane/lib/fastlane/helper/README.md +29 -0
- data/fastlane/lib/fastlane/helper/adb_helper.rb +66 -0
- data/fastlane/lib/fastlane/helper/crashlytics_helper.rb +157 -0
- data/fastlane/lib/fastlane/helper/dotenv_helper.rb +50 -0
- data/fastlane/lib/fastlane/helper/gem_helper.rb +26 -0
- data/fastlane/lib/fastlane/helper/git_helper.rb +137 -0
- data/fastlane/lib/fastlane/helper/gradle_helper.rb +62 -0
- data/fastlane/lib/fastlane/helper/lane_helper.rb +13 -0
- data/fastlane/lib/fastlane/helper/podspec_helper.rb +75 -0
- data/fastlane/lib/fastlane/helper/s3_client_helper.rb +78 -0
- data/fastlane/lib/fastlane/helper/sh_helper.rb +134 -0
- data/fastlane/lib/fastlane/helper/xcodeproj_helper.rb +12 -0
- data/fastlane/lib/fastlane/helper/xcversion_helper.rb +25 -0
- data/fastlane/lib/fastlane/junit_generator.rb +27 -0
- data/fastlane/lib/fastlane/lane.rb +97 -0
- data/fastlane/lib/fastlane/lane_list.rb +137 -0
- data/fastlane/lib/fastlane/lane_manager.rb +130 -0
- data/fastlane/lib/fastlane/lane_manager_base.rb +92 -0
- data/fastlane/lib/fastlane/markdown_table_formatter.rb +62 -0
- data/fastlane/lib/fastlane/new_action.rb +47 -0
- data/fastlane/lib/fastlane/one_off.rb +45 -0
- data/fastlane/lib/fastlane/other_action.rb +29 -0
- data/fastlane/lib/fastlane/plugins/plugin_fetcher.rb +55 -0
- data/fastlane/lib/fastlane/plugins/plugin_generator.rb +86 -0
- data/fastlane/lib/fastlane/plugins/plugin_generator_ui.rb +19 -0
- data/fastlane/lib/fastlane/plugins/plugin_info.rb +49 -0
- data/fastlane/lib/fastlane/plugins/plugin_info_collector.rb +159 -0
- data/fastlane/lib/fastlane/plugins/plugin_manager.rb +399 -0
- data/fastlane/lib/fastlane/plugins/plugin_search.rb +46 -0
- data/fastlane/lib/fastlane/plugins/plugin_update_manager.rb +70 -0
- data/fastlane/lib/fastlane/plugins/plugins.rb +12 -0
- data/fastlane/lib/fastlane/plugins/template/%gem_name%.gemspec.erb +35 -0
- data/fastlane/lib/fastlane/plugins/template/.circleci/config.yml +43 -0
- data/fastlane/lib/fastlane/plugins/template/.github/workflows/test.yml +29 -0
- data/fastlane/lib/fastlane/plugins/template/.gitignore +12 -0
- data/fastlane/lib/fastlane/plugins/template/.rspec +5 -0
- data/fastlane/lib/fastlane/plugins/template/.rubocop.yml +188 -0
- data/fastlane/lib/fastlane/plugins/template/.travis.yml +4 -0
- data/fastlane/lib/fastlane/plugins/template/Gemfile +6 -0
- data/fastlane/lib/fastlane/plugins/template/LICENSE.erb +21 -0
- data/fastlane/lib/fastlane/plugins/template/README.md.erb +52 -0
- data/fastlane/lib/fastlane/plugins/template/Rakefile +9 -0
- data/fastlane/lib/fastlane/plugins/template/fastlane/Fastfile.erb +3 -0
- data/fastlane/lib/fastlane/plugins/template/fastlane/Pluginfile.erb +1 -0
- data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%.rb.erb +16 -0
- data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/actions/%plugin_name%_action.rb.erb +47 -0
- data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/helper/%plugin_name%_helper.rb.erb +16 -0
- data/fastlane/lib/fastlane/plugins/template/lib/fastlane/plugin/%plugin_name%/version.rb.erb +5 -0
- data/fastlane/lib/fastlane/plugins/template/spec/%plugin_name%_action_spec.rb.erb +9 -0
- data/fastlane/lib/fastlane/plugins/template/spec/spec_helper.rb.erb +15 -0
- data/fastlane/lib/fastlane/runner.rb +378 -0
- data/fastlane/lib/fastlane/server/action_command.rb +61 -0
- data/fastlane/lib/fastlane/server/action_command_return.rb +14 -0
- data/fastlane/lib/fastlane/server/command_executor.rb +7 -0
- data/fastlane/lib/fastlane/server/command_parser.rb +44 -0
- data/fastlane/lib/fastlane/server/control_command.rb +23 -0
- data/fastlane/lib/fastlane/server/json_return_value_processor.rb +72 -0
- data/fastlane/lib/fastlane/server/socket_server.rb +238 -0
- data/fastlane/lib/fastlane/server/socket_server_action_command_executor.rb +101 -0
- data/fastlane/lib/fastlane/setup/setup.rb +355 -0
- data/fastlane/lib/fastlane/setup/setup_android.rb +97 -0
- data/fastlane/lib/fastlane/setup/setup_ios.rb +504 -0
- data/fastlane/lib/fastlane/shells.rb +6 -0
- data/fastlane/lib/fastlane/supported_platforms.rb +28 -0
- data/fastlane/lib/fastlane/swift_fastlane_api_generator.rb +477 -0
- data/fastlane/lib/fastlane/swift_fastlane_function.rb +419 -0
- data/fastlane/lib/fastlane/swift_lane_manager.rb +296 -0
- data/fastlane/lib/fastlane/swift_runner_upgrader.rb +210 -0
- data/fastlane/lib/fastlane/tools.rb +33 -0
- data/fastlane/lib/fastlane/version.rb +6 -0
- data/fastlane/swift/Actions.swift +16 -0
- data/fastlane/swift/Appfile.swift +15 -0
- data/fastlane/swift/ArgumentProcessor.swift +89 -0
- data/fastlane/swift/ControlCommand.swift +74 -0
- data/fastlane/swift/Deliverfile.swift +20 -0
- data/fastlane/swift/DeliverfileProtocol.swift +259 -0
- data/fastlane/swift/Fastfile.swift +16 -0
- data/fastlane/swift/Fastlane.swift +9402 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.pbxproj +434 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- data/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme +97 -0
- data/fastlane/swift/FastlaneSwiftRunner/README.txt +10 -0
- data/fastlane/swift/Gymfile.swift +20 -0
- data/fastlane/swift/GymfileProtocol.swift +187 -0
- data/fastlane/swift/LaneFileProtocol.swift +149 -0
- data/fastlane/swift/MainProcess.swift +77 -0
- data/fastlane/swift/Matchfile.swift +20 -0
- data/fastlane/swift/MatchfileProtocol.swift +187 -0
- data/fastlane/swift/Plugins.swift +16 -0
- data/fastlane/swift/Precheckfile.swift +20 -0
- data/fastlane/swift/PrecheckfileProtocol.swift +51 -0
- data/fastlane/swift/RubyCommand.swift +157 -0
- data/fastlane/swift/RubyCommandable.swift +43 -0
- data/fastlane/swift/Runner.swift +275 -0
- data/fastlane/swift/RunnerArgument.swift +20 -0
- data/fastlane/swift/Scanfile.swift +20 -0
- data/fastlane/swift/ScanfileProtocol.swift +263 -0
- data/fastlane/swift/Screengrabfile.swift +20 -0
- data/fastlane/swift/ScreengrabfileProtocol.swift +99 -0
- data/fastlane/swift/Snapshotfile.swift +20 -0
- data/fastlane/swift/SnapshotfileProtocol.swift +187 -0
- data/fastlane/swift/SocketClient.swift +327 -0
- data/fastlane/swift/SocketClientDelegateProtocol.swift +21 -0
- data/fastlane/swift/SocketResponse.swift +82 -0
- data/fastlane/swift/formatting/Brewfile +1 -0
- data/fastlane/swift/formatting/Brewfile.lock.json +47 -0
- data/fastlane/swift/formatting/Rakefile +18 -0
- data/fastlane/swift/main.swift +47 -0
- data/fastlane/swift/upgrade_manifest.json +1 -0
- data/fastlane_core/README.md +79 -0
- data/fastlane_core/lib/assets/XMLTemplate.xml.erb +12 -0
- data/fastlane_core/lib/fastlane_core.rb +46 -0
- data/fastlane_core/lib/fastlane_core/analytics/action_completion_context.rb +34 -0
- data/fastlane_core/lib/fastlane_core/analytics/action_launch_context.rb +38 -0
- data/fastlane_core/lib/fastlane_core/analytics/analytics_event_builder.rb +23 -0
- data/fastlane_core/lib/fastlane_core/analytics/analytics_ingester_client.rb +54 -0
- data/fastlane_core/lib/fastlane_core/analytics/analytics_session.rb +70 -0
- data/fastlane_core/lib/fastlane_core/analytics/app_identifier_guesser.rb +64 -0
- data/fastlane_core/lib/fastlane_core/android_package_name_guesser.rb +79 -0
- data/fastlane_core/lib/fastlane_core/build_watcher.rb +96 -0
- data/fastlane_core/lib/fastlane_core/cert_checker.rb +144 -0
- data/fastlane_core/lib/fastlane_core/command_executor.rb +100 -0
- data/fastlane_core/lib/fastlane_core/configuration/commander_generator.rb +103 -0
- data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +321 -0
- data/fastlane_core/lib/fastlane_core/configuration/configuration.rb +332 -0
- data/fastlane_core/lib/fastlane_core/configuration/configuration_file.rb +182 -0
- data/fastlane_core/lib/fastlane_core/core_ext/cfpropertylist.rb +23 -0
- data/fastlane_core/lib/fastlane_core/core_ext/shellwords.rb +63 -0
- data/fastlane_core/lib/fastlane_core/core_ext/string.rb +17 -0
- data/fastlane_core/lib/fastlane_core/device_manager.rb +374 -0
- data/fastlane_core/lib/fastlane_core/env.rb +9 -0
- data/fastlane_core/lib/fastlane_core/fastlane_folder.rb +72 -0
- data/fastlane_core/lib/fastlane_core/fastlane_pty.rb +57 -0
- data/fastlane_core/lib/fastlane_core/feature/feature.rb +51 -0
- data/fastlane_core/lib/fastlane_core/features.rb +4 -0
- data/fastlane_core/lib/fastlane_core/globals.rb +27 -0
- data/fastlane_core/lib/fastlane_core/helper.rb +437 -0
- data/fastlane_core/lib/fastlane_core/ios_app_identifier_guesser.rb +112 -0
- data/fastlane_core/lib/fastlane_core/ipa_file_analyser.rb +63 -0
- data/fastlane_core/lib/fastlane_core/ipa_upload_package_builder.rb +52 -0
- data/fastlane_core/lib/fastlane_core/itunes_transporter.rb +595 -0
- data/fastlane_core/lib/fastlane_core/keychain_importer.rb +120 -0
- data/fastlane_core/lib/fastlane_core/languages.rb +16 -0
- data/fastlane_core/lib/fastlane_core/module.rb +31 -0
- data/fastlane_core/lib/fastlane_core/pkg_file_analyser.rb +51 -0
- data/fastlane_core/lib/fastlane_core/pkg_upload_package_builder.rb +48 -0
- data/fastlane_core/lib/fastlane_core/print_table.rb +131 -0
- data/fastlane_core/lib/fastlane_core/project.rb +509 -0
- data/fastlane_core/lib/fastlane_core/provisioning_profile.rb +124 -0
- data/fastlane_core/lib/fastlane_core/string_filters.rb +51 -0
- data/fastlane_core/lib/fastlane_core/swag.rb +85 -0
- data/fastlane_core/lib/fastlane_core/tag_version.rb +31 -0
- data/fastlane_core/lib/fastlane_core/test_parser.rb +107 -0
- data/fastlane_core/lib/fastlane_core/ui/disable_colors.rb +17 -0
- data/fastlane_core/lib/fastlane_core/ui/errors.rb +1 -0
- data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_common_error.rb +19 -0
- data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_crash.rb +11 -0
- data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_error.rb +25 -0
- data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_exception.rb +19 -0
- data/fastlane_core/lib/fastlane_core/ui/errors/fastlane_shell_error.rb +11 -0
- data/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb +294 -0
- data/fastlane_core/lib/fastlane_core/ui/github_issue_inspector_reporter.rb +62 -0
- data/fastlane_core/lib/fastlane_core/ui/implementations/shell.rb +159 -0
- data/fastlane_core/lib/fastlane_core/ui/interface.rb +205 -0
- data/fastlane_core/lib/fastlane_core/ui/ui.rb +26 -0
- data/fastlane_core/lib/fastlane_core/update_checker/changelog.rb +37 -0
- data/fastlane_core/lib/fastlane_core/update_checker/update_checker.rb +109 -0
- data/frameit/README.md +17 -0
- data/frameit/lib/assets/empty.png +0 -0
- data/frameit/lib/frameit.rb +13 -0
- data/frameit/lib/frameit/commands_generator.rb +140 -0
- data/frameit/lib/frameit/config_parser.rb +136 -0
- data/frameit/lib/frameit/dependency_checker.rb +22 -0
- data/frameit/lib/frameit/device.rb +90 -0
- data/frameit/lib/frameit/device_types.rb +144 -0
- data/frameit/lib/frameit/editor.rb +560 -0
- data/frameit/lib/frameit/frame_downloader.rb +85 -0
- data/frameit/lib/frameit/mac_editor.rb +35 -0
- data/frameit/lib/frameit/module.rb +42 -0
- data/frameit/lib/frameit/offsets.rb +28 -0
- data/frameit/lib/frameit/options.rb +112 -0
- data/frameit/lib/frameit/runner.rb +97 -0
- data/frameit/lib/frameit/screenshot.rb +134 -0
- data/frameit/lib/frameit/strings_parser.rb +46 -0
- data/frameit/lib/frameit/template_finder.rb +45 -0
- data/frameit/lib/frameit/trim_box.rb +35 -0
- data/gym/README.md +17 -0
- data/gym/lib/assets/GymfileTemplate +13 -0
- data/gym/lib/assets/GymfileTemplate.swift +13 -0
- data/gym/lib/assets/wrap_xcodebuild/xcbuild-safe.sh +61 -0
- data/gym/lib/gym.rb +9 -0
- data/gym/lib/gym/code_signing_mapping.rb +210 -0
- data/gym/lib/gym/commands_generator.rb +78 -0
- data/gym/lib/gym/detect_values.rb +206 -0
- data/gym/lib/gym/error_handler.rb +306 -0
- data/gym/lib/gym/generators/README.md +1 -0
- data/gym/lib/gym/generators/build_command_generator.rb +147 -0
- data/gym/lib/gym/generators/package_command_generator.rb +68 -0
- data/gym/lib/gym/generators/package_command_generator_xcode7.rb +232 -0
- data/gym/lib/gym/manager.rb +22 -0
- data/gym/lib/gym/module.rb +74 -0
- data/gym/lib/gym/options.rb +286 -0
- data/gym/lib/gym/runner.rb +365 -0
- data/gym/lib/gym/xcode.rb +27 -0
- data/gym/lib/gym/xcodebuild_fixes/README.md +9 -0
- data/gym/lib/gym/xcodebuild_fixes/generic_archive_fix.rb +35 -0
- data/match/README.md +17 -0
- data/match/lib/assets/MatchfileTemplate +11 -0
- data/match/lib/assets/MatchfileTemplate.swift +9 -0
- data/match/lib/assets/READMETemplate.md +59 -0
- data/match/lib/match.rb +14 -0
- data/match/lib/match/change_password.rb +53 -0
- data/match/lib/match/commands_generator.rb +190 -0
- data/match/lib/match/encryption.rb +49 -0
- data/match/lib/match/encryption/interface.rb +17 -0
- data/match/lib/match/encryption/openssl.rb +161 -0
- data/match/lib/match/generator.rb +122 -0
- data/match/lib/match/importer.rb +157 -0
- data/match/lib/match/migrate.rb +109 -0
- data/match/lib/match/module.rb +32 -0
- data/match/lib/match/nuke.rb +350 -0
- data/match/lib/match/options.rb +315 -0
- data/match/lib/match/runner.rb +369 -0
- data/match/lib/match/setup.rb +40 -0
- data/match/lib/match/spaceship_ensure.rb +97 -0
- data/match/lib/match/storage.rb +46 -0
- data/match/lib/match/storage/git_storage.rb +250 -0
- data/match/lib/match/storage/google_cloud_storage.rb +382 -0
- data/match/lib/match/storage/interface.rb +119 -0
- data/match/lib/match/storage/s3_storage.rb +205 -0
- data/match/lib/match/table_printer.rb +51 -0
- data/match/lib/match/utils.rb +75 -0
- data/pem/README.md +17 -0
- data/pem/lib/pem.rb +4 -0
- data/pem/lib/pem/commands_generator.rb +47 -0
- data/pem/lib/pem/manager.rb +112 -0
- data/pem/lib/pem/module.rb +19 -0
- data/pem/lib/pem/options.rb +103 -0
- data/pilot/README.md +17 -0
- data/pilot/lib/pilot.rb +9 -0
- data/pilot/lib/pilot/build_manager.rb +546 -0
- data/pilot/lib/pilot/commands_generator.rb +174 -0
- data/pilot/lib/pilot/features.rb +0 -0
- data/pilot/lib/pilot/manager.rb +90 -0
- data/pilot/lib/pilot/module.rb +11 -0
- data/pilot/lib/pilot/options.rb +303 -0
- data/pilot/lib/pilot/tester_exporter.rb +58 -0
- data/pilot/lib/pilot/tester_importer.rb +53 -0
- data/pilot/lib/pilot/tester_manager.rb +168 -0
- data/pilot/lib/pilot/tester_util.rb +0 -0
- data/precheck/README.md +17 -0
- data/precheck/lib/assets/PrecheckfileTemplate +27 -0
- data/precheck/lib/assets/PrecheckfileTemplate.swift +19 -0
- data/precheck/lib/precheck.rb +3 -0
- data/precheck/lib/precheck/commands_generator.rb +74 -0
- data/precheck/lib/precheck/item_to_check.rb +58 -0
- data/precheck/lib/precheck/module.rb +21 -0
- data/precheck/lib/precheck/options.rb +104 -0
- data/precheck/lib/precheck/rule.rb +171 -0
- data/precheck/lib/precheck/rule_check_result.rb +19 -0
- data/precheck/lib/precheck/rule_processor.rb +265 -0
- data/precheck/lib/precheck/rules/abstract_text_match_rule.rb +80 -0
- data/precheck/lib/precheck/rules/all.rb +1 -0
- data/precheck/lib/precheck/rules/copyright_date_rule.rb +37 -0
- data/precheck/lib/precheck/rules/curse_words_rule.rb +62 -0
- data/precheck/lib/precheck/rules/custom_text_rule.rb +35 -0
- data/precheck/lib/precheck/rules/free_stuff_iap_rule.rb +31 -0
- data/precheck/lib/precheck/rules/future_functionality_rule.rb +33 -0
- data/precheck/lib/precheck/rules/negative_apple_sentiment_rule.rb +37 -0
- data/precheck/lib/precheck/rules/other_platforms_rule.rb +43 -0
- data/precheck/lib/precheck/rules/placeholder_words_rule.rb +31 -0
- data/precheck/lib/precheck/rules/rules_data/curse_word_hashes/en_us.txt +349 -0
- data/precheck/lib/precheck/rules/test_words_rule.rb +30 -0
- data/precheck/lib/precheck/rules/unreachable_urls_rule.rb +47 -0
- data/precheck/lib/precheck/runner.rb +197 -0
- data/produce/README.md +17 -0
- data/produce/lib/produce.rb +6 -0
- data/produce/lib/produce/available_default_languages.rb +51 -0
- data/produce/lib/produce/cloud_container.rb +82 -0
- data/produce/lib/produce/commands_generator.rb +236 -0
- data/produce/lib/produce/developer_center.rb +143 -0
- data/produce/lib/produce/group.rb +90 -0
- data/produce/lib/produce/itunes_connect.rb +139 -0
- data/produce/lib/produce/manager.rb +15 -0
- data/produce/lib/produce/merchant.rb +121 -0
- data/produce/lib/produce/module.rb +14 -0
- data/produce/lib/produce/options.rb +184 -0
- data/produce/lib/produce/service.rb +319 -0
- data/scan/README.md +17 -0
- data/scan/lib/assets/ScanfileTemplate +16 -0
- data/scan/lib/assets/ScanfileTemplate.swift +13 -0
- data/scan/lib/scan.rb +10 -0
- data/scan/lib/scan/commands_generator.rb +78 -0
- data/scan/lib/scan/detect_values.rb +224 -0
- data/scan/lib/scan/error_handler.rb +57 -0
- data/scan/lib/scan/manager.rb +38 -0
- data/scan/lib/scan/module.rb +32 -0
- data/scan/lib/scan/options.rb +445 -0
- data/scan/lib/scan/runner.rb +197 -0
- data/scan/lib/scan/slack_poster.rb +60 -0
- data/scan/lib/scan/test_command_generator.rb +174 -0
- data/scan/lib/scan/test_result_parser.rb +33 -0
- data/scan/lib/scan/xcpretty_reporter_options_generator.rb +85 -0
- data/screengrab/README.md +17 -0
- data/screengrab/lib/assets/ScreengrabfileTemplate +15 -0
- data/screengrab/lib/assets/ScreengrabfileTemplate.swift +15 -0
- data/screengrab/lib/screengrab.rb +7 -0
- data/screengrab/lib/screengrab/android_environment.rb +91 -0
- data/screengrab/lib/screengrab/commands_generator.rb +70 -0
- data/screengrab/lib/screengrab/dependency_checker.rb +58 -0
- data/screengrab/lib/screengrab/detect_values.rb +16 -0
- data/screengrab/lib/screengrab/module.rb +26 -0
- data/screengrab/lib/screengrab/options.rb +148 -0
- data/screengrab/lib/screengrab/page.html.erb +190 -0
- data/screengrab/lib/screengrab/reports_generator.rb +36 -0
- data/screengrab/lib/screengrab/runner.rb +449 -0
- data/screengrab/lib/screengrab/setup.rb +24 -0
- data/sigh/README.md +17 -0
- data/sigh/lib/assets/resign.sh +909 -0
- data/sigh/lib/sigh.rb +4 -0
- data/sigh/lib/sigh/commands_generator.rb +154 -0
- data/sigh/lib/sigh/download_all.rb +112 -0
- data/sigh/lib/sigh/local_manage.rb +145 -0
- data/sigh/lib/sigh/manager.rb +47 -0
- data/sigh/lib/sigh/module.rb +42 -0
- data/sigh/lib/sigh/options.rb +187 -0
- data/sigh/lib/sigh/repair.rb +34 -0
- data/sigh/lib/sigh/resign.rb +220 -0
- data/sigh/lib/sigh/runner.rb +402 -0
- data/snapshot/README.md +17 -0
- data/snapshot/lib/assets/SnapfileTemplate +37 -0
- data/snapshot/lib/assets/SnapfileTemplate.swift +41 -0
- data/snapshot/lib/assets/SnapshotHelper.swift +301 -0
- data/snapshot/lib/assets/SnapshotHelperXcode8.swift +172 -0
- data/snapshot/lib/snapshot.rb +19 -0
- data/snapshot/lib/snapshot/collector.rb +140 -0
- data/snapshot/lib/snapshot/commands_generator.rb +115 -0
- data/snapshot/lib/snapshot/dependency_checker.rb +69 -0
- data/snapshot/lib/snapshot/detect_values.rb +86 -0
- data/snapshot/lib/snapshot/error_handler.rb +24 -0
- data/snapshot/lib/snapshot/fixes/README.md +5 -0
- data/snapshot/lib/snapshot/fixes/hardware_keyboard_fix.rb +27 -0
- data/snapshot/lib/snapshot/fixes/simulator_shared_pasteboard.rb +16 -0
- data/snapshot/lib/snapshot/fixes/simulator_zoom_fix.rb +27 -0
- data/snapshot/lib/snapshot/latest_os_version.rb +34 -0
- data/snapshot/lib/snapshot/module.rb +44 -0
- data/snapshot/lib/snapshot/options.rb +290 -0
- data/snapshot/lib/snapshot/page.html.erb +285 -0
- data/snapshot/lib/snapshot/reports_generator.rb +139 -0
- data/snapshot/lib/snapshot/reset_simulators.rb +122 -0
- data/snapshot/lib/snapshot/runner.rb +146 -0
- data/snapshot/lib/snapshot/screenshot_flatten.rb +20 -0
- data/snapshot/lib/snapshot/screenshot_rotate.rb +36 -0
- data/snapshot/lib/snapshot/setup.rb +58 -0
- data/snapshot/lib/snapshot/simulator_launchers/launcher_configuration.rb +62 -0
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher.rb +219 -0
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_base.rb +200 -0
- data/snapshot/lib/snapshot/simulator_launchers/simulator_launcher_xcode_8.rb +113 -0
- data/snapshot/lib/snapshot/test_command_generator.rb +108 -0
- data/snapshot/lib/snapshot/test_command_generator_base.rb +128 -0
- data/snapshot/lib/snapshot/test_command_generator_xcode_8.rb +70 -0
- data/snapshot/lib/snapshot/update.rb +38 -0
- data/spaceship/README.md +183 -0
- data/spaceship/lib/assets/displayFamilies.json +181 -0
- data/spaceship/lib/assets/languageMapping.json +306 -0
- data/spaceship/lib/assets/languageMappingReadable.json +30 -0
- data/spaceship/lib/spaceship.rb +30 -0
- data/spaceship/lib/spaceship/base.rb +310 -0
- data/spaceship/lib/spaceship/client.rb +913 -0
- data/spaceship/lib/spaceship/commands_generator.rb +53 -0
- data/spaceship/lib/spaceship/connect_api.rb +116 -0
- data/spaceship/lib/spaceship/connect_api/api_client.rb +279 -0
- data/spaceship/lib/spaceship/connect_api/client.rb +216 -0
- data/spaceship/lib/spaceship/connect_api/file_uploader.rb +99 -0
- data/spaceship/lib/spaceship/connect_api/model.rb +172 -0
- data/spaceship/lib/spaceship/connect_api/models/age_rating_declaration.rb +114 -0
- data/spaceship/lib/spaceship/connect_api/models/app.rb +388 -0
- data/spaceship/lib/spaceship/connect_api/models/app_category.rb +94 -0
- data/spaceship/lib/spaceship/connect_api/models/app_info.rb +95 -0
- data/spaceship/lib/spaceship/connect_api/models/app_info_localization.rb +39 -0
- data/spaceship/lib/spaceship/connect_api/models/app_preview.rb +131 -0
- data/spaceship/lib/spaceship/connect_api/models/app_preview_set.rb +100 -0
- data/spaceship/lib/spaceship/connect_api/models/app_price.rb +22 -0
- data/spaceship/lib/spaceship/connect_api/models/app_price_point.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/models/app_price_tier.rb +12 -0
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot.rb +187 -0
- data/spaceship/lib/spaceship/connect_api/models/app_screenshot_set.rb +153 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_review_attachment.rb +71 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_review_detail.rb +51 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version.rb +217 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_localization.rb +85 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_phased_release.rb +57 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_release_request.rb +12 -0
- data/spaceship/lib/spaceship/connect_api/models/app_store_version_submission.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_app_localization.rb +28 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_app_review_detail.rb +32 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_app_review_submission.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_build_localization.rb +20 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_build_metric.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_feedback.rb +75 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_group.rb +41 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_screenshot.rb +18 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_tester.rb +57 -0
- data/spaceship/lib/spaceship/connect_api/models/beta_tester_metric.rb +44 -0
- data/spaceship/lib/spaceship/connect_api/models/build.rb +172 -0
- data/spaceship/lib/spaceship/connect_api/models/build_beta_detail.rb +61 -0
- data/spaceship/lib/spaceship/connect_api/models/build_delivery.rb +36 -0
- data/spaceship/lib/spaceship/connect_api/models/bundle_id.rb +58 -0
- data/spaceship/lib/spaceship/connect_api/models/bundle_id_capability.rb +71 -0
- data/spaceship/lib/spaceship/connect_api/models/certificate.rb +102 -0
- data/spaceship/lib/spaceship/connect_api/models/custom_app_organization.rb +43 -0
- data/spaceship/lib/spaceship/connect_api/models/custom_app_user.rb +41 -0
- data/spaceship/lib/spaceship/connect_api/models/device.rb +58 -0
- data/spaceship/lib/spaceship/connect_api/models/idfa_declaration.rb +41 -0
- data/spaceship/lib/spaceship/connect_api/models/pre_release_version.rb +20 -0
- data/spaceship/lib/spaceship/connect_api/models/profile.rb +97 -0
- data/spaceship/lib/spaceship/connect_api/models/reset_ratings_request.rb +26 -0
- data/spaceship/lib/spaceship/connect_api/models/sandbox_tester.rb +64 -0
- data/spaceship/lib/spaceship/connect_api/models/territory.rb +27 -0
- data/spaceship/lib/spaceship/connect_api/models/user.rb +51 -0
- data/spaceship/lib/spaceship/connect_api/models/user_invitation.rb +59 -0
- data/spaceship/lib/spaceship/connect_api/provisioning/client.rb +92 -0
- data/spaceship/lib/spaceship/connect_api/provisioning/provisioning.rb +143 -0
- data/spaceship/lib/spaceship/connect_api/response.rb +67 -0
- data/spaceship/lib/spaceship/connect_api/spaceship.rb +102 -0
- data/spaceship/lib/spaceship/connect_api/testflight/client.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/testflight/testflight.rb +391 -0
- data/spaceship/lib/spaceship/connect_api/token.rb +102 -0
- data/spaceship/lib/spaceship/connect_api/token_refresh_middleware.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/tunes/client.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/tunes/tunes.rb +1045 -0
- data/spaceship/lib/spaceship/connect_api/users/client.rb +24 -0
- data/spaceship/lib/spaceship/connect_api/users/users.rb +80 -0
- data/spaceship/lib/spaceship/du/du_client.rb +138 -0
- data/spaceship/lib/spaceship/du/upload_file.rb +58 -0
- data/spaceship/lib/spaceship/du/utilities.rb +99 -0
- data/spaceship/lib/spaceship/errors.rb +82 -0
- data/spaceship/lib/spaceship/globals.rb +12 -0
- data/spaceship/lib/spaceship/helper/net_http_generic_request.rb +20 -0
- data/spaceship/lib/spaceship/helper/plist_middleware.rb +16 -0
- data/spaceship/lib/spaceship/helper/rels_middleware.rb +28 -0
- data/spaceship/lib/spaceship/launcher.rb +99 -0
- data/spaceship/lib/spaceship/module.rb +8 -0
- data/spaceship/lib/spaceship/playground.rb +75 -0
- data/spaceship/lib/spaceship/portal/app.rb +201 -0
- data/spaceship/lib/spaceship/portal/app_group.rb +73 -0
- data/spaceship/lib/spaceship/portal/app_service.rb +87 -0
- data/spaceship/lib/spaceship/portal/certificate.rb +365 -0
- data/spaceship/lib/spaceship/portal/cloud_container.rb +74 -0
- data/spaceship/lib/spaceship/portal/device.rb +191 -0
- data/spaceship/lib/spaceship/portal/invite.rb +53 -0
- data/spaceship/lib/spaceship/portal/key.rb +101 -0
- data/spaceship/lib/spaceship/portal/legacy_wrapper.rb +21 -0
- data/spaceship/lib/spaceship/portal/merchant.rb +86 -0
- data/spaceship/lib/spaceship/portal/passbook.rb +78 -0
- data/spaceship/lib/spaceship/portal/person.rb +62 -0
- data/spaceship/lib/spaceship/portal/persons.rb +67 -0
- data/spaceship/lib/spaceship/portal/portal.rb +17 -0
- data/spaceship/lib/spaceship/portal/portal_base.rb +16 -0
- data/spaceship/lib/spaceship/portal/portal_client.rb +862 -0
- data/spaceship/lib/spaceship/portal/provisioning_profile.rb +559 -0
- data/spaceship/lib/spaceship/portal/provisioning_profile_template.rb +52 -0
- data/spaceship/lib/spaceship/portal/spaceship.rb +154 -0
- data/spaceship/lib/spaceship/portal/ui/select_team.rb +116 -0
- data/spaceship/lib/spaceship/portal/website_push.rb +88 -0
- data/spaceship/lib/spaceship/provider.rb +13 -0
- data/spaceship/lib/spaceship/spaceauth_runner.rb +74 -0
- data/spaceship/lib/spaceship/stats_middleware.rb +65 -0
- data/spaceship/lib/spaceship/test_flight.rb +10 -0
- data/spaceship/lib/spaceship/test_flight/app_test_info.rb +40 -0
- data/spaceship/lib/spaceship/test_flight/base.rb +39 -0
- data/spaceship/lib/spaceship/test_flight/beta_review_info.rb +19 -0
- data/spaceship/lib/spaceship/test_flight/build.rb +242 -0
- data/spaceship/lib/spaceship/test_flight/build_trains.rb +50 -0
- data/spaceship/lib/spaceship/test_flight/client.rb +361 -0
- data/spaceship/lib/spaceship/test_flight/export_compliance.rb +12 -0
- data/spaceship/lib/spaceship/test_flight/group.rb +131 -0
- data/spaceship/lib/spaceship/test_flight/test_info.rb +56 -0
- data/spaceship/lib/spaceship/test_flight/tester.rb +136 -0
- data/spaceship/lib/spaceship/tunes/app_analytics.rb +168 -0
- data/spaceship/lib/spaceship/tunes/app_details.rb +147 -0
- data/spaceship/lib/spaceship/tunes/app_image.rb +51 -0
- data/spaceship/lib/spaceship/tunes/app_ratings.rb +58 -0
- data/spaceship/lib/spaceship/tunes/app_review.rb +55 -0
- data/spaceship/lib/spaceship/tunes/app_review_attachment.rb +49 -0
- data/spaceship/lib/spaceship/tunes/app_screenshot.rb +12 -0
- data/spaceship/lib/spaceship/tunes/app_status.rb +63 -0
- data/spaceship/lib/spaceship/tunes/app_submission.rb +161 -0
- data/spaceship/lib/spaceship/tunes/app_trailer.rb +64 -0
- data/spaceship/lib/spaceship/tunes/app_version.rb +970 -0
- data/spaceship/lib/spaceship/tunes/app_version_common.rb +35 -0
- data/spaceship/lib/spaceship/tunes/app_version_generated_promocodes.rb +28 -0
- data/spaceship/lib/spaceship/tunes/app_version_history.rb +52 -0
- data/spaceship/lib/spaceship/tunes/app_version_promocodes.rb +27 -0
- data/spaceship/lib/spaceship/tunes/app_version_ref.rb +15 -0
- data/spaceship/lib/spaceship/tunes/app_version_states_history.rb +27 -0
- data/spaceship/lib/spaceship/tunes/application.rb +453 -0
- data/spaceship/lib/spaceship/tunes/availability.rb +164 -0
- data/spaceship/lib/spaceship/tunes/b2b_organization.rb +50 -0
- data/spaceship/lib/spaceship/tunes/b2b_user.rb +30 -0
- data/spaceship/lib/spaceship/tunes/build.rb +263 -0
- data/spaceship/lib/spaceship/tunes/build_details.rb +184 -0
- data/spaceship/lib/spaceship/tunes/build_train.rb +181 -0
- data/spaceship/lib/spaceship/tunes/developer_response.rb +23 -0
- data/spaceship/lib/spaceship/tunes/device_type.rb +17 -0
- data/spaceship/lib/spaceship/tunes/display_family.rb +84 -0
- data/spaceship/lib/spaceship/tunes/errors.rb +17 -0
- data/spaceship/lib/spaceship/tunes/iap.rb +168 -0
- data/spaceship/lib/spaceship/tunes/iap_detail.rb +264 -0
- data/spaceship/lib/spaceship/tunes/iap_families.rb +68 -0
- data/spaceship/lib/spaceship/tunes/iap_family_details.rb +90 -0
- data/spaceship/lib/spaceship/tunes/iap_family_list.rb +28 -0
- data/spaceship/lib/spaceship/tunes/iap_list.rb +76 -0
- data/spaceship/lib/spaceship/tunes/iap_status.rb +56 -0
- data/spaceship/lib/spaceship/tunes/iap_subscription_pricing_info.rb +46 -0
- data/spaceship/lib/spaceship/tunes/iap_subscription_pricing_tier.rb +25 -0
- data/spaceship/lib/spaceship/tunes/iap_type.rb +45 -0
- data/spaceship/lib/spaceship/tunes/language_converter.rb +65 -0
- data/spaceship/lib/spaceship/tunes/language_item.rb +61 -0
- data/spaceship/lib/spaceship/tunes/legacy_wrapper.rb +13 -0
- data/spaceship/lib/spaceship/tunes/member.rb +84 -0
- data/spaceship/lib/spaceship/tunes/members.rb +35 -0
- data/spaceship/lib/spaceship/tunes/pricing_info.rb +42 -0
- data/spaceship/lib/spaceship/tunes/pricing_tier.rb +25 -0
- data/spaceship/lib/spaceship/tunes/sandbox_tester.rb +74 -0
- data/spaceship/lib/spaceship/tunes/spaceship.rb +39 -0
- data/spaceship/lib/spaceship/tunes/territory.rb +39 -0
- data/spaceship/lib/spaceship/tunes/transit_app_file.rb +23 -0
- data/spaceship/lib/spaceship/tunes/tunes.rb +35 -0
- data/spaceship/lib/spaceship/tunes/tunes_base.rb +17 -0
- data/spaceship/lib/spaceship/tunes/tunes_client.rb +1644 -0
- data/spaceship/lib/spaceship/tunes/user_detail.rb +15 -0
- data/spaceship/lib/spaceship/tunes/version_set.rb +26 -0
- data/spaceship/lib/spaceship/two_step_or_factor_client.rb +346 -0
- data/spaceship/lib/spaceship/ui.rb +27 -0
- data/supply/README.md +17 -0
- data/supply/lib/supply.rb +53 -0
- data/supply/lib/supply/apk_listing.rb +14 -0
- data/supply/lib/supply/client.rb +551 -0
- data/supply/lib/supply/commands_generator.rb +67 -0
- data/supply/lib/supply/languages.rb +88 -0
- data/supply/lib/supply/listing.rb +32 -0
- data/supply/lib/supply/options.rb +324 -0
- data/supply/lib/supply/reader.rb +41 -0
- data/supply/lib/supply/release_listing.rb +18 -0
- data/supply/lib/supply/setup.rb +122 -0
- data/supply/lib/supply/uploader.rb +480 -0
- metadata +1832 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
require_relative 'module'
|
2
|
+
require_relative 'storage'
|
3
|
+
|
4
|
+
module Match
|
5
|
+
class Setup
|
6
|
+
def run(path, is_swift_fastfile: false)
|
7
|
+
if is_swift_fastfile
|
8
|
+
template = File.read("#{Match::ROOT}/lib/assets/MatchfileTemplate.swift")
|
9
|
+
else
|
10
|
+
template = File.read("#{Match::ROOT}/lib/assets/MatchfileTemplate")
|
11
|
+
end
|
12
|
+
|
13
|
+
storage_mode = UI.select(
|
14
|
+
"fastlane match supports multiple storage modes, please select the one you want to use:",
|
15
|
+
self.storage_options
|
16
|
+
)
|
17
|
+
|
18
|
+
storage = Storage.for_mode(storage_mode, {})
|
19
|
+
|
20
|
+
specific_content = storage.generate_matchfile_content
|
21
|
+
UI.crash!("Looks like `generate_matchfile_content` was `nil` for `#{storage_mode}`") if specific_content.nil?
|
22
|
+
specific_content += "\n\n" if specific_content.length > 0
|
23
|
+
specific_content += "storage_mode(\"#{storage_mode}\")"
|
24
|
+
|
25
|
+
template.gsub!("[[CONTENT]]", specific_content)
|
26
|
+
|
27
|
+
File.write(path, template)
|
28
|
+
UI.success("Successfully created '#{path}'. You can open the file using a code editor.")
|
29
|
+
|
30
|
+
UI.important("You can now run `fastlane match development`, `fastlane match adhoc`, `fastlane match enterprise` and `fastlane match appstore`")
|
31
|
+
UI.message("On the first run for each environment it will create the provisioning profiles and")
|
32
|
+
UI.message("certificates for you. From then on, it will automatically import the existing profiles.")
|
33
|
+
UI.message("For more information visit https://docs.fastlane.tools/actions/match/")
|
34
|
+
end
|
35
|
+
|
36
|
+
def storage_options
|
37
|
+
return ["git", "google_cloud", "s3"]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'spaceship'
|
2
|
+
require_relative 'module'
|
3
|
+
|
4
|
+
module Match
|
5
|
+
# Ensures the certificate and profiles are also available on App Store Connect
|
6
|
+
class SpaceshipEnsure
|
7
|
+
attr_accessor :team_id
|
8
|
+
|
9
|
+
def initialize(user, team_id, team_name, api_token)
|
10
|
+
UI.message("Verifying that the certificate and profile are still valid on the Dev Portal...")
|
11
|
+
|
12
|
+
if api_token
|
13
|
+
UI.message("Creating authorization token for App Store Connect API")
|
14
|
+
Spaceship::ConnectAPI.token = api_token
|
15
|
+
self.team_id = team_id
|
16
|
+
else
|
17
|
+
# We'll try to manually fetch the password
|
18
|
+
# to tell the user that a password is optional
|
19
|
+
require 'credentials_manager/account_manager'
|
20
|
+
|
21
|
+
keychain_entry = CredentialsManager::AccountManager.new(user: user)
|
22
|
+
|
23
|
+
if keychain_entry.password(ask_if_missing: false).to_s.length == 0
|
24
|
+
UI.important("You can also run `fastlane match` in readonly mode to not require any access to the")
|
25
|
+
UI.important("Developer Portal. This way you only share the keys and credentials")
|
26
|
+
UI.command("fastlane match --readonly")
|
27
|
+
UI.important("More information https://docs.fastlane.tools/actions/match/#access-control")
|
28
|
+
end
|
29
|
+
|
30
|
+
# Prompts select team if multiple teams and none specified
|
31
|
+
Spaceship::ConnectAPI.login(user, use_portal: true, use_tunes: false, portal_team_id: team_id, team_name: team_name)
|
32
|
+
self.team_id = Spaceship::ConnectAPI.client.portal_team_id
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# The team ID of the currently logged in team
|
37
|
+
def team_id
|
38
|
+
return @team_id
|
39
|
+
end
|
40
|
+
|
41
|
+
def bundle_identifier_exists(username: nil, app_identifier: nil, platform: nil)
|
42
|
+
found = Spaceship::ConnectAPI::BundleId.find(app_identifier)
|
43
|
+
return if found
|
44
|
+
|
45
|
+
require 'sigh/runner'
|
46
|
+
Sigh::Runner.new.print_produce_command({
|
47
|
+
username: username,
|
48
|
+
app_identifier: app_identifier
|
49
|
+
})
|
50
|
+
UI.error("An app with that bundle ID needs to exist in order to create a provisioning profile for it")
|
51
|
+
UI.error("================================================================")
|
52
|
+
available_apps = Spaceship::ConnectAPI::BundleId.all.collect { |a| "#{a.identifier} (#{a.name})" }
|
53
|
+
UI.message("Available apps:\n- #{available_apps.join("\n- ")}")
|
54
|
+
UI.error("Make sure to run `fastlane match` with the same user and team every time.")
|
55
|
+
UI.user_error!("Couldn't find bundle identifier '#{app_identifier}' for the user '#{username}'")
|
56
|
+
end
|
57
|
+
|
58
|
+
def certificates_exists(username: nil, certificate_ids: [])
|
59
|
+
Spaceship::ConnectAPI::Certificate.all.each do |cert|
|
60
|
+
certificate_ids.delete(cert.id)
|
61
|
+
end
|
62
|
+
return if certificate_ids.empty?
|
63
|
+
|
64
|
+
certificate_ids.each do |certificate_id|
|
65
|
+
UI.error("Certificate '#{certificate_id}' (stored in your storage) is not available on the Developer Portal")
|
66
|
+
end
|
67
|
+
UI.error("for the user #{username}")
|
68
|
+
UI.error("Make sure to use the same user and team every time you run 'match' for this")
|
69
|
+
UI.error("Git repository. This might be caused by revoking the certificate on the Dev Portal")
|
70
|
+
UI.user_error!("To reset the certificates of your Apple account, you can use the `fastlane match nuke` feature, more information on https://docs.fastlane.tools/actions/match/")
|
71
|
+
end
|
72
|
+
|
73
|
+
def profile_exists(username: nil, uuid: nil, platform: nil)
|
74
|
+
# App Store Connect API does not allow filter of profile by platform or uuid (as of 2020-07-30)
|
75
|
+
# Need to fetch all profiles and search for uuid on client side
|
76
|
+
found = Spaceship::ConnectAPI::Profile.all.find do |profile|
|
77
|
+
profile.uuid == uuid
|
78
|
+
end
|
79
|
+
|
80
|
+
unless found
|
81
|
+
UI.error("Provisioning profile '#{uuid}' is not available on the Developer Portal for the user #{username}, fixing this now for you 🔨")
|
82
|
+
return false
|
83
|
+
end
|
84
|
+
|
85
|
+
if found.valid?
|
86
|
+
return found
|
87
|
+
else
|
88
|
+
UI.important("'#{found.name}' is available on the Developer Portal, however it's 'Invalid', fixing this now for you 🔨")
|
89
|
+
# it's easier to just create a new one, than to repair an existing profile
|
90
|
+
# it has the same effects anyway, including a new UUID of the provisioning profile
|
91
|
+
found.delete!
|
92
|
+
# return nil to re-download the new profile in runner.rb
|
93
|
+
return nil
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative 'storage/interface'
|
2
|
+
require_relative 'storage/git_storage'
|
3
|
+
require_relative 'storage/google_cloud_storage'
|
4
|
+
require_relative 'storage/s3_storage'
|
5
|
+
|
6
|
+
module Match
|
7
|
+
module Storage
|
8
|
+
class << self
|
9
|
+
def backends
|
10
|
+
@backends ||= {
|
11
|
+
"git" => lambda { |params|
|
12
|
+
return Storage::GitStorage.configure(params)
|
13
|
+
},
|
14
|
+
"google_cloud" => lambda { |params|
|
15
|
+
return Storage::GoogleCloudStorage.configure(params)
|
16
|
+
},
|
17
|
+
"s3" => lambda { |params|
|
18
|
+
return Storage::S3Storage.configure(params)
|
19
|
+
}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def register_backend(type: nil, storage_class: nil, &configurator)
|
24
|
+
UI.user_error!("No type specified for storage backend") if type.nil?
|
25
|
+
|
26
|
+
normalized_name = type.to_s
|
27
|
+
UI.message("Replacing Match::Encryption backend for type '#{normalized_name}'") if backends.include?(normalized_name)
|
28
|
+
|
29
|
+
if configurator
|
30
|
+
@backends[normalized_name] = configurator
|
31
|
+
elsif storage_class
|
32
|
+
@backends[normalized_name] = ->(params) { return storage_class.configure(params) }
|
33
|
+
else
|
34
|
+
UI.user_error!("Specify either a `storage_class` or a configuration block when registering a storage backend")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def for_mode(storage_mode, params)
|
39
|
+
configurator = backends[storage_mode.to_s]
|
40
|
+
return configurator.call(params) if configurator
|
41
|
+
|
42
|
+
UI.user_error!("No storage backend for storage mode '#{storage_mode}'")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,250 @@
|
|
1
|
+
require 'fastlane_core/command_executor'
|
2
|
+
|
3
|
+
require_relative '../module'
|
4
|
+
require_relative './interface'
|
5
|
+
|
6
|
+
module Match
|
7
|
+
module Storage
|
8
|
+
# Store the code signing identities in a git repo
|
9
|
+
class GitStorage < Interface
|
10
|
+
# User provided values
|
11
|
+
attr_accessor :git_url
|
12
|
+
attr_accessor :shallow_clone
|
13
|
+
attr_accessor :skip_docs
|
14
|
+
attr_accessor :branch
|
15
|
+
attr_accessor :git_full_name
|
16
|
+
attr_accessor :git_user_email
|
17
|
+
attr_accessor :clone_branch_directly
|
18
|
+
attr_accessor :type
|
19
|
+
attr_accessor :platform
|
20
|
+
attr_accessor :git_basic_authorization
|
21
|
+
attr_accessor :git_bearer_authorization
|
22
|
+
attr_accessor :git_private_key
|
23
|
+
|
24
|
+
def self.configure(params)
|
25
|
+
return self.new(
|
26
|
+
type: params[:type].to_s,
|
27
|
+
platform: params[:platform].to_s,
|
28
|
+
git_url: params[:git_url],
|
29
|
+
shallow_clone: params[:shallow_clone],
|
30
|
+
skip_docs: params[:skip_docs],
|
31
|
+
branch: params[:git_branch],
|
32
|
+
git_full_name: params[:git_full_name],
|
33
|
+
git_user_email: params[:git_user_email],
|
34
|
+
clone_branch_directly: params[:clone_branch_directly],
|
35
|
+
git_basic_authorization: params[:git_basic_authorization],
|
36
|
+
git_bearer_authorization: params[:git_bearer_authorization],
|
37
|
+
git_private_key: params[:git_private_key]
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(type: nil,
|
42
|
+
platform: nil,
|
43
|
+
git_url: nil,
|
44
|
+
shallow_clone: nil,
|
45
|
+
skip_docs: false,
|
46
|
+
branch: "master",
|
47
|
+
git_full_name: nil,
|
48
|
+
git_user_email: nil,
|
49
|
+
clone_branch_directly: false,
|
50
|
+
git_basic_authorization: nil,
|
51
|
+
git_bearer_authorization: nil,
|
52
|
+
git_private_key: nil)
|
53
|
+
self.git_url = git_url
|
54
|
+
self.shallow_clone = shallow_clone
|
55
|
+
self.skip_docs = skip_docs
|
56
|
+
self.branch = branch
|
57
|
+
self.git_full_name = git_full_name
|
58
|
+
self.git_user_email = git_user_email
|
59
|
+
self.clone_branch_directly = clone_branch_directly
|
60
|
+
self.git_basic_authorization = git_basic_authorization
|
61
|
+
self.git_bearer_authorization = git_bearer_authorization
|
62
|
+
self.git_private_key = git_private_key
|
63
|
+
|
64
|
+
self.type = type if type
|
65
|
+
self.platform = platform if platform
|
66
|
+
end
|
67
|
+
|
68
|
+
def prefixed_working_directory
|
69
|
+
return working_directory
|
70
|
+
end
|
71
|
+
|
72
|
+
def download
|
73
|
+
# Check if we already have a functional working_directory
|
74
|
+
return if @working_directory
|
75
|
+
|
76
|
+
# No existing working directory, creating a new one now
|
77
|
+
self.working_directory = Dir.mktmpdir
|
78
|
+
|
79
|
+
command = "git clone #{self.git_url.shellescape} #{self.working_directory.shellescape}"
|
80
|
+
# HTTP headers are supposed to be be case insensitive but
|
81
|
+
# Bitbucket requires `Authorization: Basic` and `Authorization Bearer` to work
|
82
|
+
# https://github.com/fastlane/fastlane/pull/15928
|
83
|
+
command << " -c http.extraheader='Authorization: Basic #{self.git_basic_authorization}'" unless self.git_basic_authorization.nil?
|
84
|
+
command << " -c http.extraheader='Authorization: Bearer #{self.git_bearer_authorization}'" unless self.git_bearer_authorization.nil?
|
85
|
+
|
86
|
+
if self.shallow_clone
|
87
|
+
command << " --depth 1 --no-single-branch"
|
88
|
+
elsif self.clone_branch_directly
|
89
|
+
command += " -b #{self.branch.shellescape} --single-branch"
|
90
|
+
end
|
91
|
+
|
92
|
+
unless self.git_private_key.nil?
|
93
|
+
if File.file?(self.git_private_key)
|
94
|
+
ssh_add = File.expand_path(self.git_private_key).shellescape.to_s
|
95
|
+
else
|
96
|
+
UI.message("Private key file does not exist, will continue by using it as a raw key.")
|
97
|
+
ssh_add = "- <<< \"#{self.git_private_key}\""
|
98
|
+
end
|
99
|
+
command = "ssh-agent bash -c 'ssh-add #{ssh_add}; #{command}'"
|
100
|
+
end
|
101
|
+
|
102
|
+
UI.message("Cloning remote git repo...")
|
103
|
+
if self.branch && !self.clone_branch_directly
|
104
|
+
UI.message("If cloning the repo takes too long, you can use the `clone_branch_directly` option in match.")
|
105
|
+
end
|
106
|
+
|
107
|
+
begin
|
108
|
+
# GIT_TERMINAL_PROMPT will fail the `git clone` command if user credentials are missing
|
109
|
+
Helper.with_env_values('GIT_TERMINAL_PROMPT' => '0') do
|
110
|
+
FastlaneCore::CommandExecutor.execute(command: command,
|
111
|
+
print_all: FastlaneCore::Globals.verbose?,
|
112
|
+
print_command: FastlaneCore::Globals.verbose?)
|
113
|
+
end
|
114
|
+
rescue
|
115
|
+
UI.error("Error cloning certificates repo, please make sure you have read access to the repository you want to use")
|
116
|
+
if self.branch && self.clone_branch_directly
|
117
|
+
UI.error("You passed '#{self.branch}' as branch in combination with the `clone_branch_directly` flag. Please remove `clone_branch_directly` flag on the first run for _match_ to create the branch.")
|
118
|
+
end
|
119
|
+
UI.error("Run the following command manually to make sure you're properly authenticated:")
|
120
|
+
UI.command(command)
|
121
|
+
UI.user_error!("Error cloning certificates git repo, please make sure you have access to the repository - see instructions above")
|
122
|
+
end
|
123
|
+
|
124
|
+
add_user_config(self.git_full_name, self.git_user_email)
|
125
|
+
|
126
|
+
unless File.directory?(self.working_directory)
|
127
|
+
UI.user_error!("Error cloning repo, make sure you have access to it '#{self.git_url}'")
|
128
|
+
end
|
129
|
+
|
130
|
+
checkout_branch
|
131
|
+
end
|
132
|
+
|
133
|
+
def human_readable_description
|
134
|
+
"Git Repo [#{self.git_url}]"
|
135
|
+
end
|
136
|
+
|
137
|
+
def delete_files(files_to_delete: [], custom_message: nil)
|
138
|
+
# No specific list given, e.g. this happens on `fastlane match nuke`
|
139
|
+
# We just want to run `git add -A` to commit everything
|
140
|
+
git_push(commands: ["git add -A"], commit_message: custom_message)
|
141
|
+
end
|
142
|
+
|
143
|
+
def upload_files(files_to_upload: [], custom_message: nil)
|
144
|
+
commands = files_to_upload.map do |current_file|
|
145
|
+
"git add #{current_file.shellescape}"
|
146
|
+
end
|
147
|
+
|
148
|
+
git_push(commands: commands, commit_message: custom_message)
|
149
|
+
end
|
150
|
+
|
151
|
+
# Generate the commit message based on the user's parameters
|
152
|
+
def generate_commit_message
|
153
|
+
[
|
154
|
+
"[fastlane]",
|
155
|
+
"Updated",
|
156
|
+
self.type,
|
157
|
+
"and platform",
|
158
|
+
self.platform
|
159
|
+
].join(" ")
|
160
|
+
end
|
161
|
+
|
162
|
+
def generate_matchfile_content
|
163
|
+
UI.important("Please create a new, private git repository to store the certificates and profiles there")
|
164
|
+
url = UI.input("URL of the Git Repo: ")
|
165
|
+
|
166
|
+
return "git_url(\"#{url}\")"
|
167
|
+
end
|
168
|
+
|
169
|
+
def list_files(file_name: "", file_ext: "")
|
170
|
+
Dir[File.join(working_directory, "**", file_name, "*.#{file_ext}")]
|
171
|
+
end
|
172
|
+
|
173
|
+
private
|
174
|
+
|
175
|
+
# Create and checkout an specific branch in the git repo
|
176
|
+
def checkout_branch
|
177
|
+
return unless self.working_directory
|
178
|
+
|
179
|
+
commands = []
|
180
|
+
if branch_exists?(self.branch)
|
181
|
+
# Checkout the branch if it already exists
|
182
|
+
commands << "git checkout #{self.branch.shellescape}"
|
183
|
+
else
|
184
|
+
# If a new branch is being created, we create it as an 'orphan' to not inherit changes from the master branch.
|
185
|
+
commands << "git checkout --orphan #{self.branch.shellescape}"
|
186
|
+
# We also need to reset the working directory to not transfer any uncommitted changes to the new branch.
|
187
|
+
commands << "git reset --hard"
|
188
|
+
end
|
189
|
+
|
190
|
+
UI.message("Checking out branch #{self.branch}...")
|
191
|
+
|
192
|
+
Dir.chdir(self.working_directory) do
|
193
|
+
commands.each do |command|
|
194
|
+
FastlaneCore::CommandExecutor.execute(command: command,
|
195
|
+
print_all: FastlaneCore::Globals.verbose?,
|
196
|
+
print_command: FastlaneCore::Globals.verbose?)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
# Checks if a specific branch exists in the git repo
|
202
|
+
def branch_exists?(branch)
|
203
|
+
return unless self.working_directory
|
204
|
+
|
205
|
+
result = Dir.chdir(self.working_directory) do
|
206
|
+
FastlaneCore::CommandExecutor.execute(command: "git --no-pager branch --list origin/#{branch.shellescape} --no-color -r",
|
207
|
+
print_all: FastlaneCore::Globals.verbose?,
|
208
|
+
print_command: FastlaneCore::Globals.verbose?)
|
209
|
+
end
|
210
|
+
return !result.empty?
|
211
|
+
end
|
212
|
+
|
213
|
+
def add_user_config(user_name, user_email)
|
214
|
+
# Add git config if needed
|
215
|
+
commands = []
|
216
|
+
commands << "git config user.name \"#{user_name}\"" unless user_name.nil?
|
217
|
+
commands << "git config user.email \"#{user_email}\"" unless user_email.nil?
|
218
|
+
|
219
|
+
return if commands.empty?
|
220
|
+
|
221
|
+
UI.message("Add git user config to local git repo...")
|
222
|
+
Dir.chdir(self.working_directory) do
|
223
|
+
commands.each do |command|
|
224
|
+
FastlaneCore::CommandExecutor.execute(command: command,
|
225
|
+
print_all: FastlaneCore::Globals.verbose?,
|
226
|
+
print_command: FastlaneCore::Globals.verbose?)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
def git_push(commands: [], commit_message: nil)
|
232
|
+
commit_message ||= generate_commit_message
|
233
|
+
commands << "git commit -m #{commit_message.shellescape}"
|
234
|
+
commands << "git push origin #{self.branch.shellescape}"
|
235
|
+
|
236
|
+
UI.message("Pushing changes to remote git repo...")
|
237
|
+
Helper.with_env_values('GIT_TERMINAL_PROMPT' => '0') do
|
238
|
+
commands.each do |command|
|
239
|
+
FastlaneCore::CommandExecutor.execute(command: command,
|
240
|
+
print_all: FastlaneCore::Globals.verbose?,
|
241
|
+
print_command: FastlaneCore::Globals.verbose?)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
rescue => ex
|
245
|
+
UI.error("Couldn't commit or push changes back to git...")
|
246
|
+
UI.error(ex)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
@@ -0,0 +1,382 @@
|
|
1
|
+
require 'fastlane_core/command_executor'
|
2
|
+
require 'fastlane_core/configuration/configuration'
|
3
|
+
require 'google/cloud/storage'
|
4
|
+
|
5
|
+
require_relative '../options'
|
6
|
+
require_relative '../module'
|
7
|
+
require_relative '../spaceship_ensure'
|
8
|
+
require_relative './interface'
|
9
|
+
|
10
|
+
module Match
|
11
|
+
module Storage
|
12
|
+
# Store the code signing identities in on Google Cloud Storage
|
13
|
+
class GoogleCloudStorage < Interface
|
14
|
+
DEFAULT_KEYS_FILE_NAME = "gc_keys.json"
|
15
|
+
|
16
|
+
# User provided values
|
17
|
+
attr_reader :type
|
18
|
+
attr_reader :platform
|
19
|
+
attr_reader :bucket_name
|
20
|
+
attr_reader :google_cloud_keys_file
|
21
|
+
attr_reader :google_cloud_project_id
|
22
|
+
attr_reader :readonly
|
23
|
+
attr_reader :username
|
24
|
+
attr_reader :team_id
|
25
|
+
attr_reader :team_name
|
26
|
+
attr_reader :api_key_path
|
27
|
+
attr_reader :api_key
|
28
|
+
|
29
|
+
# Managed values
|
30
|
+
attr_accessor :gc_storage
|
31
|
+
|
32
|
+
def self.configure(params)
|
33
|
+
if params[:git_url].to_s.length > 0
|
34
|
+
UI.important("Looks like you still define a `git_url` somewhere, even though")
|
35
|
+
UI.important("you use Google Cloud Storage. You can remove the `git_url`")
|
36
|
+
UI.important("from your Matchfile and Fastfile")
|
37
|
+
UI.message("The above is just a warning, fastlane will continue as usual now...")
|
38
|
+
end
|
39
|
+
|
40
|
+
return self.new(
|
41
|
+
type: params[:type].to_s,
|
42
|
+
platform: params[:platform].to_s,
|
43
|
+
google_cloud_bucket_name: params[:google_cloud_bucket_name],
|
44
|
+
google_cloud_keys_file: params[:google_cloud_keys_file],
|
45
|
+
google_cloud_project_id: params[:google_cloud_project_id],
|
46
|
+
readonly: params[:readonly],
|
47
|
+
username: params[:username],
|
48
|
+
team_id: params[:team_id],
|
49
|
+
team_name: params[:team_name],
|
50
|
+
api_key_path: params[:api_key_path],
|
51
|
+
api_key: params[:api_key]
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
def initialize(type: nil,
|
56
|
+
platform: nil,
|
57
|
+
google_cloud_bucket_name: nil,
|
58
|
+
google_cloud_keys_file: nil,
|
59
|
+
google_cloud_project_id: nil,
|
60
|
+
readonly: nil,
|
61
|
+
username: nil,
|
62
|
+
team_id: nil,
|
63
|
+
team_name: nil,
|
64
|
+
api_key_path: nil,
|
65
|
+
api_key: nil)
|
66
|
+
@type = type if type
|
67
|
+
@platform = platform if platform
|
68
|
+
@google_cloud_project_id = google_cloud_project_id if google_cloud_project_id
|
69
|
+
@bucket_name = google_cloud_bucket_name
|
70
|
+
|
71
|
+
@readonly = readonly
|
72
|
+
@username = username
|
73
|
+
@team_id = team_id
|
74
|
+
@team_name = team_name
|
75
|
+
|
76
|
+
@api_key_path = api_key_path
|
77
|
+
@api_key = api_key
|
78
|
+
|
79
|
+
@google_cloud_keys_file = ensure_keys_file_exists(google_cloud_keys_file, google_cloud_project_id)
|
80
|
+
|
81
|
+
if self.google_cloud_keys_file.to_s.length > 0
|
82
|
+
# Extract the Project ID from the `JSON` file
|
83
|
+
# so the user doesn't have to provide it manually
|
84
|
+
keys_file_content = JSON.parse(File.read(self.google_cloud_keys_file))
|
85
|
+
if google_cloud_project_id.to_s.length > 0 && google_cloud_project_id != keys_file_content["project_id"]
|
86
|
+
UI.important("The google_cloud_keys_file's project ID ('#{keys_file_content['project_id']}') doesn't match the google_cloud_project_id ('#{google_cloud_project_id}'). This may be the wrong keys file.")
|
87
|
+
end
|
88
|
+
@google_cloud_project_id = keys_file_content["project_id"]
|
89
|
+
if self.google_cloud_project_id.to_s.length == 0
|
90
|
+
UI.user_error!("Provided keys file on path #{File.expand_path(self.google_cloud_keys_file)} doesn't include required value for `project_id`")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Create the Google Cloud Storage client
|
95
|
+
# If the JSON auth file is invalid, this line will
|
96
|
+
# raise an exception
|
97
|
+
begin
|
98
|
+
self.gc_storage = Google::Cloud::Storage.new(
|
99
|
+
credentials: self.google_cloud_keys_file,
|
100
|
+
project_id: self.google_cloud_project_id
|
101
|
+
)
|
102
|
+
rescue => ex
|
103
|
+
UI.error(ex)
|
104
|
+
UI.verbose(ex.backtrace.join("\n"))
|
105
|
+
UI.user_error!("Couldn't log into your Google Cloud account using the provided JSON file at path '#{File.expand_path(self.google_cloud_keys_file)}'")
|
106
|
+
end
|
107
|
+
|
108
|
+
ensure_bucket_is_selected
|
109
|
+
check_bucket_permissions
|
110
|
+
end
|
111
|
+
|
112
|
+
def currently_used_team_id
|
113
|
+
if self.readonly
|
114
|
+
# In readonly mode, we still want to see if the user provided a team_id
|
115
|
+
# see `prefixed_working_directory` comments for more details
|
116
|
+
return self.team_id
|
117
|
+
else
|
118
|
+
UI.user_error!("The `team_id` option is required. fastlane cannot automatically determine portal team id via the App Store Connect API (yet)") if self.team_id.to_s.empty?
|
119
|
+
|
120
|
+
spaceship = SpaceshipEnsure.new(self.username, self.team_id, self.team_name, self.api_token)
|
121
|
+
return spaceship.team_id
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def api_token
|
126
|
+
api_token ||= Spaceship::ConnectAPI::Token.create(self.api_key) if self.api_key
|
127
|
+
api_token ||= Spaceship::ConnectAPI::Token.from_json_file(self.api_key_path) if self.api_key_path
|
128
|
+
return api_token
|
129
|
+
end
|
130
|
+
|
131
|
+
def prefixed_working_directory
|
132
|
+
# We fall back to "*", which means certificates and profiles
|
133
|
+
# from all teams that use this bucket would be installed. This is not ideal, but
|
134
|
+
# unless the user provides a `team_id`, we can't know which one to use
|
135
|
+
# This only happens if `readonly` is activated, and no `team_id` was provided
|
136
|
+
@_folder_prefix ||= currently_used_team_id
|
137
|
+
if @_folder_prefix.nil?
|
138
|
+
# We use a `@_folder_prefix` variable, to keep state between multiple calls of this
|
139
|
+
# method, as the value won't change. This way the warning is only printed once
|
140
|
+
UI.important("Looks like you run `match` in `readonly` mode, and didn't provide a `team_id`. This will still work, however it is recommended to provide a `team_id` in your Appfile or Matchfile")
|
141
|
+
@_folder_prefix = "*"
|
142
|
+
end
|
143
|
+
return File.join(working_directory, @_folder_prefix)
|
144
|
+
end
|
145
|
+
|
146
|
+
def download
|
147
|
+
# Check if we already have a functional working_directory
|
148
|
+
return if @working_directory
|
149
|
+
|
150
|
+
# No existing working directory, creating a new one now
|
151
|
+
self.working_directory = Dir.mktmpdir
|
152
|
+
|
153
|
+
bucket.files.each do |current_file|
|
154
|
+
file_path = current_file.name # e.g. "N8X438SEU2/certs/distribution/XD9G7QCACF.cer"
|
155
|
+
download_path = File.join(self.working_directory, file_path)
|
156
|
+
|
157
|
+
FileUtils.mkdir_p(File.expand_path("..", download_path))
|
158
|
+
UI.verbose("Downloading file from Google Cloud Storage '#{file_path}' on bucket #{self.bucket_name}")
|
159
|
+
current_file.download(download_path)
|
160
|
+
end
|
161
|
+
UI.verbose("Successfully downloaded files from GCS to #{self.working_directory}")
|
162
|
+
end
|
163
|
+
|
164
|
+
def delete_files(files_to_delete: [], custom_message: nil)
|
165
|
+
files_to_delete.each do |current_file|
|
166
|
+
target_path = current_file.gsub(self.working_directory + "/", "")
|
167
|
+
file = bucket.file(target_path)
|
168
|
+
UI.message("Deleting '#{target_path}' from Google Cloud Storage bucket '#{self.bucket_name}'...")
|
169
|
+
file.delete
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def human_readable_description
|
174
|
+
"Google Cloud Bucket [#{self.google_cloud_project_id}/#{self.bucket_name}]"
|
175
|
+
end
|
176
|
+
|
177
|
+
def upload_files(files_to_upload: [], custom_message: nil)
|
178
|
+
# `files_to_upload` is an array of files that need to be uploaded to Google Cloud
|
179
|
+
# Those doesn't mean they're new, it might just be they're changed
|
180
|
+
# Either way, we'll upload them using the same technique
|
181
|
+
|
182
|
+
files_to_upload.each do |current_file|
|
183
|
+
# Go from
|
184
|
+
# "/var/folders/px/bz2kts9n69g8crgv4jpjh6b40000gn/T/d20181026-96528-1av4gge/profiles/development/Development_me.mobileprovision"
|
185
|
+
# to
|
186
|
+
# "profiles/development/Development_me.mobileprovision"
|
187
|
+
#
|
188
|
+
|
189
|
+
# We also have to remove the trailing `/` as Google Cloud doesn't handle it nicely
|
190
|
+
target_path = current_file.gsub(self.working_directory + "/", "")
|
191
|
+
UI.verbose("Uploading '#{target_path}' to Google Cloud Storage...")
|
192
|
+
bucket.create_file(current_file, target_path)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def skip_docs
|
197
|
+
false
|
198
|
+
end
|
199
|
+
|
200
|
+
def list_files(file_name: "", file_ext: "")
|
201
|
+
Dir[File.join(working_directory, self.team_id, "**", file_name, "*.#{file_ext}")]
|
202
|
+
end
|
203
|
+
|
204
|
+
def generate_matchfile_content
|
205
|
+
return "google_cloud_bucket_name(\"#{self.bucket_name}\")"
|
206
|
+
end
|
207
|
+
|
208
|
+
private
|
209
|
+
|
210
|
+
def bucket
|
211
|
+
@_bucket ||= self.gc_storage.bucket(self.bucket_name)
|
212
|
+
|
213
|
+
if @_bucket.nil?
|
214
|
+
UI.user_error!("Couldn't find Google Cloud Storage bucket with name #{self.bucket_name} for the currently used account. Please make sure you have access")
|
215
|
+
end
|
216
|
+
|
217
|
+
return @_bucket
|
218
|
+
end
|
219
|
+
|
220
|
+
##########################
|
221
|
+
# Setup related methods
|
222
|
+
##########################
|
223
|
+
|
224
|
+
# This method will make sure the keys file exists
|
225
|
+
# If it's missing, it will help the user set things up
|
226
|
+
def ensure_keys_file_exists(google_cloud_keys_file, google_cloud_project_id)
|
227
|
+
if google_cloud_keys_file && File.exist?(google_cloud_keys_file)
|
228
|
+
return google_cloud_keys_file
|
229
|
+
end
|
230
|
+
|
231
|
+
return DEFAULT_KEYS_FILE_NAME if File.exist?(DEFAULT_KEYS_FILE_NAME)
|
232
|
+
|
233
|
+
fastlane_folder_gc_keys_path = File.join(FastlaneCore::FastlaneFolder.path || Dir.pwd, DEFAULT_KEYS_FILE_NAME)
|
234
|
+
return fastlane_folder_gc_keys_path if File.exist?(fastlane_folder_gc_keys_path)
|
235
|
+
|
236
|
+
if google_cloud_project_id.to_s.length > 0
|
237
|
+
# Check to see if this system has application default keys installed.
|
238
|
+
# These are the default keys that the Google Cloud APIs use when no other keys are specified.
|
239
|
+
# Users with the Google Cloud SDK installed can generate them by running...
|
240
|
+
# `gcloud auth application-default login`
|
241
|
+
# ...and then they'll be automatically available.
|
242
|
+
# The nice thing about these keys is they can be associated with the user's login in GCP
|
243
|
+
# (e.g. my_account@gmail.com), so teams can control access to the certificate bucket
|
244
|
+
# using a mailing list of developer logins instead of generating service accounts
|
245
|
+
# and keys.
|
246
|
+
application_default_keys = nil
|
247
|
+
begin
|
248
|
+
application_default_keys = Google::Auth.get_application_default
|
249
|
+
rescue
|
250
|
+
# This means no application default keys have been installed. That's perfectly OK,
|
251
|
+
# we can continue and ask the user if they want to use a keys file.
|
252
|
+
end
|
253
|
+
|
254
|
+
if application_default_keys && UI.confirm("Do you want to use this system's Google Cloud application default keys?")
|
255
|
+
return nil
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
# User doesn't seem to have provided a keys file
|
260
|
+
UI.message("Looks like you don't have a Google Cloud #{DEFAULT_KEYS_FILE_NAME.cyan} file yet.")
|
261
|
+
UI.message("If you have one, make sure to put it into the '#{Dir.pwd}' directory and call it '#{DEFAULT_KEYS_FILE_NAME.cyan}'.")
|
262
|
+
unless UI.confirm("Do you want fastlane to help you to create a #{DEFAULT_KEYS_FILE_NAME} file?")
|
263
|
+
UI.user_error!("Process stopped, run fastlane again to start things up again")
|
264
|
+
end
|
265
|
+
|
266
|
+
UI.message("fastlane will help you create a keys file. Start by opening the following website:")
|
267
|
+
UI.message("")
|
268
|
+
UI.message("\t\thttps://console.cloud.google.com".cyan)
|
269
|
+
UI.message("")
|
270
|
+
UI.input("Press [Enter] once you're logged in")
|
271
|
+
|
272
|
+
UI.message("First, switch to the Google Cloud project you want to use.")
|
273
|
+
UI.message("If you don't have one yet, create a new one and switch to it.")
|
274
|
+
UI.message("")
|
275
|
+
UI.message("\t\thttps://console.cloud.google.com/projectcreate".cyan)
|
276
|
+
UI.message("")
|
277
|
+
UI.input("Press [Enter] once you selected the right project")
|
278
|
+
|
279
|
+
UI.message("Next fastlane will show you the steps to create a keys file.")
|
280
|
+
UI.message("For this it might be useful to switch the Google Cloud interface to English.")
|
281
|
+
UI.message("Append " + "&hl=en".cyan + " to the URL and the interface should be in English.")
|
282
|
+
UI.input("Press [Enter] to continue")
|
283
|
+
|
284
|
+
UI.message("Now it's time to generate a new JSON auth file for fastlane to access Google Cloud Storage:")
|
285
|
+
UI.message("")
|
286
|
+
UI.message("\t\t 1. From the side menu choose 'APIs & Services' and then 'Credentials'".cyan)
|
287
|
+
UI.message("\t\t 2. Click 'Create credentials'".cyan)
|
288
|
+
UI.message("\t\t 3. Choose 'Service account key'".cyan)
|
289
|
+
UI.message("\t\t 4. Select 'New service account'".cyan)
|
290
|
+
UI.message("\t\t 5. Enter a name and ID for the service account".cyan)
|
291
|
+
UI.message("\t\t 6. Don't give the service account a role just yet!".cyan)
|
292
|
+
UI.message("\t\t 7. Make sure the key type is set to 'JSON'".cyan)
|
293
|
+
UI.message("\t\t 8. Click 'Create'".cyan)
|
294
|
+
UI.message("")
|
295
|
+
UI.input("Confirm with [Enter] once you created and downloaded the JSON file")
|
296
|
+
|
297
|
+
UI.message("Copy the file to the current directory (#{Dir.pwd})")
|
298
|
+
UI.message("and rename it to `#{DEFAULT_KEYS_FILE_NAME.cyan}`")
|
299
|
+
UI.message("")
|
300
|
+
UI.input("Confirm with [Enter]")
|
301
|
+
|
302
|
+
until File.exist?(DEFAULT_KEYS_FILE_NAME)
|
303
|
+
UI.message("Make sure to place the file in '#{Dir.pwd.cyan}' and name it '#{DEFAULT_KEYS_FILE_NAME.cyan}'")
|
304
|
+
UI.message("")
|
305
|
+
UI.input("Confirm with [Enter]")
|
306
|
+
end
|
307
|
+
|
308
|
+
UI.important("Please never add the #{DEFAULT_KEYS_FILE_NAME.cyan} file in version control.")
|
309
|
+
UI.important("Instead please add the file to your `.gitignore` file")
|
310
|
+
UI.message("")
|
311
|
+
UI.input("Confirm with [Enter]")
|
312
|
+
|
313
|
+
return DEFAULT_KEYS_FILE_NAME
|
314
|
+
end
|
315
|
+
|
316
|
+
def ensure_bucket_is_selected
|
317
|
+
# Skip the instructions if the user provided a bucket name
|
318
|
+
return unless self.bucket_name.to_s.length == 0
|
319
|
+
|
320
|
+
created_bucket = UI.confirm("Did you already create a Google Cloud Storage bucket?")
|
321
|
+
while self.bucket_name.to_s.length == 0
|
322
|
+
unless created_bucket
|
323
|
+
UI.message("Create a bucket at the following URL:")
|
324
|
+
UI.message("")
|
325
|
+
UI.message("\t\thttps://console.cloud.google.com/storage/browser".cyan)
|
326
|
+
UI.message("")
|
327
|
+
UI.message("Make sure to select the right project at the top of the page!")
|
328
|
+
UI.message("")
|
329
|
+
UI.message("\t\t 1. Click 'Create bucket'".cyan)
|
330
|
+
UI.message("\t\t 2. Enter a unique name".cyan)
|
331
|
+
UI.message("\t\t 3. Select a geographic location for your bucket".cyan)
|
332
|
+
UI.message("\t\t 4. Make sure the storage class is set to 'Standard'".cyan)
|
333
|
+
UI.message("\t\t 5. Click 'Create' to create the bucket".cyan)
|
334
|
+
UI.message("")
|
335
|
+
UI.input("Press [Enter] once you created a bucket")
|
336
|
+
end
|
337
|
+
bucket_name = UI.input("Enter the name of your bucket: ")
|
338
|
+
|
339
|
+
# Verify if the bucket exists
|
340
|
+
begin
|
341
|
+
bucket_exists = !self.gc_storage.bucket(bucket_name).nil?
|
342
|
+
rescue Google::Cloud::PermissionDeniedError
|
343
|
+
bucket_exists = true
|
344
|
+
end
|
345
|
+
created_bucket = bucket_exists
|
346
|
+
if bucket_exists
|
347
|
+
@bucket_name = bucket_name
|
348
|
+
else
|
349
|
+
UI.error("It looks like the bucket '#{bucket_name}' doesn't exist. Make sure to create it first.")
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
def check_bucket_permissions
|
355
|
+
bucket = nil
|
356
|
+
while bucket.nil?
|
357
|
+
begin
|
358
|
+
bucket = self.gc_storage.bucket(self.bucket_name)
|
359
|
+
rescue Google::Cloud::PermissionDeniedError
|
360
|
+
bucket = nil
|
361
|
+
end
|
362
|
+
return if bucket.nil? == false
|
363
|
+
UI.error("Looks like your Google Cloud account for the project ID '#{self.google_cloud_project_id}' doesn't")
|
364
|
+
UI.error("have access to the storage bucket '#{self.bucket_name}'. Please visit the following URL:")
|
365
|
+
UI.message("")
|
366
|
+
UI.message("\t\thttps://console.cloud.google.com/storage/browser".cyan)
|
367
|
+
UI.message("")
|
368
|
+
UI.message("You need to give your account the correct permissions:")
|
369
|
+
UI.message("")
|
370
|
+
UI.message("\t\t 1. Click on your bucket to open it".cyan)
|
371
|
+
UI.message("\t\t 2. Click 'Permissions'".cyan)
|
372
|
+
UI.message("\t\t 3. Click 'Add members'".cyan)
|
373
|
+
UI.message("\t\t 4. Enter the service account email address".cyan)
|
374
|
+
UI.message("\t\t 5. Set the role to 'Storage Admin'".cyan)
|
375
|
+
UI.message("\t\t 6. Click 'Save'".cyan)
|
376
|
+
UI.message("")
|
377
|
+
UI.input("Confirm with [Enter] once you're finished")
|
378
|
+
end
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|