aboutsummaryrefslogtreecommitdiffstats
path: root/.github/workflows/cypress.yml
blob: 80c64ba63a7f38e3da98150acfce1007e82b37ec (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
name: Cypress

on:
  pull_request:
  push:
    branches:
      - main
      - master
      - stable*

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 }}

    steps:
      - name: Checkout app
        uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2

      - name: Check composer.json
        id: check_composer
        uses: andstor/file-existence-action@20b4d2e596410855db8f9ca21e96fbe18e12930b # v2
        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@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.2
        id: versions
        with:
          fallbackNode: "^14"
          fallbackNpm: "^7"

      - name: Set up node ${{ steps.versions.outputs.nodeVersion }}
        uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1
        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: 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
        containers: ["component", 1, 2]

    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@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1
        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@d69252d52b9a31bad4f418f05ba2bc83687a02eb # v5.8.3
        with:
          record: true
          parallel: true
          # cypress run type
          component: ${{ matrix.containers == 'component' }}
          group: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }}
          # cypress env
          ci-build-id: ${{ github.sha }}-${{ github.run_number }}
          tag: ${{ 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 }}

      - name: Upload snapshots
        uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
        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@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
        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@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
        if: failure() && matrix.containers != 'component'
        with:
          name: nc_data_${{ matrix.containers }}
          path: data.tar

  summary:
    runs-on: ubuntu-latest
    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