diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f15bc151bb..32cb88ca4a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -18,7 +18,7 @@ internal: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 - python3 -u build-system/Make/DeployToAppCenter.py --configuration="$TELEGRAM_PRIVATE_DATA_PATH/appcenter-configurations/appcenter-internal.json" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" environment: name: internal @@ -37,7 +37,7 @@ appstore_development: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 - python3 -u build-system/Make/DeployToAppCenter.py --configuration="$TELEGRAM_PRIVATE_DATA_PATH/appcenter-configurations/appstore-development.json" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" environment: name: appstore-development @@ -55,7 +55,7 @@ experimental_i: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 - python3 -u build-system/Make/DeployToAppCenter.py --configuration="$TELEGRAM_PRIVATE_DATA_PATH/appcenter-configurations/appcenter-experimental.json" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" environment: name: experimental @@ -73,7 +73,7 @@ experimental: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="$TELEGRAM_PRIVATE_DATA_PATH/build-configurations/enterprise-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=enterprise --configuration=release_arm64 - python3 -u build-system/Make/DeployToAppCenter.py --configuration="$TELEGRAM_PRIVATE_DATA_PATH/appcenter-configurations/appcenter-experimental2.json" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" environment: name: experimental-2 @@ -92,7 +92,7 @@ beta_testflight: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=appstore --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --gitCodesigningRepository="$TELEGRAM_GIT_CODESIGNING_REPOSITORY" --gitCodesigningType=appstore --configuration=release_arm64 environment: name: testflight_llc artifacts: @@ -110,7 +110,7 @@ deploy_beta_testflight: except: - tags script: - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-deploy-testflight --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" + - python3 -u build-system/Make/Make.py remote-deploy-testflight --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa="build/artifacts/Telegram.ipa" --dsyms="build/artifacts/Telegram.DSYMs.zip" environment: name: testflight_llc @@ -125,8 +125,8 @@ verifysanity_beta_testflight: - tags script: - rm -rf build/verify-input && mkdir -p build/verify-input && mv build/artifacts/Telegram.ipa build/verify-input/TelegramVerifySource.ipa - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64 - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-ipa-diff --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa1="build/artifacts/Telegram.ipa" --ipa2="build/verify-input/TelegramVerifySource.ipa" + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --cacheHost="$TELEGRAM_BAZEL_CACHE_HOST" --configurationPath="build-system/appstore-configuration.json" --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-ipa-diff --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa1="build/artifacts/Telegram.ipa" --ipa2="build/verify-input/TelegramVerifySource.ipa" - if [ $? -ne 0 ]; then echo "Verification failed"; mkdir -p build/verifysanity_artifacts; cp build/artifacts/Telegram.ipa build/verifysanity_artifacts/; exit 1; fi environment: name: testflight_llc @@ -147,8 +147,8 @@ verify_beta_testflight: - tags script: - rm -rf build/verify-input && mkdir -p build/verify-input && mv build/artifacts/Telegram.ipa build/verify-input/TelegramVerifySource.ipa - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-build --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --configurationPath="build-system/appstore-configuration.json" --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64 - - PYTHONPATH="$PYTHONPATH:/darwin-containers" python3 -u build-system/Make/Make.py remote-ipa-diff --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa1="build/artifacts/Telegram.ipa" --ipa2="build/verify-input/TelegramVerifySource.ipa" + - python3 -u build-system/Make/Make.py remote-build --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --configurationPath="build-system/appstore-configuration.json" --codesigningInformationPath=build-system/fake-codesigning --configuration=release_arm64 + - python3 -u build-system/Make/Make.py remote-ipa-diff --darwinContainers="$DARWIN_CONTAINERS" --darwinContainersHost="$DARWIN_CONTAINERS_HOST" --ipa1="build/artifacts/Telegram.ipa" --ipa2="build/verify-input/TelegramVerifySource.ipa" - if [ $? -ne 0 ]; then echo "Verification failed"; mkdir -p build/verify_artifacts; cp build/artifacts/Telegram.ipa build/verify_artifacts/; exit 1; fi environment: name: testflight_llc diff --git a/build-system/Make/GenerateProfiles.py b/build-system/Make/GenerateProfiles.py new file mode 100644 index 0000000000..0992d95a82 --- /dev/null +++ b/build-system/Make/GenerateProfiles.py @@ -0,0 +1,44 @@ +import json +import os +import sys +import shutil +import tempfile +import plistlib +import argparse + +from BuildEnvironment import run_executable_with_output, check_run_system + + +def get_certificate_base64(): + certificate_data = run_executable_with_output('security', arguments=['find-certificate', '-c', 'Apple Distribution: Telegram FZ-LLC (C67CF9S4VU)', '-p']) + certificate_data = certificate_data.replace('-----BEGIN CERTIFICATE-----', '') + certificate_data = certificate_data.replace('-----END CERTIFICATE-----', '') + certificate_data = certificate_data.replace('\n', '') + return certificate_data + + +def process_provisioning_profile(source, destination, certificate_data): + parsed_plist = run_executable_with_output('security', arguments=['cms', '-D', '-i', source], check_result=True) + parsed_plist_file = tempfile.mktemp() + with open(parsed_plist_file, 'w+') as file: + file.write(parsed_plist) + + run_executable_with_output('plutil', arguments=['-remove', 'DeveloperCertificates.0', parsed_plist_file]) + run_executable_with_output('plutil', arguments=['-insert', 'DeveloperCertificates.0', '-data', certificate_data, parsed_plist_file]) + run_executable_with_output('plutil', arguments=['-remove', 'DER-Encoded-Profile', parsed_plist_file]) + + run_executable_with_output('security', arguments=['cms', '-S', '-N', 'Apple Distribution: Telegram FZ-LLC (C67CF9S4VU)', '-i', parsed_plist_file, '-o', destination]) + + os.unlink(parsed_plist_file) + + +def generate_provisioning_profiles(source_path, destination_path): + certificate_data = get_certificate_base64() + + if not os.path.exists(destination_path): + print('{} does not exits'.format(destination_path)) + sys.exit(1) + + for file_name in os.listdir(source_path): + if file_name.endswith('.mobileprovision'): + process_provisioning_profile(source=source_path + '/' + file_name, destination=destination_path + '/' + file_name, certificate_data=certificate_data) diff --git a/build-system/Make/Make.py b/build-system/Make/Make.py index 767965719d..b485cba259 100644 --- a/build-system/Make/Make.py +++ b/build-system/Make/Make.py @@ -14,6 +14,7 @@ from ProjectGeneration import generate from BazelLocation import locate_bazel from BuildConfiguration import CodesigningSource, GitCodesigningSource, DirectoryCodesigningSource, BuildConfiguration, build_configuration_from_json import RemoteBuild +import GenerateProfiles class ResolvedCodesigningData: @@ -920,6 +921,12 @@ if __name__ == '__main__': type=str, help='DarwinContainers host address.' ) + remote_build_parser.add_argument( + '--darwinContainers', + required=True, + type=str, + help='DarwinContainers script path.' + ) remote_build_parser.add_argument( '--configuration', choices=[ @@ -940,6 +947,15 @@ if __name__ == '__main__': help='Bazel remote cache host address.' ) + generate_profiles_build_parser = subparsers.add_parser('generate-verification-profiles', help='Generate provisioning profiles that can be used to build a veritication IPA.') + add_codesigning_common_arguments(generate_profiles_build_parser) + generate_profiles_build_parser.add_argument( + '--destination', + required=True, + type=str, + help='Path to the destination directory.' + ) + remote_upload_testflight_parser = subparsers.add_parser('remote-deploy-testflight', help='Build the app using a remote environment.') remote_upload_testflight_parser.add_argument( '--darwinContainersHost', @@ -947,6 +963,12 @@ if __name__ == '__main__': type=str, help='DarwinContainers host address.' ) + remote_upload_testflight_parser.add_argument( + '--darwinContainers', + required=True, + type=str, + help='DarwinContainers script path.' + ) remote_upload_testflight_parser.add_argument( '--ipa', required=True, @@ -967,6 +989,12 @@ if __name__ == '__main__': type=str, help='DarwinContainers host address.' ) + remote_ipadiff_parser.add_argument( + '--darwinContainers', + required=True, + type=str, + help='DarwinContainers script path.' + ) remote_ipadiff_parser.add_argument( '--ipa1', required=True, @@ -1024,11 +1052,33 @@ if __name__ == '__main__': shutil.copyfile(args.configurationPath, remote_input_path + '/configuration.json') RemoteBuild.remote_build( + darwin_containers_path=args.darwinContainers, darwin_containers_host=args.darwinContainersHost, bazel_cache_host=args.cacheHost, configuration=args.configuration, build_input_data_path=remote_input_path ) + elif args.commandName == 'generate-verification-profiles': + base_path = os.getcwd() + remote_input_path = '{}/build-input/remote-input'.format(base_path) + if os.path.exists(remote_input_path): + shutil.rmtree(remote_input_path) + os.makedirs(remote_input_path) + os.makedirs(remote_input_path + '/certs') + os.makedirs(remote_input_path + '/profiles') + + if os.path.exists(args.destination): + shutil.rmtree(args.destination) + os.makedirs(args.destination) + + resolve_configuration( + base_path=os.getcwd(), + bazel_command_line=None, + arguments=args, + additional_codesigning_output_path=remote_input_path + ) + + GenerateProfiles.generate_provisioning_profiles(source_path=remote_input_path + '/profiles', destination_path=args.destination) elif args.commandName == 'remote-deploy-testflight': env = os.environ if 'APPSTORE_CONNECT_USERNAME' not in env: @@ -1039,6 +1089,7 @@ if __name__ == '__main__': sys.exit(1) RemoteBuild.remote_deploy_testflight( + darwin_containers_path=args.darwinContainers, darwin_containers_host=args.darwinContainersHost, ipa_path=args.ipa, dsyms_path=args.dsyms, @@ -1047,6 +1098,7 @@ if __name__ == '__main__': ) elif args.commandName == 'remote-ipa-diff': RemoteBuild.remote_ipa_diff( + darwin_containers_path=args.darwinContainers, darwin_containers_host=args.darwinContainersHost, ipa1_path=args.ipa1, ipa2_path=args.ipa2 diff --git a/build-system/Make/RemoteBuild.py b/build-system/Make/RemoteBuild.py index 59cdf15cfc..d84375f8df 100644 --- a/build-system/Make/RemoteBuild.py +++ b/build-system/Make/RemoteBuild.py @@ -4,41 +4,61 @@ import json import shutil import shlex import tempfile +import importlib.util +from importlib.machinery import SourceFileLoader from BuildEnvironment import run_executable_with_output + +def import_module_from_file(module_name, file_path): + if not os.path.exists(file_path): + print('{} does not exist'.format(file_path)) + sys.exit(1) + + loader = SourceFileLoader(module_name, file_path) + spec = importlib.util.spec_from_file_location(module_name, loader=loader) + module = importlib.util.module_from_spec(spec) + + sys.modules[module_name] = module + spec.loader.exec_module(module) + return module + + def session_scp_upload(session, source_path, destination_path): scp_command = 'scp -i {privateKeyPath} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -pr {source_path} containerhost@"{ipAddress}":{destination_path}'.format( - privateKeyPath=session.privateKeyPath, - ipAddress=session.ipAddress, + privateKeyPath=session.private_key_path, + ipAddress=session.ip_address, source_path=shlex.quote(source_path), destination_path=shlex.quote(destination_path) ) if os.system(scp_command) != 0: print('Command {} finished with a non-zero status'.format(scp_command)) + def session_scp_download(session, source_path, destination_path): scp_command = 'scp -i {privateKeyPath} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -pr containerhost@"{ipAddress}":{source_path} {destination_path}'.format( - privateKeyPath=session.privateKeyPath, - ipAddress=session.ipAddress, + privateKeyPath=session.private_key_path, + ipAddress=session.ip_address, source_path=shlex.quote(source_path), destination_path=shlex.quote(destination_path) ) if os.system(scp_command) != 0: print('Command {} finished with a non-zero status'.format(scp_command)) + def session_ssh(session, command): ssh_command = 'ssh -i {privateKeyPath} -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null containerhost@"{ipAddress}" -o ServerAliveInterval=60 -t "{command}"'.format( - privateKeyPath=session.privateKeyPath, - ipAddress=session.ipAddress, + privateKeyPath=session.private_key_path, + ipAddress=session.ip_address, command=command ) return os.system(ssh_command) -def remote_build(darwin_containers_host, bazel_cache_host, configuration, build_input_data_path): - macos_version = '12.5' - from darwin_containers import DarwinContainers +def remote_build(darwin_containers_path, darwin_containers_host, bazel_cache_host, configuration, build_input_data_path): + macos_version = '13.0' + + DarwinContainers = import_module_from_file('darwin-containers', darwin_containers_path) base_dir = os.getcwd() @@ -83,67 +103,88 @@ def remote_build(darwin_containers_host, bazel_cache_host, configuration, build_ print('Compressing source code...') os.system('find . -type f -a -not -regex "\\." -a -not -regex ".*\\./git" -a -not -regex ".*\\./git/.*" -a -not -regex "\\./bazel-bin" -a -not -regex "\\./bazel-bin/.*" -a -not -regex "\\./bazel-out" -a -not -regex "\\./bazel-out/.*" -a -not -regex "\\./bazel-testlogs" -a -not -regex "\\./bazel-testlogs/.*" -a -not -regex "\\./bazel-telegram-ios" -a -not -regex "\\./bazel-telegram-ios/.*" -a -not -regex "\\./buildbox" -a -not -regex "\\./buildbox/.*" -a -not -regex "\\./buck-out" -a -not -regex "\\./buck-out/.*" -a -not -regex "\\./\\.buckd" -a -not -regex "\\./\\.buckd/.*" -a -not -regex "\\./build" -a -not -regex "\\./build/.*" -print0 | tar cf "{buildbox_dir}/transient-data/source.tar" --null -T -'.format(buildbox_dir=buildbox_dir)) - darwinContainers = DarwinContainers(serverAddress=darwin_containers_host, verbose=False) - print('Opening container session...') - with darwinContainers.workingImageSession(name=image_name) as session: - print('Uploading data to container...') - session_scp_upload(session=session, source_path=build_input_data_path, destination_path='telegram-build-input') - session_scp_upload(session=session, source_path='{base_dir}/{buildbox_dir}/transient-data/source.tar'.format(base_dir=base_dir, buildbox_dir=buildbox_dir), destination_path='') - guest_build_sh = ''' - set -x - set -e + def handle_ssh_credentials(credentials): + with DarwinContainers.ContainerSession(credentials=credentials) as session: + print('Uploading data to container...') - mkdir /Users/Shared/telegram-ios - cd /Users/Shared/telegram-ios + session_scp_upload(session=session, source_path=build_input_data_path, destination_path='telegram-build-input') + session_scp_upload(session=session, source_path='{base_dir}/{buildbox_dir}/transient-data/source.tar'.format(base_dir=base_dir, buildbox_dir=buildbox_dir), destination_path='') - tar -xf $HOME/source.tar + guest_build_sh = ''' + set -x + set -e - python3 build-system/Make/ImportCertificates.py --path $HOME/telegram-build-input/certs + mkdir /Users/Shared/telegram-ios + cd /Users/Shared/telegram-ios - ''' + tar -xf $HOME/source.tar - guest_build_sh += 'python3 build-system/Make/Make.py \\' - if bazel_cache_host is not None: - guest_build_sh += '--cacheHost="{}" \\'.format(bazel_cache_host) - guest_build_sh += 'build \\' - guest_build_sh += '' - guest_build_sh += '--buildNumber={} \\'.format(build_number) - guest_build_sh += '--configuration={} \\'.format(configuration) - guest_build_sh += '--configurationPath=$HOME/telegram-build-input/configuration.json \\' - guest_build_sh += '--codesigningInformationPath=$HOME/telegram-build-input \\' - guest_build_sh += '--outputBuildArtifactsPath=/Users/Shared/telegram-ios/build/artifacts \\' + python3 build-system/Make/ImportCertificates.py --path $HOME/telegram-build-input/certs - guest_build_file_path = tempfile.mktemp() - with open(guest_build_file_path, 'w+') as file: - file.write(guest_build_sh) - session_scp_upload(session=session, source_path=guest_build_file_path, destination_path='guest-build-telegram.sh') - os.unlink(guest_build_file_path) + ''' - print('Executing remote build...') + guest_build_sh += 'python3 build-system/Make/Make.py \\' + if bazel_cache_host is not None: + guest_build_sh += '--cacheHost="{}" \\'.format(bazel_cache_host) + guest_build_sh += 'build \\' + guest_build_sh += '' + guest_build_sh += '--buildNumber={} \\'.format(build_number) + guest_build_sh += '--configuration={} \\'.format(configuration) + guest_build_sh += '--configurationPath=$HOME/telegram-build-input/configuration.json \\' + guest_build_sh += '--codesigningInformationPath=$HOME/telegram-build-input \\' + guest_build_sh += '--outputBuildArtifactsPath=/Users/Shared/telegram-ios/build/artifacts \\' - session_ssh(session=session, command='bash -l guest-build-telegram.sh') + guest_build_file_path = tempfile.mktemp() + with open(guest_build_file_path, 'w+') as file: + file.write(guest_build_sh) + session_scp_upload(session=session, source_path=guest_build_file_path, destination_path='guest-build-telegram.sh') + os.unlink(guest_build_file_path) - print('Retrieving build artifacts...') + print('Executing remote build...') - artifacts_path='{base_dir}/build/artifacts'.format(base_dir=base_dir) - if os.path.exists(artifacts_path): - shutil.rmtree(artifacts_path) - os.makedirs(artifacts_path, exist_ok=True) + session_ssh(session=session, command='bash -l guest-build-telegram.sh') - session_scp_download(session=session, source_path='/Users/Shared/telegram-ios/build/artifacts/*', destination_path='{artifacts_path}/'.format(artifacts_path=artifacts_path)) + print('Retrieving build artifacts...') - if os.path.exists(artifacts_path + '/Telegram.ipa'): - print('Artifacts have been stored at {}'.format(artifacts_path)) - else: - print('Telegram.ipa not found') - sys.exit(1) + artifacts_path='{base_dir}/build/artifacts'.format(base_dir=base_dir) + if os.path.exists(artifacts_path): + shutil.rmtree(artifacts_path) + os.makedirs(artifacts_path, exist_ok=True) -def remote_deploy_testflight(darwin_containers_host, ipa_path, dsyms_path, username, password): + session_scp_download(session=session, source_path='/Users/Shared/telegram-ios/build/artifacts/*', destination_path='{artifacts_path}/'.format(artifacts_path=artifacts_path)) + + if os.path.exists(artifacts_path + '/Telegram.ipa'): + print('Artifacts have been stored at {}'.format(artifacts_path)) + sys.exit(0) + else: + print('Telegram.ipa not found') + sys.exit(1) + + DarwinContainers.run_remote_ssh(credentials=credentials, command='') + sys.exit(0) + + def handle_stopped(): + pass + + DarwinContainers.DarwinContainers( + server_address=darwin_containers_host, + verbose=False + ).run_image( + name=image_name, + is_base=False, + is_gui=True, + is_daemon=False, + on_ssh_credentials=handle_ssh_credentials, + on_stopped=handle_stopped + ) + + +def remote_deploy_testflight(darwin_containers_path, darwin_containers_host, ipa_path, dsyms_path, username, password): macos_version = '12.5' - from darwin_containers import DarwinContainers + DarwinContainers = import_module_from_file('darwin-containers', darwin_containers_path) configuration_path = 'versions.json' xcode_version = '' @@ -159,34 +200,50 @@ def remote_deploy_testflight(darwin_containers_host, ipa_path, dsyms_path, usern print('Image name: {}'.format(image_name)) - darwinContainers = DarwinContainers(serverAddress=darwin_containers_host, verbose=False) - print('Opening container session...') - with darwinContainers.workingImageSession(name=image_name) as session: - print('Uploading data to container...') - session_scp_upload(session=session, source_path=ipa_path, destination_path='') - session_scp_upload(session=session, source_path=dsyms_path, destination_path='') + def handle_ssh_credentials(credentials): + with DarwinContainers.ContainerSession(credentials=credentials) as session: + print('Uploading data to container...') + session_scp_upload(session=session, source_path=ipa_path, destination_path='') + session_scp_upload(session=session, source_path=dsyms_path, destination_path='') - guest_upload_sh = ''' - set -e + guest_upload_sh = ''' + set -e - export DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV" - FASTLANE_PASSWORD="{password}" xcrun altool --upload-app --type ios --file "Telegram.ipa" --username "{username}" --password "@env:FASTLANE_PASSWORD" - '''.format(username=username, password=password) + export DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS="-t DAV" + FASTLANE_PASSWORD="{password}" xcrun altool --upload-app --type ios --file "Telegram.ipa" --username "{username}" --password "@env:FASTLANE_PASSWORD" + '''.format(username=username, password=password) - guest_upload_file_path = tempfile.mktemp() - with open(guest_upload_file_path, 'w+') as file: - file.write(guest_upload_sh) - session_scp_upload(session=session, source_path=guest_upload_file_path, destination_path='guest-upload-telegram.sh') - os.unlink(guest_upload_file_path) + guest_upload_file_path = tempfile.mktemp() + with open(guest_upload_file_path, 'w+') as file: + file.write(guest_upload_sh) + session_scp_upload(session=session, source_path=guest_upload_file_path, destination_path='guest-upload-telegram.sh') + os.unlink(guest_upload_file_path) - print('Executing remote upload...') - session_ssh(session=session, command='bash -l guest-upload-telegram.sh') + print('Executing remote upload...') + session_ssh(session=session, command='bash -l guest-upload-telegram.sh') + sys.exit(0) -def remote_ipa_diff(darwin_containers_host, ipa1_path, ipa2_path): - macos_version = '12.5' + def handle_stopped(): + pass - from darwin_containers import DarwinContainers + DarwinContainers.DarwinContainers( + server_address=darwin_containers_host, + verbose=False + ).run_image( + name=image_name, + is_base=False, + is_gui=True, + is_daemon=False, + on_ssh_credentials=handle_ssh_credentials, + on_stopped=handle_stopped + ) + + +def remote_ipa_diff(darwin_containers_path, darwin_containers_host, ipa1_path, ipa2_path): + macos_version = '13.0' + + DarwinContainers = import_module_from_file('darwin-containers', darwin_containers_path) configuration_path = 'versions.json' xcode_version = '' @@ -202,38 +259,53 @@ def remote_ipa_diff(darwin_containers_host, ipa1_path, ipa2_path): print('Image name: {}'.format(image_name)) - darwinContainers = DarwinContainers(serverAddress=darwin_containers_host, verbose=False) - print('Opening container session...') - with darwinContainers.workingImageSession(name=image_name) as session: - print('Uploading data to container...') - session_scp_upload(session=session, source_path='tools/ipadiff.py', destination_path='ipadiff.py') - session_scp_upload(session=session, source_path='tools/main.cpp', destination_path='main.cpp') - session_scp_upload(session=session, source_path=ipa1_path, destination_path='ipa1.ipa') - session_scp_upload(session=session, source_path=ipa2_path, destination_path='ipa2.ipa') - guest_upload_sh = ''' - set -e + def handle_ssh_credentials(credentials): + with DarwinContainers.ContainerSession(credentials=credentials) as session: + print('Uploading data to container...') + session_scp_upload(session=session, source_path='tools/ipadiff.py', destination_path='ipadiff.py') + session_scp_upload(session=session, source_path='tools/main.cpp', destination_path='main.cpp') + session_scp_upload(session=session, source_path=ipa1_path, destination_path='ipa1.ipa') + session_scp_upload(session=session, source_path=ipa2_path, destination_path='ipa2.ipa') - python3 ipadiff.py ipa1.ipa ipa2.ipa - echo $? > result.txt - ''' + guest_upload_sh = ''' + set -e - guest_upload_file_path = tempfile.mktemp() - with open(guest_upload_file_path, 'w+') as file: - file.write(guest_upload_sh) - session_scp_upload(session=session, source_path=guest_upload_file_path, destination_path='guest-ipa-diff.sh') - os.unlink(guest_upload_file_path) + python3 ipadiff.py ipa1.ipa ipa2.ipa + echo $? > result.txt + ''' - print('Executing remote ipa-diff...') - session_ssh(session=session, command='bash -l guest-ipa-diff.sh') - guest_result_path = tempfile.mktemp() - session_scp_download(session=session, source_path='result.txt', destination_path=guest_result_path) - guest_result = '' - with open(guest_result_path, 'r') as file: - guest_result = file.read().rstrip() - os.unlink(guest_result_path) + guest_upload_file_path = tempfile.mktemp() + with open(guest_upload_file_path, 'w+') as file: + file.write(guest_upload_sh) + session_scp_upload(session=session, source_path=guest_upload_file_path, destination_path='guest-ipa-diff.sh') + os.unlink(guest_upload_file_path) - if guest_result != '0': - sys.exit(1) + print('Executing remote ipa-diff...') + session_ssh(session=session, command='bash -l guest-ipa-diff.sh') + guest_result_path = tempfile.mktemp() + session_scp_download(session=session, source_path='result.txt', destination_path=guest_result_path) + guest_result = '' + with open(guest_result_path, 'r') as file: + guest_result = file.read().rstrip() + os.unlink(guest_result_path) + if guest_result != '0': + sys.exit(1) + sys.exit(0) + + def handle_stopped(): + pass + + DarwinContainers.DarwinContainers( + server_address=darwin_containers_host, + verbose=False + ).run_image( + name=image_name, + is_base=False, + is_gui=True, + is_daemon=False, + on_ssh_credentials=handle_ssh_credentials, + on_stopped=handle_stopped + ) diff --git a/build-system/fake-codesigning/profiles/BroadcastUpload.mobileprovision b/build-system/fake-codesigning/profiles/BroadcastUpload.mobileprovision index 90bc0e0e03..873aafa1f2 100644 Binary files a/build-system/fake-codesigning/profiles/BroadcastUpload.mobileprovision and b/build-system/fake-codesigning/profiles/BroadcastUpload.mobileprovision differ diff --git a/build-system/fake-codesigning/profiles/Intents.mobileprovision b/build-system/fake-codesigning/profiles/Intents.mobileprovision index 3de2acb55c..013624d4f9 100644 Binary files a/build-system/fake-codesigning/profiles/Intents.mobileprovision and b/build-system/fake-codesigning/profiles/Intents.mobileprovision differ diff --git a/build-system/fake-codesigning/profiles/NotificationContent.mobileprovision b/build-system/fake-codesigning/profiles/NotificationContent.mobileprovision index 2866dd887b..4b3b44af1a 100644 Binary files a/build-system/fake-codesigning/profiles/NotificationContent.mobileprovision and b/build-system/fake-codesigning/profiles/NotificationContent.mobileprovision differ diff --git a/build-system/fake-codesigning/profiles/NotificationService.mobileprovision b/build-system/fake-codesigning/profiles/NotificationService.mobileprovision index a0f5e98ae3..84546fe604 100644 Binary files a/build-system/fake-codesigning/profiles/NotificationService.mobileprovision and b/build-system/fake-codesigning/profiles/NotificationService.mobileprovision differ diff --git a/build-system/fake-codesigning/profiles/Share.mobileprovision b/build-system/fake-codesigning/profiles/Share.mobileprovision index 636d4658e0..c15af3868c 100644 Binary files a/build-system/fake-codesigning/profiles/Share.mobileprovision and b/build-system/fake-codesigning/profiles/Share.mobileprovision differ diff --git a/build-system/fake-codesigning/profiles/Telegram.mobileprovision b/build-system/fake-codesigning/profiles/Telegram.mobileprovision index 534e1305d5..b43d591cb0 100644 Binary files a/build-system/fake-codesigning/profiles/Telegram.mobileprovision and b/build-system/fake-codesigning/profiles/Telegram.mobileprovision differ diff --git a/build-system/fake-codesigning/profiles/WatchApp.mobileprovision b/build-system/fake-codesigning/profiles/WatchApp.mobileprovision index 112b95d6b9..fa8ad80736 100644 Binary files a/build-system/fake-codesigning/profiles/WatchApp.mobileprovision and b/build-system/fake-codesigning/profiles/WatchApp.mobileprovision differ diff --git a/build-system/fake-codesigning/profiles/WatchExtension.mobileprovision b/build-system/fake-codesigning/profiles/WatchExtension.mobileprovision index 8744004281..77b4fd0fb3 100644 Binary files a/build-system/fake-codesigning/profiles/WatchExtension.mobileprovision and b/build-system/fake-codesigning/profiles/WatchExtension.mobileprovision differ diff --git a/build-system/fake-codesigning/profiles/Widget.mobileprovision b/build-system/fake-codesigning/profiles/Widget.mobileprovision index 7f4ae880c1..5c9f796915 100644 Binary files a/build-system/fake-codesigning/profiles/Widget.mobileprovision and b/build-system/fake-codesigning/profiles/Widget.mobileprovision differ diff --git a/submodules/TelegramCore/BUILD b/submodules/TelegramCore/BUILD index 4a708502fb..7f444963cd 100644 --- a/submodules/TelegramCore/BUILD +++ b/submodules/TelegramCore/BUILD @@ -9,6 +9,32 @@ swift_library( copts = [ "-warnings-as-errors", ], + linkopts = [ + "-Wl,-weak-lswiftCoreMIDI", + "-Wl,-weak-lswiftDataDetection", + "-Wl,-weak-lswiftFileProvider", + "-Wl,-weak-lswiftUniformTypeIdentifiers", + "-Wl,-weak-lswiftAVFoundation", + "-Wl,-lswiftCore", + "-Wl,-weak-lswiftCoreAudio", + "-Wl,-weak-lswiftCoreFoundation", + "-Wl,-weak-lswiftCoreImage", + "-Wl,-weak-lswiftCoreLocation", + "-Wl,-weak-lswiftCoreMedia", + "-Wl,-weak-lswiftDarwin", + "-Wl,-lswiftDispatch", + "-Wl,-weak-lswiftMetal", + "-Wl,-weak-lswiftNetwork", + "-Wl,-lswiftObjectiveC", + "-Wl,-weak-lswiftPhotos", + "-Wl,-weak-lswiftQuartzCore", + "-Wl,-weak-lswiftUIKit", + "-Wl,-weak-lswiftos", + "-Wl,-weak-lswiftsimd", + "-Wl,-lswiftFoundation", + "-Wl,-lswiftCloudKit", + "-Wl,-weak-lswiftCoreGraphics", + ], deps = [ "//submodules/TelegramApi:TelegramApi", "//submodules/MtProtoKit:MtProtoKit", diff --git a/submodules/TelegramUI/BUILD b/submodules/TelegramUI/BUILD index 87854ad68c..9710e7b160 100644 --- a/submodules/TelegramUI/BUILD +++ b/submodules/TelegramUI/BUILD @@ -48,6 +48,51 @@ swift_library( copts = [ "-warnings-as-errors", ], + linkopts = [ + "-Wl,-weak-lswiftCoreGraphics", + "-Wl,-weak-lswiftCompression", + "-Wl,-weak-lswiftCoreMIDI", + "-Wl,-weak-lswiftCoreML", + "-Wl,-weak-lswiftDataDetection", + "-Wl,-weak-lswiftFileProvider", + "-Wl,-weak-lswiftOSLog", + "-Wl,-weak-lswiftPassKit", + "-Wl,-weak-lswiftQuickLook", + "-Wl,-weak-lswiftSpeech", + "-Wl,-weak-lswiftUniformTypeIdentifiers", + "-Wl,-weak-lswiftWebKit", + "-Wl,-lswiftAVFoundation", + "-Wl,-weak-lswiftAccelerate", + "-Wl,-lswiftCallKit", + "-Wl,-lswiftCore", + "-Wl,-lswiftCoreAudio", + "-Wl,-lswiftCoreFoundation", + "-Wl,-weak-lswiftCoreImage", + "-Wl,-weak-lswiftCoreLocation", + "-Wl,-lswiftCoreMedia", + "-Wl,-lswiftDarwin", + "-Wl,-lswiftDispatch", + "-Wl,-weak-lswiftGLKit", + "-Wl,-weak-lswiftIntents", + "-Wl,-weak-lswiftMapKit", + "-Wl,-weak-lswiftMediaPlayer", + "-Wl,-weak-lswiftMetal", + "-Wl,-weak-lswiftMetalKit", + "-Wl,-weak-lswiftModelIO", + "-Wl,-weak-lswiftNaturalLanguage", + "-Wl,-weak-lswiftNetwork", + "-Wl,-lswiftObjectiveC", + "-Wl,-lswiftPhotos", + "-Wl,-weak-lswiftPhotosUI", + "-Wl,-lswiftQuartzCore", + "-Wl,-lswiftSceneKit", + "-Wl,-lswiftUIKit", + "-Wl,-weak-lswiftVision", + "-Wl,-weak-lswift_Concurrency", + "-Wl,-weak-lswiftos", + "-Wl,-weak-lswiftsimd", + "-Wl,-lswiftFoundation", + ], deps = [ "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", "//submodules/SSignalKit/SSignalKit:SSignalKit", diff --git a/versions.json b/versions.json index 9ced858715..eb278d869f 100644 --- a/versions.json +++ b/versions.json @@ -1,5 +1,5 @@ { "app": "9.2.0", "bazel": "5.3.1", - "xcode": "14.0" + "xcode": "14.1" }