0
0
mirror of https://github.com/wagtail/wagtail.git synced 2024-12-01 03:31:04 +01:00
wagtail/.github/workflows/test.yml
Sage Abdullah 170487e0c5 Update MySQL test matrix
MySQL 8.1 has been EOL since 2023-10-25. Use the next LTS 8.4
(2032-04-30). Add MYSQL_ROOT_PASSWORD to ensure the root password
is set.

Also use email user model and disable timezone on the 8.4 strategy to
ensure we test these configurations with MySQL as well.
2024-09-12 19:05:24 +01:00

417 lines
14 KiB
YAML

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.4, parallel, USE_EMAIL_USER_MODEL=yes, DISABLE_TIMEZONE=yes
# - 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.4'
emailuser: emailuser
notz: notz
services:
mysql:
image: ${{ matrix.mysql || 'mysql:8.0' }}
env:
MYSQL_ROOT_PASSWORD: root
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
DATABASE_PASSWORD: root
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-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 }}