diff --git a/.github/workflows/ui_tests.yml b/.github/workflows/ui_tests.yml new file mode 100644 index 0000000000..44bbfa8410 --- /dev/null +++ b/.github/workflows/ui_tests.yml @@ -0,0 +1,103 @@ +name: UI Tests + +on: + workflow_dispatch: + schedule: + - cron: '0 3 * * 1-5' # 3AM UTC offsetted to legacy to avoid action-junit-report@v4 bug + +jobs: + ui-tests: + name: UI tests + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + runner: [macos-13-xlarge, macos-14-xlarge] + + timeout-minutes: 120 + + steps: + - name: Check out the code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set cache key hash + run: | + has_only_tags=$(jq '[ .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: 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 }} + REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.REVIEW_PROVISION_PROFILE_BASE64 }} + RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.RELEASE_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 }} + NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_RELEASE_PROVISION_PROFILE_BASE64_V2 }} + NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_SYSEX_REVIEW_PROVISION_PROFILE_BASE64_V2 }} + NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_RELEASE_PROVISION_PROFILE_BASE64_V2 }} + NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64: ${{ secrets.NETP_AGENT_REVIEW_PROVISION_PROFILE_BASE64_V2 }} + 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 }} + + - name: Select Xcode + run: sudo xcode-select -s /Applications/Xcode_$(<.xcode-version).app/Contents/Developer + + - name: Build and run UI Testing + run: | + defaults write com.duckduckgo.macos.browser.review moveToApplicationsFolderAlertSuppress 1 + defaults write com.duckduckgo.macos.browser.review onboarding.finished -bool true + set -o pipefail && xcodebuild test \ + -scheme "UI Tests" \ + -configuration Review \ + -derivedDataPath DerivedData \ + -skipPackagePluginValidation \ + -skipMacroValidation \ + -test-iterations 2 \ + -retry-tests-on-failure \ + | tee xcodebuild.log \ + | xcbeautify --report junit --report-path . --junit-report-filename ui-tests.xml + + # - name: Create Asana task when workflow failed + # if: ${{ failure() }} && github.ref == 'refs/heads/main' + # run: | + # curl -s "https://app.asana.com/api/1.0/tasks" \ + # --header "Accept: application/json" \ + # --header "Authorization: Bearer ${{ secrets.ASANA_ACCESS_TOKEN }}" \ + # --header "Content-Type: application/json" \ + # --data ' { "data": { "name": "GH Workflow Failure - UI Tests", "projects": [ "${{ vars.MACOS_APP_DEVELOPMENT_ASANA_PROJECT_ID }}" ], "notes" : "The end to end workflow has failed. See https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" } }' + + - name: Publish tests report + uses: mikepenz/action-junit-report@v4 + if: always() + with: + check_name: "Test Report ${{ matrix.runner }}" + report_paths: ui-tests.xml + + - name: Upload logs when workflow failed + uses: actions/upload-artifact@v4 + if: failure() + with: + name: "BuildLogs ${{ matrix.runner }}" + path: | + xcodebuild.log + DerivedData/Logs/Test/*.xcresult + ~/Library/Logs/DiagnosticReports/* + retention-days: 7 \ No newline at end of file diff --git a/Configuration/Tests/TestsServer.xcconfig b/Configuration/Tests/TestsServer.xcconfig index b401906d9b..e8bc6f5e79 100644 --- a/Configuration/Tests/TestsServer.xcconfig +++ b/Configuration/Tests/TestsServer.xcconfig @@ -18,3 +18,5 @@ #include "../Common.xcconfig" PRODUCT_NAME = $(TARGET_NAME); +CODE_SIGNING_ALLOWED[config=Review][sdk=macosx*] = NO +CODE_SIGNING_ALLOWED[config=CI][sdk=macosx*] = NO \ No newline at end of file