From e2f505fa67016f7c35527d8e39b9db2386464123 Mon Sep 17 00:00:00 2001 From: CMK Date: Fri, 4 Nov 2022 12:20:27 +0800 Subject: [PATCH 1/4] feat: add TestFlight deploy workflow --- .github/scripts/build-release.sh | 65 +++++++++++++++++++++++++++++ .github/scripts/setup.sh | 2 +- .github/support/ExportOptions.plist | 8 ++++ .github/workflows/develop-build.yml | 56 +++++++++++++++++++++++++ Podfile | 7 ++++ Podfile.lock | 2 +- 6 files changed, 138 insertions(+), 2 deletions(-) create mode 100755 .github/scripts/build-release.sh create mode 100644 .github/support/ExportOptions.plist create mode 100644 .github/workflows/develop-build.yml diff --git a/.github/scripts/build-release.sh b/.github/scripts/build-release.sh new file mode 100755 index 000000000..fc081428f --- /dev/null +++ b/.github/scripts/build-release.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash + +set -xeu +set -o pipefail + +function finish() { + ditto -c -k --sequesterRsrc --keepParent "${RESULT_BUNDLE_PATH}" "${RESULT_BUNDLE_PATH}.zip" + rm -rf "${RESULT_BUNDLE_PATH}" +} + +trap finish EXIT + +SDK="${SDK:-iphoneos}" +WORKSPACE="${WORKSPACE:-Mastodon.xcworkspace}" +SCHEME="${SCHEME:-Mastodon}" +CONFIGURATION=${CONFIGURATION:-Release} + +BUILD_DIR=${BUILD_DIR:-.build} +ARTIFACT_PATH=${RESULT_PATH:-${BUILD_DIR}/Artifacts} +RESULT_BUNDLE_PATH="${ARTIFACT_PATH}/${SCHEME}.xcresult" +ARCHIVE_PATH=${ARCHIVE_PATH:-${BUILD_DIR}/Archives/${SCHEME}.xcarchive} +DERIVED_DATA_PATH=${DERIVED_DATA_PATH:-${BUILD_DIR}/DerivedData} +CURRENT_PROJECT_VERSION=${BUILD_NUMBER:-0} +EXPORT_OPTIONS_FILE=".github/support/ExportOptions.plist" + +WORK_DIR=$(pwd) +API_PRIVATE_KEYS_PATH="${WORK_DIR}/${BUILD_DIR}/private_keys" +API_KEY_FILE="${API_PRIVATE_KEYS_PATH}/api_key.p8" + +rm -rf "${RESULT_BUNDLE_PATH}" + +rm -rf "${API_PRIVATE_KEYS_PATH}" +mkdir -p "${API_PRIVATE_KEYS_PATH}" +echo -n "${ENV_API_PRIVATE_KEY}" | base64 --decode > "${API_KEY_FILE}" + +xcrun xcodebuild clean \ + -workspace "${WORKSPACE}" \ + -scheme "${SCHEME}" \ + -configuration "${CONFIGURATION}" + +xcrun xcodebuild archive \ + -workspace "${WORKSPACE}" \ + -scheme "${SCHEME}" \ + -configuration "${CONFIGURATION}" \ + -destination generic/platform=iOS \ + -sdk "${SDK}" \ + -parallelizeTargets \ + -showBuildTimingSummary \ + -derivedDataPath "${DERIVED_DATA_PATH}" \ + -archivePath "${ARCHIVE_PATH}" \ + -resultBundlePath "${RESULT_BUNDLE_PATH}" \ + -allowProvisioningUpdates \ + -authenticationKeyPath "${API_KEY_FILE}" \ + -authenticationKeyID "${ENV_API_KEY_ID}" \ + -authenticationKeyIssuerID "${ENV_ISSUER_ID}" + +xcrun xcodebuild \ + -exportArchive \ + -archivePath "${ARCHIVE_PATH}" \ + -exportOptionsPlist "${EXPORT_OPTIONS_FILE}" \ + -exportPath "${ARTIFACT_PATH}/${SCHEME}.ipa" \ + -allowProvisioningUpdates + +# Zip up the Xcode Archive into Artifacts folder. +ditto -c -k --sequesterRsrc --keepParent "${ARCHIVE_PATH}" "${ARTIFACT_PATH}/${SCHEME}.xcarchive.zip" \ No newline at end of file diff --git a/.github/scripts/setup.sh b/.github/scripts/setup.sh index a630e28cb..69c1dbd54 100755 --- a/.github/scripts/setup.sh +++ b/.github/scripts/setup.sh @@ -1,7 +1,7 @@ #!/bin/bash # workaround https://github.com/CocoaPods/CocoaPods/issues/11355 -sed -i '' $'1s/^/source "https:\\/\\/github.com\\/CocoaPods\\/Specs.git"\\\n\\\n/' Podfile +# sed -i '' $'1s/^/source "https:\\/\\/github.com\\/CocoaPods\\/Specs.git"\\\n\\\n/' Podfile # Install Ruby Bundler gem install bundler:2.3.11 diff --git a/.github/support/ExportOptions.plist b/.github/support/ExportOptions.plist new file mode 100644 index 000000000..50ba270b0 --- /dev/null +++ b/.github/support/ExportOptions.plist @@ -0,0 +1,8 @@ + + + + + method + app-store + + \ No newline at end of file diff --git a/.github/workflows/develop-build.yml b/.github/workflows/develop-build.yml new file mode 100644 index 000000000..0734b00f8 --- /dev/null +++ b/.github/workflows/develop-build.yml @@ -0,0 +1,56 @@ +name: Build for Develop TestFlight + +on: + push: + branches: + - develop + - ci-test + +jobs: + build: + name: Build + runs-on: macOS-12 + steps: + - name: checkout + uses: actions/checkout@v2 + + - name: setup + env: + NotificationEndpointDebug: ${{ secrets.NotificationEndpointDebug }} + NotificationEndpointRelease: ${{ secrets.NotificationEndpointRelease }} + run: exec ./.github/scripts/setup.sh + + - name: Import Code-Signing Certificates + uses: Apple-Actions/import-codesign-certs@v1 # https://github.com/Apple-Actions/import-codesign-certs + with: + keychain: build-p12 + p12-file-base64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} + p12-password: ${{ secrets.P12_PASSWORD }} + + - name: Download Provisioning Profiles + uses: Apple-Actions/download-provisioning-profiles@v1 # https://github.com/Apple-Actions/download-provisioning-profiles + with: + bundle-id: org.joinmastodon.app + issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }} + api-key-id: ${{ secrets.APPSTORE_KEY_ID }} + api-private-key: ${{ secrets.APPSTORE_PRIVATE_KEY }} + + - name: build + env: + ENV_ISSUER_ID: ${{ secrets.APPSTORE_ISSUER_ID }} + ENV_API_KEY_ID: ${{ secrets.APPSTORE_KEY_ID }} + ENV_API_PRIVATE_KEY: ${{ secrets.APP_STORE_CONNECT_KEY_BASE64 }} + run: exec ./.github/scripts/build-release.sh + + - name: Upload TestFlight Build + uses: Apple-Actions/upload-testflight-build@master + with: + app-path: .build/Artifacts/Mastodon.ipa/Mastodon.ipa + issuer-id: ${{ secrets.APPSTORE_ISSUER_ID }} + api-key-id: ${{ secrets.APPSTORE_KEY_ID }} + api-private-key: ${{ secrets.APPSTORE_PRIVATE_KEY }} + + - name: Clean up keychain and provisioning profile + if: ${{ always() }} + run: | + security delete-keychain build-p12.keychain-db diff --git a/Podfile b/Podfile index 3c482446a..28757d528 100644 --- a/Podfile +++ b/Podfile @@ -1,3 +1,4 @@ +source 'https://cdn.cocoapods.org/' platform :ios, '14.0' target 'Mastodon' do @@ -35,5 +36,11 @@ post_install do |installer| target.build_configurations.each do |config| config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET' end + # https://github.com/CocoaPods/CocoaPods/issues/11402#issuecomment-1201464693 + if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle" + target.build_configurations.each do |config| + config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' + end + end end end diff --git a/Podfile.lock b/Podfile.lock index 0cec6626a..12680db21 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -37,6 +37,6 @@ SPEC CHECKSUMS: "UITextField+Shake": 298ac5a0f239d731bdab999b19b628c956ca0ac3 XLPagerTabStrip: 61c57fd61f611ee5f01ff1495ad6fbee8bf496c5 -PODFILE CHECKSUM: 50ec5b2c4aa189024cc5ab41039f983dc5609040 +PODFILE CHECKSUM: 8b15fb6d4e801b7a7e7761a2e2fe40a89b1da4ff COCOAPODS: 1.11.3 From eb86b5a9d833c82c7c176b891ca85722ed1a9450 Mon Sep 17 00:00:00 2001 From: CMK Date: Fri, 4 Nov 2022 12:26:38 +0800 Subject: [PATCH 2/4] chore: update to version 1.4.7 --- Mastodon.xcodeproj/project.pbxproj | 46 ------------------- .../xcschemes/xcschememanagement.plist | 4 +- Mastodon/Info.plist | 2 +- MastodonIntent/Info.plist | 2 +- MastodonTests/Info.plist | 2 +- MastodonUITests/Info.plist | 2 +- NotificationService/Info.plist | 2 +- ShareActionExtension/Info.plist | 2 +- 8 files changed, 8 insertions(+), 54 deletions(-) diff --git a/Mastodon.xcodeproj/project.pbxproj b/Mastodon.xcodeproj/project.pbxproj index 68aae2d4e..c4291c3d3 100644 --- a/Mastodon.xcodeproj/project.pbxproj +++ b/Mastodon.xcodeproj/project.pbxproj @@ -3874,7 +3874,6 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.4.5; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -3904,7 +3903,6 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.4.5; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -4077,7 +4075,6 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.4.5; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -4144,7 +4141,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.NotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4167,7 +4163,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.ShareActionExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4191,7 +4186,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.MastodonIntent; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4215,7 +4209,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.MastodonIntent; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4239,7 +4232,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.MastodonIntent; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4263,7 +4255,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.ShareActionExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4287,7 +4278,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.ShareActionExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4374,7 +4364,6 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.4.5; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -4426,36 +4415,6 @@ }; name = "Release Snapshot"; }; - DBEB19E527E4658E00B0E80E /* Release Snapshot */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3E08A432F40BA7B9CAA9DB68 /* Pods-AppShared.release snapshot.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 147; - DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = 5Z4GVSS33P; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 147; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = AppShared/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.AppShared; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = "Release Snapshot"; - }; DBEB19E627E4658E00B0E80E /* Release Snapshot */ = { isa = XCBuildConfiguration; buildSettings = { @@ -4470,7 +4429,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.NotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4493,7 +4451,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.ShareActionExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4517,7 +4474,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.MastodonIntent; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4542,7 +4498,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.NotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -4566,7 +4521,6 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0.7; PRODUCT_BUNDLE_IDENTIFIER = org.joinmastodon.app.NotificationService; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist b/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist index de5069e58..979c8c0e6 100644 --- a/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Mastodon.xcodeproj/xcuserdata/mainasuk.xcuserdatad/xcschemes/xcschememanagement.plist @@ -117,12 +117,12 @@ NotificationService.xcscheme_^#shared#^_ orderHint - 24 + 18 ShareActionExtension.xcscheme_^#shared#^_ orderHint - 25 + 17 SuppressBuildableAutocreation diff --git a/Mastodon/Info.plist b/Mastodon/Info.plist index cfdbb923d..ace07bf2b 100644 --- a/Mastodon/Info.plist +++ b/Mastodon/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.4.6 + 1.4.7 CFBundleURLTypes diff --git a/MastodonIntent/Info.plist b/MastodonIntent/Info.plist index 3816b660b..c82d6b9a1 100644 --- a/MastodonIntent/Info.plist +++ b/MastodonIntent/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.4.6 + 1.4.7 CFBundleVersion 147 NSExtension diff --git a/MastodonTests/Info.plist b/MastodonTests/Info.plist index 9f09d489c..a1baa064c 100644 --- a/MastodonTests/Info.plist +++ b/MastodonTests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.4.6 + 1.4.7 CFBundleVersion 147 diff --git a/MastodonUITests/Info.plist b/MastodonUITests/Info.plist index 9f09d489c..a1baa064c 100644 --- a/MastodonUITests/Info.plist +++ b/MastodonUITests/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.4.6 + 1.4.7 CFBundleVersion 147 diff --git a/NotificationService/Info.plist b/NotificationService/Info.plist index 854a8a529..d8e24838e 100644 --- a/NotificationService/Info.plist +++ b/NotificationService/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.4.6 + 1.4.7 CFBundleVersion 147 NSExtension diff --git a/ShareActionExtension/Info.plist b/ShareActionExtension/Info.plist index 4372c5048..73944fe84 100644 --- a/ShareActionExtension/Info.plist +++ b/ShareActionExtension/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.4.6 + 1.4.7 CFBundleVersion 147 NSExtension From a7cbbc02396372b69ed76b656a64de893943d24e Mon Sep 17 00:00:00 2001 From: CMK Date: Fri, 4 Nov 2022 13:28:09 +0800 Subject: [PATCH 3/4] fix: compile failure issue --- Mastodon/Scene/Report/Report/ReportViewModel.swift | 2 +- .../Sources/MastodonCore/Service/API/APIService+Report.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mastodon/Scene/Report/Report/ReportViewModel.swift b/Mastodon/Scene/Report/Report/ReportViewModel.swift index c368ce42c..05f1cfef8 100644 --- a/Mastodon/Scene/Report/Report/ReportViewModel.swift +++ b/Mastodon/Scene/Report/Report/ReportViewModel.swift @@ -162,7 +162,7 @@ extension ReportViewModel { #else let _ = try await context.apiService.report( query: query, - authenticationBox: authenticationBox + authenticationBox: authContext.mastodonAuthenticationBox ) #endif isReportSuccess = true diff --git a/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Report.swift b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Report.swift index aa7393070..81a612120 100644 --- a/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Report.swift +++ b/MastodonSDK/Sources/MastodonCore/Service/API/APIService+Report.swift @@ -11,7 +11,7 @@ import Combine extension APIService { - func report( + public func report( query: Mastodon.API.Reports.FileReportQuery, authenticationBox: MastodonAuthenticationBox ) async throws -> Mastodon.Response.Content { From 99bef412811d31abf8da07ea73820b505212439b Mon Sep 17 00:00:00 2001 From: CMK Date: Fri, 4 Nov 2022 13:49:10 +0800 Subject: [PATCH 4/4] fix: connect api key missing for export archive --- .github/scripts/build-release.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/scripts/build-release.sh b/.github/scripts/build-release.sh index fc081428f..63aca3455 100755 --- a/.github/scripts/build-release.sh +++ b/.github/scripts/build-release.sh @@ -59,7 +59,10 @@ xcrun xcodebuild \ -archivePath "${ARCHIVE_PATH}" \ -exportOptionsPlist "${EXPORT_OPTIONS_FILE}" \ -exportPath "${ARTIFACT_PATH}/${SCHEME}.ipa" \ - -allowProvisioningUpdates + -allowProvisioningUpdates \ + -authenticationKeyPath "${API_KEY_FILE}" \ + -authenticationKeyID "${ENV_API_KEY_ID}" \ + -authenticationKeyIssuerID "${ENV_ISSUER_ID}" # Zip up the Xcode Archive into Artifacts folder. ditto -c -k --sequesterRsrc --keepParent "${ARCHIVE_PATH}" "${ARTIFACT_PATH}/${SCHEME}.xcarchive.zip" \ No newline at end of file