* ci: gate TestFlight behind opt-in toggle + Xcode 27 build fixes TestFlight is now opt-in (default OFF). A workflow_dispatch boolean `enable_testflight` (or the `ENABLE_TESTFLIGHT` repo variable) drives a `prepare.outputs.testflight_enabled` flag that gates the macOS app-store-pkg build leg and both testflight_ios/testflight_macos upload legs. Missing Apple signing secrets no longer fail the normal DMG/IPA release path (package-macos-app-store-pkg.sh hard-exits without them). Xcode 27 build compatibility: - Align Apple deployment targets so no pod sits below the app minimum (Xcode 27 rejects this): macOS pods + RunnerTests -> 15.6, iOS pods -> 15.5 to match the Runner targets. - Add a `lipo` shim (scripts/xcode-tools/lipo) wired onto PATH in the iOS/macOS build phases; Xcode 27 only accepts one `-verify_arch` architecture per call while Flutter passes them all at once. - macOS project hygiene: correct PrivacyInfo.xcprivacy path, set app display name + LSApplicationCategoryType. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * test: make temp-dir cleanup resilient to concurrent-write races The assistant execution target tests deleted their temp HOME/workspace dirs with a raw recursive delete in addTearDown. A background flush (e.g. controller dispose still persisting state) can keep writing into the dir while the delete walks it, so the delete races and fails with "Directory not empty" (errno 39), failing the test on CI. Route all unguarded teardown deletes through the existing _resilientDelete helper (re-check existence + retry), and harden that helper so its final fallback never re-throws — a temp-dir cleanup failure must never fail a test. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Haitao Pan <manbuzhe2009@qq.com> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
128 lines
4.4 KiB
Ruby
128 lines
4.4 KiB
Ruby
platform :osx, '15.6'
|
|
|
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
|
|
|
project 'Runner', {
|
|
'Debug' => :debug,
|
|
'Profile' => :release,
|
|
'Release' => :release,
|
|
}
|
|
|
|
def flutter_root
|
|
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
|
|
unless File.exist?(generated_xcode_build_settings_path)
|
|
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
|
|
end
|
|
|
|
File.foreach(generated_xcode_build_settings_path) do |line|
|
|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
|
|
return matches[1].strip if matches
|
|
end
|
|
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
|
|
end
|
|
|
|
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
|
|
|
|
flutter_macos_podfile_setup
|
|
|
|
target 'Runner' do
|
|
use_frameworks!
|
|
|
|
flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
|
|
target 'RunnerTests' do
|
|
inherit! :search_paths
|
|
end
|
|
end
|
|
|
|
post_install do |installer|
|
|
append_ignored_attributes_suppression = lambda do |build_settings|
|
|
other_cflags = build_settings['OTHER_CFLAGS'] || '$(inherited)'
|
|
other_cxxflags = build_settings['OTHER_CPLUSPLUSFLAGS'] || '$(inherited)'
|
|
updated = false
|
|
|
|
unless other_cflags.include?('-Wno-ignored-attributes')
|
|
build_settings['OTHER_CFLAGS'] =
|
|
"#{other_cflags} -Wno-ignored-attributes"
|
|
updated = true
|
|
end
|
|
|
|
unless other_cxxflags.include?('-Wno-ignored-attributes')
|
|
build_settings['OTHER_CPLUSPLUSFLAGS'] =
|
|
"#{other_cxxflags} -Wno-ignored-attributes"
|
|
updated = true
|
|
end
|
|
|
|
updated
|
|
end
|
|
|
|
append_deprecation_suppression = lambda do |build_settings|
|
|
other_cflags = build_settings['OTHER_CFLAGS'] || '$(inherited)'
|
|
other_cxxflags = build_settings['OTHER_CPLUSPLUSFLAGS'] || '$(inherited)'
|
|
|
|
unless other_cflags.include?('-Wno-strict-prototypes')
|
|
build_settings['OTHER_CFLAGS'] =
|
|
"#{other_cflags} -Wno-strict-prototypes"
|
|
end
|
|
|
|
unless other_cflags.include?('-Wno-deprecated-declarations')
|
|
build_settings['OTHER_CFLAGS'] =
|
|
"#{other_cflags} -Wno-deprecated-declarations"
|
|
end
|
|
|
|
unless other_cxxflags.include?('-Wno-deprecated-declarations')
|
|
build_settings['OTHER_CPLUSPLUSFLAGS'] =
|
|
"#{other_cxxflags} -Wno-deprecated-declarations"
|
|
end
|
|
end
|
|
|
|
append_linker_warning_suppression = lambda do |build_settings|
|
|
other_ldflags = build_settings['OTHER_LDFLAGS'] || '$(inherited)'
|
|
return if other_ldflags.include?('-Wl,-w')
|
|
|
|
build_settings['OTHER_LDFLAGS'] =
|
|
"#{other_ldflags} -Wl,-w"
|
|
end
|
|
|
|
normalize_system_framework_refs = lambda do |project|
|
|
project.files.each do |file|
|
|
next unless file.path&.include?('/System/Library/Frameworks/')
|
|
next unless file.path.include?('Platforms/MacOSX.platform/Developer/SDKs/')
|
|
|
|
file.path = "System/Library/Frameworks/#{File.basename(file.path)}"
|
|
file.source_tree = 'SDKROOT'
|
|
end
|
|
end
|
|
|
|
installer.pods_project.targets.each do |target|
|
|
flutter_additional_macos_build_settings(target)
|
|
target.build_configurations.each do |config|
|
|
# Xcode 27 rejects dependency targets below the app's 15.6 minimum.
|
|
config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '15.6'
|
|
|
|
next unless ['Pods-Runner', 'Pods-RunnerTests', 'WebRTC-SDK', 'flutter_webrtc'].include?(target.name)
|
|
|
|
append_ignored_attributes_suppression.call(config.build_settings)
|
|
append_deprecation_suppression.call(config.build_settings)
|
|
append_linker_warning_suppression.call(config.build_settings)
|
|
config.build_settings['GCC_WARN_INHIBIT_ALL_WARNINGS'] = 'YES'
|
|
config.build_settings['SWIFT_SUPPRESS_WARNINGS'] = 'YES'
|
|
end
|
|
end
|
|
|
|
installer.aggregate_targets.each do |aggregate_target|
|
|
aggregate_target.user_project.targets.each do |target|
|
|
next unless ['Runner', 'RunnerTests'].include?(target.name)
|
|
|
|
target.build_configurations.each do |config|
|
|
append_ignored_attributes_suppression.call(config.build_settings)
|
|
append_linker_warning_suppression.call(config.build_settings)
|
|
end
|
|
end
|
|
aggregate_target.user_project.save
|
|
end
|
|
|
|
normalize_system_framework_refs.call(installer.pods_project)
|
|
installer.pods_project.save
|
|
end
|