aboutsummaryrefslogtreecommitdiffstats
path: root/.github/workflows/cypress.yml
blob: 2f4d557d19bbeda2de7b474b52d78e30ed6d3e66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
#
# SPDX-FileCopyrightText: 2023-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: MIT

name: Cypress

on: pull_request

concurrency:
  group: cypress-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

env:
  # Adjust APP_NAME if your repository name is different
  APP_NAME: ${{ github.event.repository.name }}

  # Server requires head_ref instead of base_ref, as we want to test the PR branch
  BRANCH: ${{ github.head_ref || github.ref_name }}

jobs:
  init:
    runs-on: ubuntu-latest
    outputs:
      nodeVersion: ${{ steps.versions.outputs.nodeVersion }}
      npmVersion: ${{ steps.versions.outputs.npmVersion }}

    env:
      PUPPETEER_SKIP_DOWNLOAD: true

    steps:
      - name: Checkout server
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
        with:
          # We need to checkout submodules for 3rdparty
          submodules: true

      - name: Check composer.json
        id: check_composer
        uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0
        with:
          files: "composer.json"

      - name: Install composer dependencies
        if: steps.check_composer.outputs.files_exists == 'true'
        run: composer install --no-dev

      - name: Read package.json node and npm engines version
        uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3
        id: versions
        with:
          fallbackNode: "^20"
          fallbackNpm: "^10"

      - name: Set up node ${{ steps.versions.outputs.nodeVersion }}
        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          node-version: ${{ steps.versions.outputs.nodeVersion }}

      - name: Set up npm ${{ steps.versions.outputs.npmVersion }}
        run: npm i -g 'npm@${{ steps.versions.outputs.npmVersion }}'

      - name: Install node dependencies & build app
        run: |
          npm ci
          TESTING=true npm run build --if-present

      - name: Show cypress version
        run: npm run cypress:version

      - name: Save context
        uses: buildjet/cache/save@e376f15c6ec6dc595375c78633174c7e5f92dc0e # v3
        with:
          key: cypress-context-${{ github.run_id }}
          path: ./

  cypress:
    runs-on: ubuntu-latest
    needs: init

    strategy:
      fail-fast: false
      matrix:
        # Run multiple copies of the current job in parallel
        # Please increase the number or runners as your tests suite grows (0 based index for e2e tests)
        containers: ["component", '0', '1', '2', '3', '4', '5']
        # Hack as strategy.job-total includes the component and GitHub does not allow math expressions
        # Always align this number with the total of e2e runners (max. index + 1)
        total-containers: [6]

    name: runner ${{ matrix.containers }}

    steps:
      - name: Restore context
        uses: buildjet/cache/restore@e376f15c6ec6dc595375c78633174c7e5f92dc0e # v3
        with:
          fail-on-cache-miss: true
          key: cypress-context-${{ github.run_id }}
          path: ./

      - name: Set up node ${{ needs.init.outputs.nodeVersion }}
        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          node-version: ${{ needs.init.outputs.nodeVersion }}

      - name: Set up npm ${{ needs.init.outputs.npmVersion }}
        run: npm i -g 'npm@${{ needs.init.outputs.npmVersion }}'

      - name: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }} cypress tests
        uses: cypress-io/github-action@8d3918616d8ac34caa2b49afc8b408b6a872a6f5 # v6.7.1
        with:
          component: ${{ matrix.containers == 'component' }}
          group: ${{ matrix.use-cypress-cloud && matrix.containers == 'component' && 'Run component' || matrix.use-cypress-cloud && 'Run E2E' || '' }}
          # cypress env
          ci-build-id: ${{ matrix.use-cypress-cloud && format('{0}-{1}', github.sha, github.run_number) || '' }}
          tag: ${{ matrix.use-cypress-cloud && github.event_name || '' }}
        env:
          # Needs to be prefixed with CYPRESS_
          CYPRESS_BRANCH: ${{ env.BRANCH }}
          # https://github.com/cypress-io/github-action/issues/124
          COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }}
          # Needed for some specific code workarounds
          TESTING: true
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
          SPLIT: ${{ matrix.total-containers }}
          SPLIT_INDEX: ${{ matrix.containers == 'component' && 0 || matrix.containers }}

      - name: Upload snapshots
        uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
        if: always()
        with:
          name: snapshots_${{ matrix.containers }}
          path: cypress/snapshots

      - name: Extract NC logs
        if: failure() && matrix.containers != 'component'
        run: docker logs nextcloud-cypress-tests-${{ env.APP_NAME }} > nextcloud.log

      - name: Upload NC logs
        uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
        if: failure() && matrix.containers != 'component'
        with:
          name: nc_logs_${{ matrix.containers }}
          path: nextcloud.log

      - name: Create data dir archive
        if: failure() && matrix.containers != 'component'
        run: docker exec nextcloud-cypress-tests-server tar -cvjf - data > data.tar

      - name: Upload data dir archive
        uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 # v4.3.3
        if: failure() && matrix.containers != 'component'
        with:
          name: nc_data_${{ matrix.containers }}
          path: data.tar

  summary:
    runs-on: ubuntu-latest-low
    needs: [init, cypress]

    if: always()

    name: cypress-summary

    steps:
      - name: Summary status
        run: if ${{ needs.init.result != 'success' || ( needs.cypress.result != 'success' && needs.cypress.result != 'skipped' ) }}; then exit 1; fi