From bb0f3947e3842c3be2d99b603bd7d5df52482f8f Mon Sep 17 00:00:00 2001 From: Dominik Kapusta Date: Wed, 11 Sep 2024 19:34:54 +0200 Subject: [PATCH] Use fastlane match for code signing DMG builds (#3246) Task/Issue URL: https://app.asana.com/0/1203301625297703/1208273969808386/f Description: This change adds support for using fastlane match to manage code signing with Developer ID Application certificate. New lanes are added for syncing code signing for local and CI use. Build settings are updated to use provisioning profiles generated by fastlane. archive.sh script and all CI workflows are updated to use fastlane for signing DMG builds and other CI binaries that use Developer ID Application certificate (e.g. unit tests). --- .../install-certs-and-profiles/action.yml | 187 ------------------ .github/workflows/build_appstore.yml | 5 +- .github/workflows/build_hotfix_release.yml | 30 +-- .github/workflows/build_notarized.yml | 112 +++-------- .github/workflows/bump_internal_release.yml | 31 +-- .github/workflows/code_freeze.yml | 31 +-- .github/workflows/create_variant.yml | 113 +++-------- .github/workflows/create_variants.yml | 93 +-------- .github/workflows/pr.yml | 146 ++++---------- .github/workflows/publish_dmg_release.yml | 32 +-- .github/workflows/sync_end_to_end.yml | 49 ++--- .../workflows/sync_end_to_end_legacy_os.yml | 81 +++----- .github/workflows/ui_tests.yml | 49 ++--- .../App/DBP/DuckDuckGoDBPAgent.xcconfig | 6 +- .../DBP/DuckDuckGoDBPAgentAppStore.xcconfig | 2 +- Configuration/App/DuckDuckGo.xcconfig | 6 +- Configuration/App/DuckDuckGoAppStore.xcconfig | 2 +- .../DuckDuckGoNotifications.xcconfig | 6 +- .../NetworkProtection/DuckDuckGoVPN.xcconfig | 6 +- .../DuckDuckGoVPNAppStore.xcconfig | 2 +- .../NetworkProtectionAppExtension.xcconfig | 2 +- .../NetworkProtectionSystemExtension.xcconfig | 4 +- .../VPNProxyExtension.xcconfig | 2 +- Configuration/Tests/IntegrationTests.xcconfig | 2 +- .../Tests/IntegrationTestsAppStore.xcconfig | 2 +- Configuration/Tests/UnitTests.xcconfig | 2 +- .../Tests/UnitTestsAppStore.xcconfig | 2 +- .../Screenshot 2024-03-14 alle 13.19.29.png | Bin 85134 -> 0 bytes fastlane/Fastfile | 30 +++ fastlane/Matchfile | 74 +++++-- fastlane/README.md | 24 +++ scripts/assets/ExportOptions.plist | 20 +- 32 files changed, 325 insertions(+), 828 deletions(-) delete mode 100644 .github/actions/install-certs-and-profiles/action.yml delete mode 100644 LocalPackages/Screenshot 2024-03-14 alle 13.19.29.png diff --git a/.github/actions/install-certs-and-profiles/action.yml b/.github/actions/install-certs-and-profiles/action.yml deleted file mode 100644 index d9e4e7e7be..0000000000 --- a/.github/actions/install-certs-and-profiles/action.yml +++ /dev/null @@ -1,187 +0,0 @@ -name: Install Certs and Profiles -description: Installs signing certificates and provisioning profiles -inputs: - BUILD_CERTIFICATE_BASE64: - required: true - type: string - P12_PASSWORD: - required: true - type: string - KEYCHAIN_PASSWORD: - required: true - type: string - APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - CI_PROVISION_PROFILE_BASE64: - required: true - type: string - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: - required: true - type: string - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: - required: true - type: string - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: - required: true - type: string - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: - required: true - type: string - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: - required: true - type: string - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: - required: true - type: string - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: - required: true - type: string - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: - required: true - type: string - RELEASE_PROVISION_PROFILE_BASE64: - required: true - type: string - REVIEW_PROVISION_PROFILE_BASE64: - required: true - type: string - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - VPN_APP_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: - required: true - type: string - access-token: - description: "Asana access token" - required: true - type: string - file-name: - description: "Name of the uploaded file" - required: true - type: string - task-url: - description: "Asana task URL" - required: true - type: string -runs: - using: "composite" - steps: - - run: | - # create variables - CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 - KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db - APPSTORE_CI_PP_PATH=$RUNNER_TEMP/appstore_ci.provisionprofile - CI_PP_PATH=$RUNNER_TEMP/ci.provisionprofile - DBP_AGENT_APPSTORE_CI_PP_PATH=$RUNNER_TEMP/dbp_agent_appstore_ci.provisionprofile - DBP_AGENT_CI_PP_PATH=$RUNNER_TEMP/dbp_agent_ci.provisionprofile - DBP_AGENT_RELEASE_PP_PATH=$RUNNER_TEMP/dbp_agent_release_pp.provisionprofile - DBP_AGENT_REVIEW_PP_PATH=$RUNNER_TEMP/dbp_agent_review_pp.provisionprofile - INTEGRATION_TESTS_APPSTORE_CI_PP_PATH=$RUNNER_TEMP/integration_tests_appstore_ci.provisionprofile - INTEGRATION_TESTS_CI_PP_PATH=$RUNNER_TEMP/integration_tests_ci.provisionprofile - NETP_AGENT_RELEASE_PP_PATH=$RUNNER_TEMP/netp_agent_release_pp.provisionprofile - NETP_AGENT_REVIEW_PP_PATH=$RUNNER_TEMP/netp_agent_review_pp.provisionprofile - NETP_NOTIFICATIONS_CI_PP_PATH=$RUNNER_TEMP/netp_notifications_ci.provisionprofile - NETP_NOTIFICATIONS_RELEASE_PP_PATH=$RUNNER_TEMP/netp_notifications_release_pp.provisionprofile - NETP_NOTIFICATIONS_REVIEW_PP_PATH=$RUNNER_TEMP/netp_notifications_review_pp.provisionprofile - NETP_SYSEX_RELEASE_PP_PATH=$RUNNER_TEMP/netp_sysex_release_pp.provisionprofile - NETP_SYSEX_REVIEW_PP_PATH=$RUNNER_TEMP/netp_sysex_review_pp.provisionprofile - RELEASE_PP_PATH=$RUNNER_TEMP/release_pp.provisionprofile - REVIEW_PP_PATH=$RUNNER_TEMP/review_pp.provisionprofile - UNIT_TESTS_APPSTORE_CI_PP_PATH=$RUNNER_TEMP/unit_tests_appstore_ci.provisionprofile - UNIT_TESTS_CI_PP_PATH=$RUNNER_TEMP/unit_tests_ci.provisionprofile - VPN_APPEX_APPSTORE_CI_PP_PATH=$RUNNER_TEMP/vpn_appex_appstore_ci.provisionprofile - VPN_APP_APPSTORE_CI_PP_PATH=$RUNNER_TEMP/vpn_app_appstore_ci.provisionprofile - VPN_APP_CI_PP_PATH=$RUNNER_TEMP/vpn_app_ci.provisionprofile - VPN_PROXY_EXTENSION_CI_PP_PATH=$RUNNER_TEMP/vpn_proxy_extension_ci.provisionprofile - - # import certificate from secrets - echo -n "${{ inputs.BUILD_CERTIFICATE_BASE64 }}" | base64 --decode -o $CERTIFICATE_PATH - echo -n "${{ inputs.APPSTORE_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $APPSTORE_CI_PP_PATH - echo -n "${{ inputs.CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $CI_PP_PATH - echo -n "${{ inputs.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $DBP_AGENT_APPSTORE_CI_PP_PATH - echo -n "${{ inputs.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $DBP_AGENT_CI_PP_PATH - echo -n "${{ inputs.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $DBP_AGENT_RELEASE_PP_PATH - echo -n "${{ inputs.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $DBP_AGENT_REVIEW_PP_PATH - echo -n "${{ inputs.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $INTEGRATION_TESTS_APPSTORE_CI_PP_PATH - echo -n "${{ inputs.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $INTEGRATION_TESTS_CI_PP_PATH - echo -n "${{ inputs.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $NETP_AGENT_RELEASE_PP_PATH - echo -n "${{ inputs.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $NETP_AGENT_REVIEW_PP_PATH - echo -n "${{ inputs.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $NETP_NOTIFICATIONS_CI_PP_PATH - echo -n "${{ inputs.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $NETP_NOTIFICATIONS_RELEASE_PP_PATH - echo -n "${{ inputs.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $NETP_NOTIFICATIONS_REVIEW_PP_PATH - echo -n "${{ inputs.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $NETP_SYSEX_RELEASE_PP_PATH - echo -n "${{ inputs.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $NETP_SYSEX_REVIEW_PP_PATH - echo -n "${{ inputs.RELEASE_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $RELEASE_PP_PATH - echo -n "${{ inputs.REVIEW_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $REVIEW_PP_PATH - echo -n "${{ inputs.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $UNIT_TESTS_APPSTORE_CI_PP_PATH - echo -n "${{ inputs.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $UNIT_TESTS_CI_PP_PATH - echo -n "${{ inputs.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $VPN_APPEX_APPSTORE_CI_PP_PATH - echo -n "${{ inputs.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $VPN_APP_APPSTORE_CI_PP_PATH - echo -n "${{ inputs.VPN_APP_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $VPN_APP_CI_PP_PATH - echo -n "${{ inputs.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }}" | base64 --decode -o $VPN_PROXY_EXTENSION_CI_PP_PATH - - # create temporary keychain - security create-keychain -p "${{ inputs.KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH - security set-keychain-settings -lut 21600 $KEYCHAIN_PATH - security unlock-keychain -p "${{ inputs.KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH - - # import certificate to keychain - security import $CERTIFICATE_PATH -P "${{ inputs.P12_PASSWORD }}" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH - security list-keychain -d user -s $KEYCHAIN_PATH - security default-keychain -s $RUNNER_TEMP/app-signing.keychain-db - - # apply provisioning profile - mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles - cp $APPSTORE_CI_PP_PATH \ - $CI_PP_PATH \ - $DBP_AGENT_APPSTORE_CI_PP_PATH \ - $DBP_AGENT_CI_PP_PATH \ - $DBP_AGENT_RELEASE_PP_PATH \ - $DBP_AGENT_REVIEW_PP_PATH \ - $INTEGRATION_TESTS_APPSTORE_CI_PP_PATH \ - $INTEGRATION_TESTS_CI_PP_PATH \ - $NETP_AGENT_RELEASE_PP_PATH \ - $NETP_AGENT_REVIEW_PP_PATH \ - $NETP_NOTIFICATIONS_CI_PP_PATH \ - $NETP_NOTIFICATIONS_RELEASE_PP_PATH \ - $NETP_NOTIFICATIONS_REVIEW_PP_PATH \ - $NETP_SYSEX_RELEASE_PP_PATH \ - $NETP_SYSEX_REVIEW_PP_PATH \ - $RELEASE_PP_PATH \ - $UNIT_TESTS_APPSTORE_CI_PP_PATH \ - $UNIT_TESTS_CI_PP_PATH \ - $VPN_APPEX_APPSTORE_CI_PP_PATH \ - $VPN_APP_APPSTORE_CI_PP_PATH \ - $VPN_APP_CI_PP_PATH \ - $VPN_PROXY_EXTENSION_CI_PP_PATH \ - $REVIEW_PP_PATH \ - ~/Library/MobileDevice/Provisioning\ Profiles - shell: bash diff --git a/.github/workflows/build_appstore.yml b/.github/workflows/build_appstore.yml index 2bfac0326d..d18b400a52 100644 --- a/.github/workflows/build_appstore.yml +++ b/.github/workflows/build_appstore.yml @@ -76,11 +76,10 @@ jobs: *) echo "👎 Not a release or hotfix branch"; exit 1 ;; esac - - name: Register SSH keys for submodules access + - name: Register SSH key for certificates repository access uses: webfactory/ssh-agent@v0.7.0 with: - ssh-private-key: | - ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} - name: Check out the code uses: actions/checkout@v4 diff --git a/.github/workflows/build_hotfix_release.yml b/.github/workflows/build_hotfix_release.yml index 10ee8c13a5..f21167e951 100644 --- a/.github/workflows/build_hotfix_release.yml +++ b/.github/workflows/build_hotfix_release.yml @@ -41,33 +41,11 @@ jobs: needs: assert_release_branch uses: ./.github/workflows/pr.yml 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 }} ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }} - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} update_asana: diff --git a/.github/workflows/build_notarized.yml b/.github/workflows/build_notarized.yml index 7f409ae583..8f6e5b3359 100644 --- a/.github/workflows/build_notarized.yml +++ b/.github/workflows/build_notarized.yml @@ -41,58 +41,6 @@ on: required: false type: string secrets: - BUILD_CERTIFICATE_BASE64: - required: true - P12_PASSWORD: - required: true - KEYCHAIN_PASSWORD: - required: true - APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: - required: true - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: - required: true - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: - required: true - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: - required: true - RELEASE_PROVISION_PROFILE_BASE64: - required: true - REVIEW_PROVISION_PROFILE_BASE64: - required: true - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APP_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: - required: true APPLE_API_KEY_BASE64: required: true APPLE_API_KEY_ID: @@ -101,10 +49,6 @@ on: required: true ASANA_ACCESS_TOKEN: required: true - MM_HANDLES_BASE64: - required: true - MM_WEBHOOK_URL: - required: true AWS_ACCESS_KEY_ID: required: true AWS_ACCESS_KEY_ID_RELEASE_S3: @@ -113,6 +57,14 @@ on: required: true AWS_SECRET_ACCESS_KEY_RELEASE_S3: required: true + MATCH_PASSWORD: + required: true + MM_HANDLES_BASE64: + required: true + MM_WEBHOOK_URL: + required: true + SSH_PRIVATE_KEY_FASTLANE_MATCH: + required: true jobs: export-notarized-app: @@ -132,6 +84,10 @@ jobs: branch: ${{ inputs.branch || github.ref_name }} steps: + - name: Register SSH key for certificates repository access + 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@v4 @@ -142,6 +98,20 @@ jobs: - name: Set up fastlane run: bundle install + - name: Sync code signing assets + 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 }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + run: | + if [[ "${{ env.release-type }}" == "release" ]]; then + bundle exec fastlane sync_signing_dmg_release + else + bundle exec fastlane sync_signing_dmg_review + fi + - name: Check if this is an official release build id: is-official-release env: @@ -155,36 +125,6 @@ jobs: echo "upload-to=asana" >> $GITHUB_ENV fi - - name: Install Apple Developer ID Application certificate - uses: ./.github/actions/install-certs-and-profiles - with: - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} - - name: Select Xcode run: sudo xcode-select -s /Applications/Xcode_$(<.xcode-version).app/Contents/Developer diff --git a/.github/workflows/bump_internal_release.yml b/.github/workflows/bump_internal_release.yml index fc2ae5b8b8..ed2d014474 100644 --- a/.github/workflows/bump_internal_release.yml +++ b/.github/workflows/bump_internal_release.yml @@ -139,33 +139,12 @@ jobs: with: branch: ${{ needs.validate_input_conditions.outputs.release-branch }} 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 }} ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }} - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} increment_build_number: diff --git a/.github/workflows/code_freeze.yml b/.github/workflows/code_freeze.yml index 9d66ce6cc0..a282e822ff 100644 --- a/.github/workflows/code_freeze.yml +++ b/.github/workflows/code_freeze.yml @@ -99,33 +99,12 @@ jobs: with: branch: ${{ needs.create_release_branch.outputs.release_branch_name }} 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 }} ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }} - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} increment_build_number: diff --git a/.github/workflows/create_variant.yml b/.github/workflows/create_variant.yml index 04eef53fcb..24def9102a 100644 --- a/.github/workflows/create_variant.yml +++ b/.github/workflows/create_variant.yml @@ -20,74 +20,20 @@ on: required: false type: string secrets: - BUILD_CERTIFICATE_BASE64: - required: true - P12_PASSWORD: - required: true - KEYCHAIN_PASSWORD: - required: true - APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: - required: true - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: - required: true - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: - required: true - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: - required: true - RELEASE_PROVISION_PROFILE_BASE64: - required: true - REVIEW_PROVISION_PROFILE_BASE64: - required: true - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APP_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: - required: true APPLE_API_KEY_BASE64: required: true APPLE_API_KEY_ID: required: true APPLE_API_KEY_ISSUER: required: true - ASANA_ACCESS_TOKEN: - required: true - MM_HANDLES_BASE64: - required: true - MM_WEBHOOK_URL: - required: true AWS_ACCESS_KEY_ID_RELEASE_S3: required: true AWS_SECRET_ACCESS_KEY_RELEASE_S3: required: true + MATCH_PASSWORD: + required: true + SSH_PRIVATE_KEY_FASTLANE_MATCH: + required: true jobs: @@ -104,14 +50,33 @@ jobs: steps: + - name: Register SSH key for certificates repository access + 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@v4 with: - ref: main sparse-checkout: | .github + Gemfile + Gemfile.lock + fastlane scripts + - name: Set up fastlane + run: bundle install + + - name: Sync code signing assets + 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 }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + run: bundle exec fastlane sync_signing_dmg_release + - name: Download DMG artifact id: download-dmg-artifact continue-on-error: true @@ -138,36 +103,6 @@ jobs: - name: Install create-dmg run: brew install create-dmg - - name: Install Apple Developer ID Application certificate - uses: ./.github/actions/install-certs-and-profiles - with: - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} - - name: Set up variant working-directory: ${{ github.workspace }}/dmg run: | diff --git a/.github/workflows/create_variants.yml b/.github/workflows/create_variants.yml index e75c9da61d..ec0c553864 100644 --- a/.github/workflows/create_variants.yml +++ b/.github/workflows/create_variants.yml @@ -5,58 +5,6 @@ on: workflow_call: secrets: - BUILD_CERTIFICATE_BASE64: - required: true - P12_PASSWORD: - required: true - KEYCHAIN_PASSWORD: - required: true - APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: - required: true - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: - required: true - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: - required: true - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: - required: true - RELEASE_PROVISION_PROFILE_BASE64: - required: true - REVIEW_PROVISION_PROFILE_BASE64: - required: true - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APP_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: - required: true APPLE_API_KEY_BASE64: required: true APPLE_API_KEY_ID: @@ -65,13 +13,17 @@ on: required: true ASANA_ACCESS_TOKEN: required: true + AWS_ACCESS_KEY_ID_RELEASE_S3: + required: true + AWS_SECRET_ACCESS_KEY_RELEASE_S3: + required: true + MATCH_PASSWORD: + required: true MM_HANDLES_BASE64: required: true MM_WEBHOOK_URL: required: true - AWS_ACCESS_KEY_ID_RELEASE_S3: - required: true - AWS_SECRET_ACCESS_KEY_RELEASE_S3: + SSH_PRIVATE_KEY_FASTLANE_MATCH: required: true jobs: @@ -130,40 +82,13 @@ jobs: atb-variant: ${{ matrix.variant }} origin-variant: ${{ matrix.origin }} secrets: - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} 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 }} - ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }} - MM_HANDLES_BASE64: ${{ secrets.MM_HANDLES_BASE64 }} - MM_WEBHOOK_URL: ${{ secrets.MM_WEBHOOK_URL }} AWS_ACCESS_KEY_ID_RELEASE_S3: ${{ secrets.AWS_ACCESS_KEY_ID_RELEASE_S3 }} AWS_SECRET_ACCESS_KEY_RELEASE_S3: ${{ secrets.AWS_SECRET_ACCESS_KEY_RELEASE_S3 }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} mattermost: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index f23069962d..846f35e90c 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -11,59 +11,17 @@ on: required: false type: string secrets: - ASANA_ACCESS_TOKEN: - required: true - BUILD_CERTIFICATE_BASE64: - required: true - P12_PASSWORD: - required: true - KEYCHAIN_PASSWORD: - required: true - APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: - required: true - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: - required: true - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: - required: true - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: - required: true - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: + APPLE_API_KEY_BASE64: required: true - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: + APPLE_API_KEY_ID: required: true - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: + APPLE_API_KEY_ISSUER: required: true - RELEASE_PROVISION_PROFILE_BASE64: - required: true - REVIEW_PROVISION_PROFILE_BASE64: - required: true - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: - required: true - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: + ASANA_ACCESS_TOKEN: required: true - VPN_APP_CI_PROVISION_PROFILE_BASE64: + MATCH_PASSWORD: required: true - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: + SSH_PRIVATE_KEY_FASTLANE_MATCH: required: true jobs: @@ -169,6 +127,11 @@ jobs: commit_author: ${{ steps.fetch_commit_author.outputs.commit_author }} steps: + - name: Register SSH key for certificates repository access + uses: webfactory/ssh-agent@v0.7.0 + with: + ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + - name: Check out the code if: github.event_name == 'pull_request' || github.event_name == 'push' uses: actions/checkout@v4 @@ -182,6 +145,18 @@ jobs: submodules: recursive ref: ${{ inputs.branch || github.ref_name }} + - name: Set up fastlane + run: bundle install + + - name: Sync code signing assets + 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 }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + run: bundle exec fastlane sync_signing_ci + - name: Set cache key hash run: | has_only_tags=$(jq '[ .pins[].state | has("version") ] | all' DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved) @@ -191,36 +166,6 @@ jobs: echo "Package.resolved contains dependencies specified by branch or commit, skipping cache." fi - - name: Install Apple Developer ID Application certificate - uses: ./.github/actions/install-certs-and-profiles - with: - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} - - name: Cache SPM if: env.cache_key_hash uses: actions/cache@v4 @@ -376,40 +321,27 @@ jobs: timeout-minutes: 30 steps: + - name: Register SSH key for certificates repository access + 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@v4 with: submodules: recursive - - name: Install Apple Developer ID Application certificate - uses: ./.github/actions/install-certs-and-profiles - with: - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} + - name: Set up fastlane + run: bundle install + + - name: Sync code signing assets + 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 }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + run: bundle exec fastlane sync_signing_dmg_release - name: Set cache key hash run: | diff --git a/.github/workflows/publish_dmg_release.yml b/.github/workflows/publish_dmg_release.yml index 2ff1022270..86f49dfdd5 100644 --- a/.github/workflows/publish_dmg_release.yml +++ b/.github/workflows/publish_dmg_release.yml @@ -407,37 +407,13 @@ jobs: uses: duckduckgo/macos-browser/.github/workflows/create_variants.yml@main secrets: - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} 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 }} ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }} - MM_HANDLES_BASE64: ${{ secrets.MM_HANDLES_BASE64 }} - MM_WEBHOOK_URL: ${{ secrets.MM_WEBHOOK_URL }} AWS_ACCESS_KEY_ID_RELEASE_S3: ${{ secrets.AWS_ACCESS_KEY_ID_RELEASE_S3 }} AWS_SECRET_ACCESS_KEY_RELEASE_S3: ${{ secrets.AWS_SECRET_ACCESS_KEY_RELEASE_S3 }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + MM_HANDLES_BASE64: ${{ secrets.MM_HANDLES_BASE64 }} + MM_WEBHOOK_URL: ${{ secrets.MM_WEBHOOK_URL }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} diff --git a/.github/workflows/sync_end_to_end.yml b/.github/workflows/sync_end_to_end.yml index bfe438e140..bd6121486e 100644 --- a/.github/workflows/sync_end_to_end.yml +++ b/.github/workflows/sync_end_to_end.yml @@ -22,11 +22,30 @@ jobs: timeout-minutes: 60 steps: + - name: Register SSH key for certificates repository access + 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@v4 with: submodules: recursive + - name: Set up fastlane + run: bundle install + + - name: Sync code signing assets + 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 }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + run: | + bundle exec fastlane sync_signing_dmg_review + bundle exec fastlane sync_signing_ci + - name: Set cache key hash run: | has_only_tags=$(jq '[ .pins[].state | has("version") ] | all' DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved) @@ -45,36 +64,6 @@ jobs: restore-keys: | ${{ runner.os }}-spm- - - name: Install Apple Developer ID Application certificate - uses: ./.github/actions/install-certs-and-profiles - with: - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} - - name: Select Xcode run: | # Override .xcode_version because 15.4 is not available on macos 13 diff --git a/.github/workflows/sync_end_to_end_legacy_os.yml b/.github/workflows/sync_end_to_end_legacy_os.yml index d08cedeaa5..fa8230c69b 100644 --- a/.github/workflows/sync_end_to_end_legacy_os.yml +++ b/.github/workflows/sync_end_to_end_legacy_os.yml @@ -14,42 +14,18 @@ jobs: create-dmg: false branch: ${{ github.ref_name }} secrets: - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} 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 }} ASANA_ACCESS_TOKEN: ${{ secrets.ASANA_ACCESS_TOKEN }} - MM_HANDLES_BASE64: ${{ secrets.MM_HANDLES_BASE64 }} - MM_WEBHOOK_URL: ${{ secrets.MM_WEBHOOK_URL }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_ACCESS_KEY_ID_RELEASE_S3: ${{ secrets.AWS_ACCESS_KEY_ID_RELEASE_S3 }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_SECRET_ACCESS_KEY_RELEASE_S3: ${{ secrets.AWS_SECRET_ACCESS_KEY_RELEASE_S3 }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + MM_HANDLES_BASE64: ${{ secrets.MM_HANDLES_BASE64 }} + MM_WEBHOOK_URL: ${{ secrets.MM_WEBHOOK_URL }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} sync-end-to-end-tests-older-macos: name: Sync E2E tests @@ -65,11 +41,30 @@ jobs: timeout-minutes: 60 steps: + - name: Register SSH key for certificates repository access + 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@v4 with: submodules: recursive + - name: Set up fastlane + run: bundle install + + - name: Sync code signing assets + 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 }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + run: | + bundle exec fastlane sync_signing_dmg_review + bundle exec fastlane sync_signing_ci + - name: Download and unzip artifact uses: actions/download-artifact@v4 @@ -91,36 +86,6 @@ jobs: restore-keys: | ${{ runner.os }}-spm- - - name: Install Apple Developer ID Application certificate - uses: ./.github/actions/install-certs-and-profiles - with: - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} - - name: Select Xcode 14.2 for macOS 12 if: matrix.runner == 'macos-12-large' run: sudo xcode-select -s /Applications/Xcode_14.2.app/Contents/Developer diff --git a/.github/workflows/ui_tests.yml b/.github/workflows/ui_tests.yml index f0eeee1fd5..a2e0bcea7f 100644 --- a/.github/workflows/ui_tests.yml +++ b/.github/workflows/ui_tests.yml @@ -30,11 +30,30 @@ jobs: timeout-minutes: 120 steps: + - name: Register SSH key for certificates repository access + 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@v4 with: submodules: recursive + - name: Set up fastlane + run: bundle install + + - name: Sync code signing assets + 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 }} + SSH_PRIVATE_KEY_FASTLANE_MATCH: ${{ secrets.SSH_PRIVATE_KEY_FASTLANE_MATCH }} + run: | + bundle exec fastlane sync_signing_dmg_review + bundle exec fastlane sync_signing_ci + - name: Set cache key hash run: | has_only_tags=$(jq '[ .pins[].state | has("version") ] | all' DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved) @@ -53,36 +72,6 @@ jobs: restore-keys: | ${{ runner.os }}-spm- - - name: Install Apple Developer ID Application certificate - uses: ./.github/actions/install-certs-and-profiles - with: - BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} - P12_PASSWORD: ${{ secrets.P12_PASSWORD }} - KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} - APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - CI_PROVISION_PROFILE_BASE64: ${{ secrets.CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_CI_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_CI_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.DBP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.INTEGRATION_TESTS_CI_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_CI_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_NOTIFICATIONS_REVIEW_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64 }} - NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64 }} - RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_PROVISION_PROFILE_BASE64 }} - REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - UNIT_TESTS_CI_PROVISION_PROFILE_BASE64: ${{ secrets.UNIT_TESTS_CI_PROVISION_PROFILE_BASE64 }} - VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APPEX_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_APPSTORE_CI_PROVISION_PROFILE_BASE64 }} - VPN_APP_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_APP_CI_PROVISION_PROFILE_BASE64 }} - VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64: ${{ secrets.VPN_PROXY_EXTENSION_CI_PROVISION_PROFILE_BASE64 }} - - name: Select Xcode run: | # Override .xcode_version because 15.4 is not available on macos 13 diff --git a/Configuration/App/DBP/DuckDuckGoDBPAgent.xcconfig b/Configuration/App/DBP/DuckDuckGoDBPAgent.xcconfig index c85851b0d5..fcbd72644a 100644 --- a/Configuration/App/DBP/DuckDuckGoDBPAgent.xcconfig +++ b/Configuration/App/DBP/DuckDuckGoDBPAgent.xcconfig @@ -40,9 +40,9 @@ PRODUCT_NAME = $(DBP_BACKGROUND_AGENT_PRODUCT_NAME) PRODUCT_NAME[config=Review][arch=*][sdk=*] = $(DBP_BACKGROUND_AGENT_PRODUCT_NAME) PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = macOS DBP Agent - CI -PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = macOS DBP Agent - Review -PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = macOS DBP Agent - Release +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.macos.DBP.backgroundAgent.debug macos +PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match Direct com.duckduckgo.macos.DBP.backgroundAgent.review macos +PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match Direct com.duckduckgo.macos.DBP.backgroundAgent macos FEATURE_FLAGS = FEEDBACK diff --git a/Configuration/App/DBP/DuckDuckGoDBPAgentAppStore.xcconfig b/Configuration/App/DBP/DuckDuckGoDBPAgentAppStore.xcconfig index 80e0ba8554..6380e5f6c7 100644 --- a/Configuration/App/DBP/DuckDuckGoDBPAgentAppStore.xcconfig +++ b/Configuration/App/DBP/DuckDuckGoDBPAgentAppStore.xcconfig @@ -43,7 +43,7 @@ PRODUCT_NAME[config=Review][arch=*][sdk=*] = $(DBP_BACKGROUND_AGENT_PRODUCT_NAME PRODUCT_NAME[config=Release][arch=*][sdk=*] = $(DBP_BACKGROUND_AGENT_RELEASE_PRODUCT_NAME) PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = macOS DBP Agent App Store - CI +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.mobile.ios.DBP.backgroundAgent.debug macos PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.DBP.backgroundAgent.review macos PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.DBP.backgroundAgent macos diff --git a/Configuration/App/DuckDuckGo.xcconfig b/Configuration/App/DuckDuckGo.xcconfig index 79280e5310..b156d94ca9 100644 --- a/Configuration/App/DuckDuckGo.xcconfig +++ b/Configuration/App/DuckDuckGo.xcconfig @@ -29,9 +29,9 @@ FEATURE_FLAGS = FEEDBACK SPARKLE STRIPE PRODUCT_NAME_PREFIX = DuckDuckGo PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = MacOS Browser CI -PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = MacOS Browser -PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = MacOS Browser Product Review +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.macos.browser.debug macos +PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match Direct com.duckduckgo.macos.browser macos +PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match Direct com.duckduckgo.macos.browser.review macos GCC_PREPROCESSOR_DEFINITIONS[arch=*][sdk=*] = NETP_SYSTEM_EXTENSION=1 SWIFT_OBJC_INTERFACE_HEADER_NAME=$(SWIFT_OBJC_INTERFACE_HEADER_NAME) uint64_t="unsigned long long" _UINT64_T=1 GCC_PREPROCESSOR_DEFINITIONS[config=CI][arch=*][sdk=*] = NETP_SYSTEM_EXTENSION=1 DEBUG=1 CI=1 SWIFT_OBJC_INTERFACE_HEADER_NAME=$(SWIFT_OBJC_INTERFACE_HEADER_NAME) $(inherited) diff --git a/Configuration/App/DuckDuckGoAppStore.xcconfig b/Configuration/App/DuckDuckGoAppStore.xcconfig index b1f2928573..6845ef0afe 100644 --- a/Configuration/App/DuckDuckGoAppStore.xcconfig +++ b/Configuration/App/DuckDuckGoAppStore.xcconfig @@ -36,7 +36,7 @@ PRODUCT_NAME_PREFIX = DuckDuckGo App Store PRODUCT_NAME[config=Release][arch=*][sdk=*] = $(RELEASE_PRODUCT_NAME_OVERRIDE:default=$(PRODUCT_NAME_PREFIX)) PROVISIONING_PROFILE_SPECIFIER[config=Debug][sdk=macosx*] = -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = MacOS Browser App Store CI +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.mobile.ios.debug macos PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios macos PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.review macos diff --git a/Configuration/App/NetworkProtection/DuckDuckGoNotifications.xcconfig b/Configuration/App/NetworkProtection/DuckDuckGoNotifications.xcconfig index fe27506ba1..25031eebb9 100644 --- a/Configuration/App/NetworkProtection/DuckDuckGoNotifications.xcconfig +++ b/Configuration/App/NetworkProtection/DuckDuckGoNotifications.xcconfig @@ -35,9 +35,9 @@ PRODUCT_NAME_PREFIX = $(NOTIFICATIONS_AGENT_PRODUCT_NAME) PRODUCT_NAME[config=Review][arch=*][sdk=*] = $(NOTIFICATIONS_AGENT_PRODUCT_NAME) PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = Mac Browser NetP Developer ID Not. (CI) -PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = MacOS Browser NetP Notifications Product Review -PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = Mac Browser NetP Developer ID Not. (Distribution) +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct HKE973VLUW.com.duckduckgo.macos.browser.network-protection.notifications.debug macos +PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match Direct HKE973VLUW.com.duckduckgo.macos.browser.network-protection.notifications.review macos +PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match Direct HKE973VLUW.com.duckduckgo.macos.browser.network-protection.notifications macos FEATURE_FLAGS[arch=*][sdk=*] = NETP_SYSTEM_EXTENSION FEATURE_FLAGS[config=CI][arch=*][sdk=*] = NETP_SYSTEM_EXTENSION diff --git a/Configuration/App/NetworkProtection/DuckDuckGoVPN.xcconfig b/Configuration/App/NetworkProtection/DuckDuckGoVPN.xcconfig index 98550c40bf..ae60e1c422 100644 --- a/Configuration/App/NetworkProtection/DuckDuckGoVPN.xcconfig +++ b/Configuration/App/NetworkProtection/DuckDuckGoVPN.xcconfig @@ -45,9 +45,9 @@ PRODUCT_NAME = $(AGENT_PRODUCT_NAME) PRODUCT_NAME[config=Review][arch=*][sdk=*] = $(AGENT_PRODUCT_NAME) PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = macOS NetP VPN App - CI (XPC) -PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = macOS NetP VPN App - Review (XPC) -PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = macOS NetP VPN App - Release (XPC) +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.macos.vpn.debug macos +PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match Direct com.duckduckgo.macos.vpn.review macos +PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match Direct com.duckduckgo.macos.vpn macos FEATURE_FLAGS[arch=*][sdk=*] = NETP_SYSTEM_EXTENSION FEATURE_FLAGS[config=CI][arch=*][sdk=*] = NETP_SYSTEM_EXTENSION diff --git a/Configuration/App/NetworkProtection/DuckDuckGoVPNAppStore.xcconfig b/Configuration/App/NetworkProtection/DuckDuckGoVPNAppStore.xcconfig index ab34bb4bb0..a91abe977b 100644 --- a/Configuration/App/NetworkProtection/DuckDuckGoVPNAppStore.xcconfig +++ b/Configuration/App/NetworkProtection/DuckDuckGoVPNAppStore.xcconfig @@ -47,7 +47,7 @@ PRODUCT_NAME[config=Review][arch=*][sdk=*] = $(AGENT_PRODUCT_NAME) PRODUCT_NAME[config=Release][arch=*][sdk=*] = $(AGENT_PRODUCT_NAME) PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = macOS NetP VPN App App Store - CI (XPC) +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.mobile.ios.vpn.agent.debug macos PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.vpn.agent macos PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.vpn.agent.review macos diff --git a/Configuration/Extensions/NetworkProtection/NetworkProtectionAppExtension.xcconfig b/Configuration/Extensions/NetworkProtection/NetworkProtectionAppExtension.xcconfig index c7e86619f9..5e4473570d 100644 --- a/Configuration/Extensions/NetworkProtection/NetworkProtectionAppExtension.xcconfig +++ b/Configuration/Extensions/NetworkProtection/NetworkProtectionAppExtension.xcconfig @@ -43,7 +43,7 @@ PRODUCT_BUNDLE_IDENTIFIER[config=Debug][sdk=*] = $(TUNNEL_EXTENSION_BUNDLE_ID) PRODUCT_BUNDLE_IDENTIFIER[config=Release][sdk=*] = $(TUNNEL_EXTENSION_BUNDLE_ID) PRODUCT_BUNDLE_IDENTIFIER[config=Review][sdk=*] = $(TUNNEL_EXTENSION_BUNDLE_ID) -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = macOS NetP VPN App XPC App Store - CI +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.mobile.ios.vpn.agent.debug.network-protection-extension macos PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.vpn.agent.network-protection-extension macos PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match AppStore com.duckduckgo.mobile.ios.vpn.agent.review.network-protection-extension macos diff --git a/Configuration/Extensions/NetworkProtection/NetworkProtectionSystemExtension.xcconfig b/Configuration/Extensions/NetworkProtection/NetworkProtectionSystemExtension.xcconfig index b726e5f807..8ce5293a5b 100644 --- a/Configuration/Extensions/NetworkProtection/NetworkProtectionSystemExtension.xcconfig +++ b/Configuration/Extensions/NetworkProtection/NetworkProtectionSystemExtension.xcconfig @@ -51,8 +51,8 @@ PRODUCT_NAME[config=Release][sdk=*] = $(SYSEX_BUNDLE_ID) PRODUCT_NAME[config=Review][sdk=*] = $(SYSEX_BUNDLE_ID) PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = -PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = macOS NetP VPN SysEx - Release (XPC) -PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = macOS NetP VPN SysEx - Review (XPC) +PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match Direct com.duckduckgo.macos.vpn.network-extension macos +PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match Direct com.duckduckgo.macos.vpn.network-extension.review macos SDKROOT = macosx SKIP_INSTALL = YES diff --git a/Configuration/Extensions/NetworkProtection/VPNProxyExtension.xcconfig b/Configuration/Extensions/NetworkProtection/VPNProxyExtension.xcconfig index b0826cb74c..f6690a3c16 100644 --- a/Configuration/Extensions/NetworkProtection/VPNProxyExtension.xcconfig +++ b/Configuration/Extensions/NetworkProtection/VPNProxyExtension.xcconfig @@ -41,7 +41,7 @@ PRODUCT_BUNDLE_IDENTIFIER[config=Debug][sdk=*] = $(PROXY_EXTENSION_BUNDLE_ID) PRODUCT_BUNDLE_IDENTIFIER[config=Release][sdk=*] = $(PROXY_EXTENSION_BUNDLE_ID) PRODUCT_BUNDLE_IDENTIFIER[config=Review][sdk=*] = $(PROXY_EXTENSION_BUNDLE_ID) -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = macOS VPN Proxy Extension App Store - CI +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.mobile.ios.vpn.agent.debug.proxy macos PROVISIONING_PROFILE_SPECIFIER[config=Release][sdk=macosx*] = match AppStore $(AGENT_BUNDLE_ID).proxy macos PROVISIONING_PROFILE_SPECIFIER[config=Review][sdk=macosx*] = match AppStore $(AGENT_BUNDLE_ID).proxy macos diff --git a/Configuration/Tests/IntegrationTests.xcconfig b/Configuration/Tests/IntegrationTests.xcconfig index a95d01de7a..a5f8f7cba5 100644 --- a/Configuration/Tests/IntegrationTests.xcconfig +++ b/Configuration/Tests/IntegrationTests.xcconfig @@ -24,7 +24,7 @@ FEATURE_FLAGS = FEEDBACK INFOPLIST_FILE = IntegrationTests/Info.plist PRODUCT_BUNDLE_IDENTIFIER = com.duckduckgo.Integration-Tests -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = MacOS Integration Tests CI +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.Integration-Tests macos SWIFT_OBJC_BRIDGING_HEADER = $(SRCROOT)/IntegrationTests/Common/IntegrationTestsBridging.h GCC_PREPROCESSOR_DEFINITIONS[arch=*][sdk=*] = uint64_t="unsigned long long" _UINT64_T=1 $(inherited) diff --git a/Configuration/Tests/IntegrationTestsAppStore.xcconfig b/Configuration/Tests/IntegrationTestsAppStore.xcconfig index f392ac17cd..33776c4f60 100644 --- a/Configuration/Tests/IntegrationTestsAppStore.xcconfig +++ b/Configuration/Tests/IntegrationTestsAppStore.xcconfig @@ -17,6 +17,6 @@ #include "../AppStore.xcconfig" PRODUCT_BUNDLE_IDENTIFIER = com.duckduckgo.mobile.ios.Integration-Tests -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = MacOS Integration Tests App Store CI +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.mobile.ios.Integration-Tests macos TEST_HOST=$(BUILT_PRODUCTS_DIR)/DuckDuckGo App Store.app/Contents/MacOS/DuckDuckGo App Store diff --git a/Configuration/Tests/UnitTests.xcconfig b/Configuration/Tests/UnitTests.xcconfig index a1abc70496..c67d7ec90c 100644 --- a/Configuration/Tests/UnitTests.xcconfig +++ b/Configuration/Tests/UnitTests.xcconfig @@ -24,7 +24,7 @@ FEATURE_FLAGS = FEEDBACK INFOPLIST_FILE = UnitTests/Info.plist PRODUCT_BUNDLE_IDENTIFIER = com.duckduckgo.macos.browser.DuckDuckGoTests -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = MacOS Unit Tests CI +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.macos.browser.DuckDuckGoTests macos SWIFT_OBJC_BRIDGING_HEADER = $(SRCROOT)/UnitTests/Common/TestsBridging.h GCC_PREPROCESSOR_DEFINITIONS[arch=*][sdk=*] = uint64_t="unsigned long long" _UINT64_T=1 $(inherited) diff --git a/Configuration/Tests/UnitTestsAppStore.xcconfig b/Configuration/Tests/UnitTestsAppStore.xcconfig index 98e6e5734b..a3a2c23f9e 100644 --- a/Configuration/Tests/UnitTestsAppStore.xcconfig +++ b/Configuration/Tests/UnitTestsAppStore.xcconfig @@ -19,6 +19,6 @@ FEATURE_FLAGS = FEEDBACK PRODUCT_BUNDLE_IDENTIFIER = com.duckduckgo.mobile.ios.DuckDuckGoTests -PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = MacOS Unit Tests App Store CI +PROVISIONING_PROFILE_SPECIFIER[config=CI][sdk=macosx*] = match Direct com.duckduckgo.mobile.ios.DuckDuckGoTests macos TEST_HOST=$(BUILT_PRODUCTS_DIR)/DuckDuckGo App Store.app/Contents/MacOS/DuckDuckGo App Store diff --git a/LocalPackages/Screenshot 2024-03-14 alle 13.19.29.png b/LocalPackages/Screenshot 2024-03-14 alle 13.19.29.png deleted file mode 100644 index 7ddccad49d7ffbd57f21a9fcb0ca98e55e568383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85134 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�#UlUF}#1_Sh~$u|6`7S2=DHXPD~kn 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 com.duckduckgo.macos.browser - MacOS Browser + match Direct com.duckduckgo.macos.browser macos com.duckduckgo.macos.browser.review - MacOS Browser Product Review + match Direct com.duckduckgo.macos.browser.review macos com.duckduckgo.macos.browser.dbp macOS DBP Profile com.duckduckgo.mobile.ios @@ -19,21 +19,21 @@ com.duckduckgo.mobile.ios.review Sandbox MacOS Browser Product Review com.duckduckgo.macos.DBP.backgroundAgent - macOS DBP Agent - Release + match Direct com.duckduckgo.macos.DBP.backgroundAgent macos com.duckduckgo.macos.DBP.backgroundAgent.review - macOS DBP Agent - Review + match Direct com.duckduckgo.macos.DBP.backgroundAgent.review macos com.duckduckgo.macos.vpn.network-extension - macOS NetP VPN SysEx - Release (XPC) + match Direct com.duckduckgo.macos.vpn.network-extension macos com.duckduckgo.macos.vpn.network-extension.review - macOS NetP VPN SysEx - Review (XPC) + match Direct com.duckduckgo.macos.vpn.network-extension.review macos com.duckduckgo.macos.vpn - macOS NetP VPN App - Release (XPC) + match Direct com.duckduckgo.macos.vpn macos com.duckduckgo.macos.vpn.review - macOS NetP VPN App - Review (XPC) + match Direct com.duckduckgo.macos.vpn.review macos HKE973VLUW.com.duckduckgo.macos.browser.network-protection.notifications - Mac Browser NetP Developer ID Not. (Distribution) + match Direct HKE973VLUW.com.duckduckgo.macos.browser.network-protection.notifications macos HKE973VLUW.com.duckduckgo.macos.browser.network-protection.notifications.review - MacOS Browser NetP Notifications Product Review + match Direct HKE973VLUW.com.duckduckgo.macos.browser.network-protection.notifications.review macos signingCertificate