123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- name: Wagtail CI
- on:
- push:
- paths-ignore:
- - 'docs/**'
- pull_request:
- paths-ignore:
- - 'docs/**'
- concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
- # Our test suite should cover:
- # - all supported databases against current Python and Django (including psycopg v2 and v3)
- # - at least one test run for each older supported version of Python and Django
- # - at least one test run for each supported Elasticsearch version
- # - a test run against Django's git main and active stable branch (allowing failures)
- # - test runs with USE_EMAIL_USER_MODEL=yes, DISABLE_TIMEZONE=yes and WAGTAIL_CHECK_TEMPLATE_NUMBER_FORMAT=1
- # Current configuration:
- # - django 4.2, python 3.9, postgres:12, psycopg 2, parallel
- # - django 4.2, python 3.10, mysql:8.0
- # - django 5.0, python 3.11, sqlite, WAGTAIL_CHECK_TEMPLATE_NUMBER_FORMAT=1
- # - django 5.1, python 3.12, mysql:8.1, parallel
- # - django 5.1, python 3.12, sqlite, parallel, USE_EMAIL_USER_MODEL=yes
- # - django 5.1, python 3.12, postgres:15, psycopg 3, parallel, DISABLE_TIMEZONE=yes
- # - django stable/5.1.x, python 3.11, postgres:15, psycopg 3 (allow failures)
- # - django main, python 3.12, postgres:latest, psycopg 3, parallel (allow failures)
- # - elasticsearch 7, django 4.2, python 3.9, postgres:latest, psycopg 2
- # - opensearch 2, django 5.0, python 3.10, sqlite
- # - elasticsearch 8, django 5.1, python 3.12, sqlite, USE_EMAIL_USER_MODEL=yes
- # Some tests are run in parallel by passing --parallel to runtests.py.
- # When running tests in parallel, some errors cannot be pickled and result in
- # non-helpful tracebacks (see https://code.djangoproject.com/ticket/29023).
- # Thus, we keep one test run without --parallel for each supported database.
- # ElasticSearch tests are not run in parallel as the test suite is not thread-safe.
- permissions:
- contents: read # to fetch code (actions/checkout)
- jobs:
- test-sqlite:
- runs-on: ubuntu-latest
- strategy:
- matrix:
- include:
- - python: '3.11'
- django: 'Django>=5.0,<5.1'
- check_template_number_format: '1'
- - python: '3.12'
- django: 'Django>=5.1,<5.2'
- emailuser: emailuser
- parallel: '--parallel'
- steps:
- - uses: actions/checkout@v4
- - name: Set up Python ${{ matrix.python }}
- uses: actions/setup-python@v5
- with:
- python-version: ${{ matrix.python }}
- cache: 'pip'
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install -e '.[testing]' --config-settings editable_mode=strict
- pip install "${{ matrix.django }}"
- - name: Test
- run: |
- WAGTAIL_FAIL_ON_VERSIONED_STATIC=1 DJANGO_SETTINGS_MODULE=wagtail.test.settings django-admin check
- coverage run --parallel-mode --source wagtail runtests.py ${{ matrix.parallel }}
- env:
- DATABASE_ENGINE: django.db.backends.sqlite3
- USE_EMAIL_USER_MODEL: ${{ matrix.emailuser }}
- WAGTAIL_CHECK_TEMPLATE_NUMBER_FORMAT: ${{ matrix.check_template_number_format }}
- - name: Upload coverage data
- uses: actions/upload-artifact@v4
- with:
- name: coverage-data-${{ github.job }}-${{ strategy.job-index }}
- path: .coverage.*
- include-hidden-files: true
- test-postgres:
- runs-on: ubuntu-latest
- continue-on-error: ${{ matrix.experimental }}
- strategy:
- matrix:
- include:
- - python: '3.9'
- django: 'Django>=4.2,<4.3'
- psycopg: 'psycopg2>=2.6'
- experimental: false
- parallel: '--parallel'
- - python: '3.12'
- django: 'Django>=5.0,<5.1'
- psycopg: 'psycopg>=3.1.8'
- postgres: 'postgres:15'
- notz: notz
- experimental: false
- parallel: '--parallel'
- - python: '3.11'
- django: 'git+https://github.com/django/django.git@stable/5.1.x#egg=Django'
- psycopg: 'psycopg>=3.1.8'
- postgres: 'postgres:15'
- experimental: true
- - python: '3.12'
- django: 'git+https://github.com/django/django.git@main#egg=Django'
- psycopg: 'psycopg>=3.1.8'
- experimental: true
- postgres: 'postgres:latest'
- parallel: '--parallel'
- services:
- postgres:
- image: ${{ matrix.postgres || 'postgres:12' }}
- env:
- POSTGRES_PASSWORD: postgres
- ports:
- - 5432:5432
- options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
- steps:
- - uses: actions/checkout@v4
- - name: Set up Python ${{ matrix.python }}
- uses: actions/setup-python@v5
- with:
- python-version: ${{ matrix.python }}
- cache: 'pip'
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install "${{ matrix.psycopg }}"
- pip install -e '.[testing]' --config-settings editable_mode=strict
- pip install "${{ matrix.django }}"
- ${{ matrix.install_extras }}
- - name: Test
- run: |
- WAGTAIL_FAIL_ON_VERSIONED_STATIC=1 DJANGO_SETTINGS_MODULE=wagtail.test.settings django-admin check
- coverage run --parallel-mode --source wagtail runtests.py ${{ matrix.parallel }}
- env:
- DATABASE_ENGINE: django.db.backends.postgresql
- DATABASE_HOST: localhost
- DATABASE_USER: postgres
- DATABASE_PASSWORD: postgres
- USE_EMAIL_USER_MODEL: ${{ matrix.emailuser }}
- DISABLE_TIMEZONE: ${{ matrix.notz }}
- - name: Upload coverage data
- uses: actions/upload-artifact@v4
- with:
- name: coverage-data-${{ github.job }}-${{ strategy.job-index }}
- path: .coverage.*
- include-hidden-files: true
- test-mysql:
- runs-on: ubuntu-latest
- continue-on-error: ${{ matrix.experimental }}
- strategy:
- matrix:
- include:
- - python: '3.10'
- django: 'Django>=4.2,<4.3'
- experimental: false
- - python: '3.12'
- django: 'Django>=5.1,<5.2'
- experimental: false
- parallel: '--parallel'
- mysql: 'mysql:8.1'
- services:
- mysql:
- image: ${{ matrix.mysql || 'mysql:8.0' }}
- env:
- MYSQL_ALLOW_EMPTY_PASSWORD: yes
- MYSQL_DATABASE: wagtail
- ports:
- - 3306:3306
- options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 --cap-add=sys_nice
- steps:
- - uses: actions/checkout@v4
- - name: Set up Python ${{ matrix.python }}
- uses: actions/setup-python@v5
- with:
- python-version: ${{ matrix.python }}
- cache: 'pip'
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install "mysqlclient>=1.4,<2"
- pip install -e '.[testing]' --config-settings editable_mode=strict
- pip install "${{ matrix.django }}"
- - name: Test
- run: |
- WAGTAIL_FAIL_ON_VERSIONED_STATIC=1 DJANGO_SETTINGS_MODULE=wagtail.test.settings django-admin check
- coverage run --parallel-mode --source wagtail runtests.py ${{ matrix.parallel }}
- env:
- DATABASE_ENGINE: django.db.backends.mysql
- DATABASE_HOST: '127.0.0.1'
- DATABASE_USER: root
- - name: Upload coverage data
- uses: actions/upload-artifact@v4
- with:
- name: coverage-data-${{ github.job }}-${{ strategy.job-index }}
- path: .coverage.*
- include-hidden-files: true
- test-sqlite-elasticsearch8:
- runs-on: ubuntu-latest
- strategy:
- matrix:
- include:
- - python: '3.12'
- django: 'Django>=5.1,<5.2'
- emailuser: emailuser
- steps:
- - name: Configure sysctl limits
- run: |
- sudo swapoff -a
- sudo sysctl -w vm.swappiness=1
- sudo sysctl -w fs.file-max=262144
- sudo sysctl -w vm.max_map_count=262144
- - uses: getong/elasticsearch-action@v1.3
- with:
- elasticsearch version: 8.8.0
- host port: 9200
- container port: 9200
- host node port: 9300
- node port: 9300
- discovery type: 'single-node'
- - uses: actions/checkout@v4
- - name: Set up Python ${{ matrix.python }}
- uses: actions/setup-python@v5
- with:
- python-version: ${{ matrix.python }}
- cache: 'pip'
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install -e '.[testing]' --config-settings editable_mode=strict
- pip install "${{ matrix.django }}"
- pip install "elasticsearch>=8,<9"
- pip install certifi
- - name: Test
- run: |
- coverage run --parallel-mode --source wagtail runtests.py wagtail.search wagtail.documents wagtail.images --elasticsearch8
- env:
- DATABASE_ENGINE: django.db.backends.sqlite3
- USE_EMAIL_USER_MODEL: ${{ matrix.emailuser }}
- - name: Upload coverage data
- uses: actions/upload-artifact@v4
- with:
- name: coverage-data-${{ github.job }}-${{ strategy.job-index }}
- path: .coverage.*
- include-hidden-files: true
- test-postgres-elasticsearch7:
- runs-on: ubuntu-latest
- continue-on-error: ${{ matrix.experimental }}
- strategy:
- matrix:
- include:
- - python: '3.9'
- django: 'Django>=4.2,<4.3'
- experimental: false
- services:
- postgres:
- image: postgres:latest
- env:
- POSTGRES_PASSWORD: postgres
- ports:
- - 5432:5432
- options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
- steps:
- - name: Configure sysctl limits
- run: |
- sudo swapoff -a
- sudo sysctl -w vm.swappiness=1
- sudo sysctl -w fs.file-max=262144
- sudo sysctl -w vm.max_map_count=262144
- - uses: elastic/elastic-github-actions/elasticsearch@master
- with:
- stack-version: 7.6.1
- - uses: actions/checkout@v4
- - name: Set up Python ${{ matrix.python }}
- uses: actions/setup-python@v5
- with:
- python-version: ${{ matrix.python }}
- cache: 'pip'
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install "psycopg2>=2.6"
- pip install -e '.[testing]' --config-settings editable_mode=strict
- pip install "${{ matrix.django }}"
- pip install "elasticsearch>=7,<8"
- pip install certifi
- - name: Test
- run: |
- coverage run --parallel-mode --source wagtail runtests.py wagtail.search wagtail.documents wagtail.images --elasticsearch7
- env:
- DATABASE_ENGINE: django.db.backends.postgresql
- DATABASE_HOST: localhost
- DATABASE_USER: postgres
- DATABASE_PASSWORD: postgres
- USE_EMAIL_USER_MODEL: ${{ matrix.emailuser }}
- - name: Upload coverage data
- uses: actions/upload-artifact@v4
- with:
- name: coverage-data-${{ github.job }}-${{ strategy.job-index }}
- path: .coverage.*
- include-hidden-files: true
- test-sqlite-opensearch2:
- runs-on: ubuntu-latest
- continue-on-error: ${{ matrix.experimental }}
- strategy:
- matrix:
- include:
- - python: '3.10'
- django: 'Django>=5.0,<5.1'
- experimental: false
- steps:
- - name: Configure sysctl limits
- run: |
- sudo swapoff -a
- sudo sysctl -w vm.swappiness=1
- sudo sysctl -w fs.file-max=262144
- sudo sysctl -w vm.max_map_count=262144
- - uses: ankane/setup-opensearch@v1
- with:
- opensearch-version: 2
- - uses: actions/checkout@v4
- - name: Set up Python ${{ matrix.python }}
- uses: actions/setup-python@v5
- with:
- python-version: ${{ matrix.python }}
- cache: 'pip'
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install -e '.[testing]' --config-settings editable_mode=strict
- pip install "${{ matrix.django }}"
- pip install "elasticsearch==7.13.4"
- pip install certifi
- - name: Test
- run: |
- coverage run --parallel-mode --source wagtail runtests.py wagtail.search wagtail.documents wagtail.images --elasticsearch7
- env:
- DATABASE_ENGINE: django.db.backends.sqlite3
- USE_EMAIL_USER_MODEL: ${{ matrix.emailuser }}
- - name: Upload coverage data
- uses: actions/upload-artifact@v4
- with:
- name: coverage-data-${{ github.job }}-${{ strategy.job-index }}
- path: .coverage.*
- include-hidden-files: true
- coverage:
- needs:
- - test-sqlite
- - test-postgres
- - test-mysql
- - test-sqlite-elasticsearch8
- - test-postgres-elasticsearch7
- - test-sqlite-opensearch2
- runs-on: ubuntu-latest
- steps:
- - name: Check out the repo
- uses: actions/checkout@v4
- - name: Set up Python
- uses: actions/setup-python@v5
- with:
- python-version: '3.10'
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install coverage
- - name: Download coverage data
- uses: actions/download-artifact@v4
- with:
- pattern: coverage-data-*
- merge-multiple: true
- - name: Combine coverage data
- run: |
- coverage combine
- - name: Generate coverage report
- run: |
- coverage report -m --skip-covered --skip-empty | sed 's/^/ /' >> $GITHUB_STEP_SUMMARY
- coverage html --skip-covered --skip-empty
- - name: Upload HTML report as artifact
- uses: actions/upload-artifact@v4
- with:
- name: coverage-report
- path: coverage_html_report
- include-hidden-files: true
- - name: Upload coverage to Codecov
- uses: codecov/codecov-action@v3
- with:
- flags: backend
- token: ${{ secrets.CODECOV_TOKEN }}
|