From af47959e5f15b4fe10bb1d510e7cb680c9082128 Mon Sep 17 00:00:00 2001 From: Graeme Arthur Date: Wed, 20 Sep 2023 17:00:11 +0200 Subject: [PATCH] Nightly alpha builds (#1996) --- .github/workflows/alpha.yml | 113 ++++++++++++++++++ .github/workflows/nightly.yml | 14 ++- .../xcschemes/DuckDuckGo-Alpha.xcscheme | 77 ++++++++++++ alphaExportOptions.plist | 23 ++++ fastlane/Fastfile | 38 ++++-- fastlane/Matchfile | 4 +- fastlane/README.md | 18 +-- 7 files changed, 267 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/alpha.yml create mode 100644 DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo-Alpha.xcscheme create mode 100644 alphaExportOptions.plist diff --git a/.github/workflows/alpha.yml b/.github/workflows/alpha.yml new file mode 100644 index 0000000000..4110318550 --- /dev/null +++ b/.github/workflows/alpha.yml @@ -0,0 +1,113 @@ +name: Make TestFlight Alpha Build + +on: + workflow_dispatch: + inputs: + destination: + description: "TestFlight Group" + required: true + default: "Latest Alpha Group" + type: string + workflow_call: + inputs: + destination: + description: "TestFlight Group" + required: true + default: "Latest Alpha Group" + type: string + secrets: + SSH_PRIVATE_KEY_FASTLANE_MATCH: + required: true + APPLE_API_KEY_BASE64: + required: true + APPLE_API_KEY_ID: + required: true + APPLE_API_KEY_ISSUER: + required: true + MATCH_PASSWORD: + required: true + ASANA_ACCESS_TOKEN: + required: true + +jobs: + make-alpha: + runs-on: macos-13 + name: Make TestFlight Alpha Build + + env: + destination: ${{ github.event.inputs.destination || inputs.destination }} + + steps: + + - name: Assert develop branch + run: | + case "${{ github.ref }}" in + *develop/*) ;; + *) echo "👎 Not develop branch"; exit 1 ;; + esac + + - name: Register SSH keys for access to certificates + uses: webfactory/ssh-agent@v0.7.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + + - name: Check out the code + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Set cache key hash + run: | + has_only_tags=$(jq '[ .object.pins[].state | has("version") ] | all' DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved) + if [[ "$has_only_tags" == "true" ]]; then + echo "cache_key_hash=${{ hashFiles('DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved') }}" >> $GITHUB_ENV + else + echo "Package.resolved contains dependencies specified by branch or commit, skipping cache." + fi + + - name: Cache SPM + if: env.cache_key_hash + uses: actions/cache@v3 + with: + path: DerivedData/SourcePackages + key: ${{ runner.os }}-spm-${{ env.cache_key_hash }} + restore-keys: | + ${{ runner.os }}-spm- + + - name: Select Xcode + run: sudo xcode-select -s /Applications/Xcode_$(<.xcode-version).app/Contents/Developer + + - name: Prepare fastlane + run: bundle install + + - name: Archive and upload the app + env: + APPLE_API_KEY_BASE64: ${{ secrets.APPLE_API_KEY_BASE64 }} + APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }} + APPLE_API_KEY_ISSUER: ${{ secrets.APPLE_API_KEY_ISSUER }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + run: | + app_version="$(cut -d ' ' -f 3 < Configuration/Version.xcconfig)" + bundle exec fastlane increment_build_number_for_version version:$app_version app_identifier:"com.duckduckgo.mobile.ios.alpha" + bundle exec fastlane release_alpha groups:"${{ env.destination }}" + build_version="$(xcodebuild -configuration Alpha -showBuildSettings | grep CURRENT_PROJECT_VERSION | tr -d 'CURRENT_PROJECT_VERSION =')" + echo "dsyms_path=${{ github.workspace }}/DuckDuckGo-Alpha.app.dSYM.zip" >> $GITHUB_ENV + echo "app_version=${app_version}" >> $GITHUB_ENV + echo "build_version=${build_version}" >> $GITHUB_ENV + + - name: Upload dSYMs artifact + uses: actions/upload-artifact@v3 + with: + name: DuckDuckGo-Alpha-dSYM-${{ env.app_version }} + path: ${{ env.dsyms_path }} + + - name: Upload debug symbols to Asana + env: + ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }} + run: | + asana_dsyms_path="${{ github.workspace }}/DuckDuckGo-Alpha-${{ env.app_version }}(${{ env.build_version }})-dSYM.zip" + mv -f "${{ env.dsyms_path }}" "$asana_dsyms_path" + + curl -s "https://app.asana.com/api/1.0/tasks/1205344386326139/attachments" \ + -H "Authorization: Bearer ${{ secrets.ASANA_ACCESS_TOKEN }}" \ + --form "file=@${asana_dsyms_path};type=application/zip" diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index ad5c8bec9d..5a67fdb265 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -1,4 +1,4 @@ -name: Nightly Integration Tests +name: Nightly Test and Deploy on: schedule: @@ -94,3 +94,15 @@ jobs: with: report_paths: unittests.xml + deploy-alpha: + name: Deploy Nightly Alpha Build + uses: ./.github/workflows/alpha.yml + with: + destination: "Nightly Alpha Group" + secrets: + APPLE_API_KEY_BASE64: ${{ secrets.APPLE_API_KEY_BASE64 }} + APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }} + APPLE_API_KEY_ISSUER: ${{ secrets.APPLE_API_KEY_ISSUER }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }} diff --git a/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo-Alpha.xcscheme b/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo-Alpha.xcscheme new file mode 100644 index 0000000000..ab41c0e9a0 --- /dev/null +++ b/DuckDuckGo.xcodeproj/xcshareddata/xcschemes/DuckDuckGo-Alpha.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/alphaExportOptions.plist b/alphaExportOptions.plist new file mode 100644 index 0000000000..9f949f40ac --- /dev/null +++ b/alphaExportOptions.plist @@ -0,0 +1,23 @@ + + + + + teamID + HKE973VLUW + method + app-store + provisioningProfiles + + com.duckduckgo.mobile.ios.alpha + match AppStore com.duckduckgo.mobile.ios.alpha + com.duckduckgo.mobile.ios.alpha.ShareExtension + match AppStore com.duckduckgo.mobile.ios.alpha.ShareExtension + com.duckduckgo.mobile.ios.alpha.OpenAction2 + match AppStore com.duckduckgo.mobile.ios.alpha.OpenAction2 + com.duckduckgo.mobile.ios.alpha.Widgets + match AppStore com.duckduckgo.mobile.ios.alpha.Widgets + com.duckduckgo.mobile.ios.alpha.NetworkExtension + match AppStore com.duckduckgo.mobile.ios.alpha.NetworkExtension + + + diff --git a/fastlane/Fastfile b/fastlane/Fastfile index be82b0b85f..dcc1b3745d 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -18,6 +18,7 @@ lane :sync_signing_adhoc do |options| do_sync_signing(options) end +desc 'Fetches and updates certificates and provisioning profiles for Alpha distribution' lane :sync_signing_alpha do |options| do_sync_signing(options) end @@ -88,11 +89,6 @@ lane :adhoc do |options| end end -desc 'Makes Alpha release build and uploads it to App Store Connect (TestFlight)' -lane :alpha do |options| -# TODO -end - desc 'Makes App Store release build and uploads it to App Store Connect' lane :release_appstore do |options| build_release(options) @@ -132,13 +128,29 @@ lane :release_testflight do ) end +desc 'Makes Alpha release build and uploads it to TestFlight' +lane :release_alpha do |options| + build_alpha(options) + + upload_to_testflight( + api_key: get_api_key, + groups: options[:groups], + skip_waiting_for_build_processing: true + ) +end + desc 'Increment build number based on version in App Store Connect' lane :increment_build_number_for_version do |options| + app_identifier = "com.duckduckgo.mobile.ios" + if options[:app_identifier] + app_identifier = options[:app_identifier] + end increment_build_number({ build_number: latest_testflight_build_number( + api_key: get_api_key, version: options[:version], - app_identifier: "com.duckduckgo.mobile.ios", + app_identifier: app_identifier, initial_build_number: -1, username: get_username(options)) + 1, skip_info_plist: "true" @@ -172,6 +184,18 @@ private_lane :build_release do |options| ) end +private_lane :build_alpha do |options| + sync_signing_alpha(options) + + build_app( + export_method: "app-store", + configuration: "Alpha", + scheme: "DuckDuckGo-Alpha", + export_options: "alphaExportOptions.plist", + derived_data_path: "DerivedData" + ) +end + private_lane :get_api_key do has_api_key = [ "APPLE_API_KEY_ID", @@ -209,7 +233,7 @@ private_lane :do_sync_signing do |options| sync_code_signing( api_key: get_api_key, username: get_username(options), - readonly: is_ci && !is_adhoc + readonly: is_ci && !is_adhoc ) end diff --git a/fastlane/Matchfile b/fastlane/Matchfile index de59777a19..400b1ffebc 100644 --- a/fastlane/Matchfile +++ b/fastlane/Matchfile @@ -19,11 +19,9 @@ for_lane :adhoc do end for_lane :sync_signing_alpha do - type "appstore" app_identifier ["com.duckduckgo.mobile.ios.alpha", "com.duckduckgo.mobile.ios.alpha.ShareExtension", "com.duckduckgo.mobile.ios.alpha.OpenAction2", "com.duckduckgo.mobile.ios.alpha.Widgets", "com.duckduckgo.mobile.ios.alpha.NetworkExtension"] end -for_lane :alpha do - type "appstore" +for_lane :release_alpha do app_identifier ["com.duckduckgo.mobile.ios.alpha", "com.duckduckgo.mobile.ios.alpha.ShareExtension", "com.duckduckgo.mobile.ios.alpha.OpenAction2", "com.duckduckgo.mobile.ios.alpha.Widgets", "com.duckduckgo.mobile.ios.alpha.NetworkExtension"] end diff --git a/fastlane/README.md b/fastlane/README.md index b0375dd0f9..452c9fec13 100644 --- a/fastlane/README.md +++ b/fastlane/README.md @@ -35,7 +35,7 @@ Fetches and updates certificates and provisioning profiles for Ad-Hoc distributi [bundle exec] fastlane sync_signing_alpha ``` - +Fetches and updates certificates and provisioning profiles for Alpha distribution ### adhoc @@ -45,14 +45,6 @@ Fetches and updates certificates and provisioning profiles for Ad-Hoc distributi Makes Ad-Hoc build with a specified name in a given directory -### alpha - -```sh -[bundle exec] fastlane alpha -``` - -Makes Alpha release build and uploads it to App Store Connect (TestFlight) - ### release_appstore ```sh @@ -77,6 +69,14 @@ Updates App Store metadata Makes App Store release build and uploads it to TestFlight +### release_alpha + +```sh +[bundle exec] fastlane release_alpha +``` + +Makes Alpha release build and uploads it to TestFlight + ### increment_build_number_for_version ```sh