name: Execute nightly tests run-name: Run tests on ${{ inputs.environment }}${{github.event.client_payload.version}} ${{github.event.client_payload.project}} on: workflow_dispatch: inputs: tags: required: true description: 'Select tests to run' default: '@allEnv' type: choice options: - '@allEnv' - '@critical' - '@stable' - '@oldRelease' environment: required: true description: 'Environment to run tests against' default: 'https://automation-dashboard.staging.saleor.cloud/' type: choice options: - https://automation-dashboard.staging.saleor.cloud/ - https://master.staging.saleor.cloud/ - https://latest.staging.saleor.cloud/ - https://qa.staging.saleor.cloud/ - Other otherEnvironment: required: false description: 'Type env if "Other" option is selected' type: string default: 'https://vXX.staging.saleor.cloud/' browser: required: true description: 'Browser' default: 'chrome' type: choice options: - chrome - firefox - all schedule: - cron: '00 2 * * 1-5' repository_dispatch: types: [automation-tests-event] jobs: revert-automation-env-to-snap: if: ${{ github.event.inputs.environment == null && github.event_name != 'repository_dispatch' }} runs-on: ubuntu-latest timeout-minutes: 30 steps: - name: Setup Node uses: actions/setup-node@v3 with: # use explicit version as this job does not checkout code node-version: '18' - name: Install saleor cli id: install-saleor-cli run: npm i -g @saleor/cli - name: Cache node modules uses: actions/cache@v2 env: cache-name: cache-node-modules-cli with: path: ~/.npm key: ${{ runner.os }}-qa-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-qa-${{ env.cache-name }}- ${{ runner.os }}-qa- ${{ runner.os }}- - name: Write config file id: write-config-file env: ACCESS_TOKEN: ${{ secrets.CLOUD_ACCESS_TOKEN }} run: echo '{"token":"Token ${{ secrets.CLOUD_ACCESS_TOKEN }}","telemetry":"false","organization_slug":"qa","organization_name":"QA","environment_id":"lHECN87U"}' > ~/.config/saleor.json - name: revert snapshot env: CI: true SALEOR_CLI_ENV: staging run: npx saleor backup restore 3R5IPRr6 --skip-webhooks-update - name: Notify Slack if: ${{ failure() }} uses: rtCamp/action-slack-notify@v2 env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_SNAP_RESTORE }} SLACK_USERNAME: RevertSnapshotBot SLACK_COLOR: ${{ job.status }} SLACK_TITLE: "Revert to snapshot job failed" SLACK_MESSAGE: "https://github.com/saleor/saleor-dashboard/actions/workflows/tests-nightly.yml" MSG_MINIMAL: true run-tests-in-parallel: needs: ['revert-automation-env-to-snap'] if: ${{ always() && github.event_name != 'repository_dispatch' }} #Wait for revert-automation-env-to-snap, bot run always, even if skipped runs-on: ubuntu-latest env: GREP_TAGS: ${{ github.event.inputs.tags || '@allEnv'}} outputs: status: ${{ steps.cypress.outcome }} dashboard_url: ${{ steps.cypress.outputs.dashboardUrl }} environment: ${{ steps.get-env-uri.outputs.ENV_URI }} strategy: fail-fast: false matrix: # run copies of the current job in parallel containers: [1, 2, 3, 4, 5, 6, 7, 8, 9] steps: - name: Checkout uses: actions/checkout@v3 - name: Setup Node uses: actions/setup-node@v3 with: node-version-file: ".nvmrc" - name: Check if other env id: get-typed-env-uri if: ${{ github.event.inputs.environment == 'Other' }} run: | echo "ENV_URI=${{github.event.inputs.otherEnvironment}}" >> $GITHUB_OUTPUT - name: Get env id: get-env-uri env: DEFAULT_ENV_URI: 'https://automation-dashboard.staging.saleor.cloud/' TYPED_ENV_URI: '' run: | echo "ENV_URI=${{ steps.get-typed-env-uri.outputs.ENV_URI || github.event.inputs.environment || env.DEFAULT_ENV_URI }}" >> $GITHUB_OUTPUT - name: Setup Node uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' - name: Get browsers id: get-browsers uses: actions/github-script@v6 env: browser: ${{github.event.inputs.browser}} event_name: ${{github.event_name}} with: result-encoding: string script: | const { browser } = process.env const { event_name } = process.env switch (event_name) { case 'workflow_dispatch': return browser case 'schedule': return 'chrome' default: return 'chrome' } - name: Cypress install id: cypress-install if: ${{ github.event.inputs.tests != 'Critical' && github.event_name != 'repository_dispatch'}} uses: cypress-io/github-action@v5 with: runTests: false - name: Cypress run chrome id: cypress-chrome continue-on-error: true if: ${{ github.event.inputs.tests != 'Critical' && github.event_name != 'repository_dispatch' && contains(fromJSON('["chrome", "all"]'), steps.get-browsers.outputs.result)}} uses: cypress-io/github-action@v5 env: API_URI: ${{ steps.get-env-uri.outputs.ENV_URI }}graphql/ APP_MOUNT_URI: ${{ secrets.APP_MOUNT_URI }} CYPRESS_baseUrl: ${{ steps.get-env-uri.outputs.ENV_URI }}dashboard/ CYPRESS_USER_NAME: ${{ secrets.CYPRESS_USER_NAME }} CYPRESS_SECOND_USER_NAME: ${{ secrets.CYPRESS_SECOND_USER_NAME }} CYPRESS_USER_PASSWORD: ${{ secrets.CYPRESS_USER_PASSWORD }} CYPRESS_PERMISSIONS_USERS_PASSWORD: ${{ secrets.CYPRESS_PERMISSIONS_USERS_PASSWORD }} CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CYPRESS_MAILPITURL: ${{ secrets.CYPRESS_MAILPITURL }} COMMIT_INFO_MESSAGE: All tests triggered via ${{ github.event_name}} on ${{ steps.get-env-uri.outputs.ENV_URI }} CYPRESS_grepTags: ${{ env.GREP_TAGS }} STRIPE_SECRET_KEY: ${{ secrets.STRIPE_SECRET_KEY }} STRIPE_PUBLIC_KEY: ${{ secrets.STRIPE_PUBLIC_KEY }} with: install: false parallel: true group: 'UI - Chrome' record: true tag: ${{ steps.get-env-uri.outputs.ENV_URI }},${{ env.GREP_TAGS }} browser: chrome - name: Cypress run firefox id: cypress-firefox continue-on-error: true if: ${{ github.event.inputs.tests != 'Critical' && github.event_name != 'repository_dispatch' && contains(fromJSON('["firefox", "all"]'), steps.get-browsers.outputs.result)}} uses: cypress-io/github-action@v5 env: API_URI: ${{ steps.get-env-uri.outputs.ENV_URI }}graphql/ APP_MOUNT_URI: ${{ secrets.APP_MOUNT_URI }} CYPRESS_baseUrl: ${{ steps.get-env-uri.outputs.ENV_URI }}dashboard/ CYPRESS_USER_NAME: ${{ secrets.CYPRESS_USER_NAME }} CYPRESS_SECOND_USER_NAME: ${{ secrets.CYPRESS_SECOND_USER_NAME }} CYPRESS_USER_PASSWORD: ${{ secrets.CYPRESS_USER_PASSWORD }} CYPRESS_PERMISSIONS_USERS_PASSWORD: ${{ secrets.CYPRESS_PERMISSIONS_USERS_PASSWORD }} CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CYPRESS_MAILPITURL: ${{ secrets.CYPRESS_MAILPITURL }} COMMIT_INFO_MESSAGE: All tests triggered via ${{ github.event_name}} on ${{ steps.get-env-uri.outputs.ENV_URI }} CYPRESS_grepTags: ${{ env.GREP_TAGS }} STRIPE_SECRET_KEY: ${{ secrets.STRIPE_SECRET_KEY }} STRIPE_PUBLIC_KEY: ${{ secrets.STRIPE_PUBLIC_KEY }} with: install: false parallel: true group: 'UI - Firefox' record: true tag: ${{ steps.get-env-uri.outputs.ENV_URI }},${{ env.GREP_TAGS }} browser: firefox get-environment-variables: if: ${{ github.event_name == 'repository_dispatch' && (github.event.client_payload.environment == 'SANDBOX' || github.event.client_payload.environment == 'STAGING')}} runs-on: ubuntu-latest timeout-minutes: 30 outputs: url: ${{ steps.get-environment-variables.outputs.url }} is_old_version: ${{ steps.get-environment-variables.outputs.IS_OLD_VERSION }} branch: ${{ steps.get-environment-variables.outputs.branch }} env: REPO_TOKEN: ${{ secrets.GITHUB_TOKEN }} TOKEN: ${{ secrets.CLOUD_ACCESS_TOKEN }} VERSION: ${{github.event.client_payload.version}} PROJECT: ${{github.event.client_payload.project}} steps: - name: Checkout uses: actions/checkout@v3 - name: Setup Node uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' - name: Install dependencies run: | cd .github/workflows npm ci - name: get environment variables id: get-environment-variables run: | node .github/workflows/cypressTestsHelpers/getEnvironmentVariables.js \ --version $VERSION \ --token "$TOKEN" \ --repo_token "$REPO_TOKEN" \ --project "$PROJECT" run-tests-on-release: if: ${{ github.event_name == 'repository_dispatch' && (github.event.client_payload.environment == 'SANDBOX' || github.event.client_payload.environment == 'STAGING')}} needs: get-environment-variables runs-on: ubuntu-latest env: NODE_OPTIONS: "--max_old_space_size=4096" outputs: status: ${{ steps.cypress.outcome }} dashboard_url: ${{ steps.cypress.outputs.dashboardUrl }} container: cypress/browsers:node18.12.0-chrome106-ff106 strategy: fail-fast: false matrix: # run copies of the current job in parallel containers: [1, 2, 3, 4, 5, 6, 7, 8, 9] steps: - name: Checkout uses: actions/checkout@v3 with: ref: ${{ needs.get-environment-variables.outputs.branch }} - name: Set tag for tests id: set-tag-for-tests uses: actions/github-script@v6 env: is_old_version: ${{ needs.get-environment-variables.outputs.is_old_version }} with: result-encoding: string script: | const { is_old_version } = process.env if(is_old_version == "true"){ return "@oldRelease" }else{ return "@stable" } - name: Cypress install id: cypress-install continue-on-error: true uses: cypress-io/github-action@v5 with: runTests: false - name: Cypress run - automatically id: cypress continue-on-error: true uses: cypress-io/github-action@v5 env: API_URI: ${{ needs.get-environment-variables.outputs.url }}graphql/ APP_MOUNT_URI: ${{ secrets.APP_MOUNT_URI }} CYPRESS_baseUrl: ${{ needs.get-environment-variables.outputs.url }}dashboard/ CYPRESS_USER_NAME: ${{ secrets.CYPRESS_USER_NAME }} CYPRESS_SECOND_USER_NAME: ${{ secrets.CYPRESS_SECOND_USER_NAME }} CYPRESS_USER_PASSWORD: ${{ secrets.CYPRESS_USER_PASSWORD }} CYPRESS_PERMISSIONS_USERS_PASSWORD: ${{ secrets.CYPRESS_PERMISSIONS_USERS_PASSWORD }} STRIPE_SECRET_KEY: ${{ secrets.STRIPE_SECRET_KEY }} STRIPE_PUBLIC_KEY: ${{ secrets.STRIPE_PUBLIC_KEY }} CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} CYPRESS_MAILPITURL: ${{ secrets.CYPRESS_MAILPITURL }} COMMIT_INFO_MESSAGE: Triggered via release - ${{github.event.client_payload.project}} ${{github.event.client_payload.version}}, ${{github.event.client_payload.pullRequestUrl}} CYPRESS_grepTags: ${{steps.set-tag-for-tests.outputs.result}} with: install: false parallel: true group: 'UI - Chrome' record: true tag: ${{github.event.client_payload.project}}, ${{github.event.client_payload.environment}}, ${{ needs.get-environment-variables.outputs.url }} add-review-and-merge-patch: if: ${{ always() && (needs.run-tests-on-release.outputs.status == 'success' || needs.run-tests-on-release.outputs.status == 'failure') }} runs-on: ubuntu-latest needs: [run-tests-on-release] steps: - name: Checkout uses: actions/checkout@v3 - name: Setup Node uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' - name: Install dependencies run: | cd .github/workflows npm ci - name: Add review and merge if patch DASHBOARD env: tests_status: ${{ needs.run-tests-on-release.outputs.status }} version: ${{ github.event.client_payload.version }} pull_request_number: ${{ github.event.client_payload.pullRequestNumber }} dashboard_url: ${{ needs.run-tests-on-release.outputs.dashboard_url }} auto_release: ${{ (github.event.client_payload.autoRelease && '--auto_release') || '' }} run: | export GITHUB_TOKEN=$( \ curl --request GET --url ${{ secrets.VAULT_URL}} --header "Authorization: JWT ${{ secrets.VAULT_JWT }}" | jq -r .token \ ) node .github/workflows/cypressTestsHelpers/approveAndMergeReleasePR.js \ --version $version \ --pull_request_number $pull_request_number \ --dashboard_url "$dashboard_url" \ $auto_release send-slack-notification: if: ${{ failure() && github.event_name == 'repository_dispatch'}} runs-on: ubuntu-latest needs: [get-environment-variables, run-tests-on-release, add-review-and-merge-patch] steps: - name: Checkout uses: actions/checkout@v3 - name: Notify Slack env: JOB_DEPLOYMENT_KIND: staging JOB_STATUS: 'Failure' SLACK_WEBHOOK_URL: ${{ secrets.SLACK_RELEASES_WEBHOOK_URL }} JOB_TITLE: "Test release workflow - ${{github.event.client_payload.project}} ${{github.event.client_payload.version}}" JOB_KIND: "release tests" run: | python3 ./.github/workflows/notify/notify-slack.py send-slack-notification-scheduled-and-manually: if: ${{always() && github.event_name != 'repository_dispatch'}} defaults: run: shell: bash working-directory: .github/workflows runs-on: ubuntu-latest needs: [run-tests-in-parallel] steps: - name: Checkout uses: actions/checkout@v3 - name: Setup Node uses: actions/setup-node@v3 with: node-version-file: '.nvmrc' - name: Install dependencies run: | npm ci - name: Get tests results id: get-tests-results env: tests_status: ${{ needs.run-tests-in-parallel.outputs.status }} dashboard_url: ${{ needs.run-tests-in-parallel.outputs.dashboard_url }} run: | node cypressTestsHelpers/getFailedTests.js \ --dashboard_url "$dashboard_url" - name: Notify Slack if: steps.get-tests-results.outputs.testStatus == 'true' env: JOB_DEPLOYMENT_KIND: ${{ needs.run-tests-in-parallel.outputs.environment }} JOB_STATUS: 'Failure' SLACK_WEBHOOK_URL: ${{ secrets.SLACK_SALEOR_QA_WEBHOOK_URL }} JOB_TITLE: "A lot of tests failed, something is probably broken - ${{ needs.run-tests-in-parallel.outputs.dashboard_url }}" JOB_KIND: "Tests" run: | python3 .github/workflows/notify/notify-slack.py