aboutsummaryrefslogtreecommitdiffstats
path: root/.github/workflows/phpunit-mysql-sharding.yml
blob: 40727b385c425421932df67dc692cdbf2deba1ac (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
172
173
174
175
176
177
178
179
180
181
182
183
184
# 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: 2022-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: MIT

name: PHPUnit sharding

on:
  pull_request:
  schedule:
    - cron: "5 2 * * *"

permissions:
  contents: read

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

jobs:
  changes:
    runs-on: ubuntu-latest-low

    outputs:
      src: ${{ steps.changes.outputs.src }}

    steps:
      - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
        id: changes
        continue-on-error: true
        with:
          filters: |
            src:
              - '.github/workflows/**'
              - '3rdparty/**'
              - '**/appinfo/**'
              - '**/lib/**'
              - '**/templates/**'
              - '**/tests/**'
              - 'vendor/**'
              - 'vendor-bin/**'
              - '.php-cs-fixer.dist.php'
              - 'composer.json'
              - 'composer.lock'
              - '**.php'

  phpunit-mysql:
    runs-on: ubuntu-latest

    needs: changes
    if: needs.changes.outputs.src != 'false'

    strategy:
      matrix:
        php-versions: ['8.1']
        mysql-versions: ['8.4']

    name: Sharding - MySQL ${{ matrix.mysql-versions }} (PHP ${{ matrix.php-versions }}) - database tests

    services:
      cache:
        image: ghcr.io/nextcloud/continuous-integration-redis:latest
        ports:
          - 6379:6379/tcp
        options: --health-cmd="redis-cli ping" --health-interval=10s --health-timeout=5s --health-retries=3

      mysql:
        image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
        ports:
          - 4444:3306/tcp
        env:
          MYSQL_ROOT_PASSWORD: rootpassword
          MYSQL_USER: oc_autotest
          MYSQL_PASSWORD: nextcloud
          MYSQL_DATABASE: oc_autotest
        options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
      shard1:
        image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
        ports:
          - 5001:3306/tcp
        env:
          MYSQL_ROOT_PASSWORD: rootpassword
          MYSQL_USER: oc_autotest
          MYSQL_PASSWORD: nextcloud
          MYSQL_DATABASE: nextcloud
        options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
      shard2:
        image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
        ports:
          - 5002:3306/tcp
        env:
          MYSQL_ROOT_PASSWORD: rootpassword
          MYSQL_USER: oc_autotest
          MYSQL_PASSWORD: nextcloud
          MYSQL_DATABASE: nextcloud
        options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
      shard3:
        image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
        ports:
          - 5003:3306/tcp
        env:
          MYSQL_ROOT_PASSWORD: rootpassword
          MYSQL_USER: oc_autotest
          MYSQL_PASSWORD: nextcloud
          MYSQL_DATABASE: nextcloud
        options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
      shard4:
        image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
        ports:
          - 5004:3306/tcp
        env:
          MYSQL_ROOT_PASSWORD: rootpassword
          MYSQL_USER: oc_autotest
          MYSQL_PASSWORD: nextcloud
          MYSQL_DATABASE: nextcloud
        options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10

    steps:
      - name: Checkout server
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
        with:
          submodules: true

      - name: Set up php ${{ matrix.php-versions }}
        uses: shivammathur/setup-php@2e947f1f6932d141d076ca441d0e1e881775e95b #v2.31.0
        with:
          php-version: ${{ matrix.php-versions }}
          # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
          extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, redis, session, simplexml, xmlreader, xmlwriter, zip, zlib, mysql, pdo_mysql
          coverage: ${{ matrix.coverage && 'xdebug' || 'none' }}
          ini-file: development
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Set up dependencies
        run: composer i

      - name: Enable ONLY_FULL_GROUP_BY MySQL option
        run: |
          echo "SET GLOBAL sql_mode=(SELECT CONCAT(@@sql_mode,',ONLY_FULL_GROUP_BY'));" | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword
          echo "SELECT @@sql_mode;" | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword

      - name: Set up Nextcloud
        env:
          DB_PORT: 4444
          SHARDING: 1
        run: |
          mkdir data
          cp tests/redis.config.php config/
          cp tests/preseed-config.php config/config.php
          ./occ maintenance:install --verbose --database=mysql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
          php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0

      - name: PHPUnit
        run: composer run test:db ${{ matrix.coverage && ' -- --coverage-clover ./clover.db.xml' || '' }}

      - name: Upload db code coverage
        if: ${{ !cancelled() && matrix.coverage }}
        uses: codecov/codecov-action@v4.1.1
        with:
          files: ./clover.db.xml
          flags: phpunit-mysql

      - name: Print logs
        if: always()
        run: |
          cat data/nextcloud.log

  summary:
    permissions:
      contents: none
    runs-on: ubuntu-latest-low
    needs: [changes, phpunit-mysql]

    if: always()

    name: phpunit-mysql-summary

    steps:
      - name: Summary status
        run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-mysql.result != 'success' }}; then exit 1; fi