forked from MirrorHub/synapse
4f6de33f41
Since github always scrolls to the bottom of any test output, let's put the failed tests last and hide any successful packages.
383 lines
12 KiB
YAML
383 lines
12 KiB
YAML
name: Tests
|
|
|
|
on:
|
|
push:
|
|
branches: ["develop", "release-*"]
|
|
pull_request:
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
check-sampleconfig:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- uses: actions/setup-python@v2
|
|
- run: pip install .
|
|
- run: scripts-dev/generate_sample_config.sh --check
|
|
- run: scripts-dev/config-lint.sh
|
|
|
|
check-schema-delta:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- uses: actions/setup-python@v2
|
|
- run: "pip install 'click==8.1.1' 'GitPython>=3.1.20'"
|
|
- run: scripts-dev/check_schema_delta.py --force-colors
|
|
|
|
lint:
|
|
uses: "matrix-org/backend-meta/.github/workflows/python-poetry-ci.yml@v1"
|
|
with:
|
|
typechecking-extras: "all"
|
|
|
|
lint-crlf:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Check line endings
|
|
run: scripts-dev/check_line_terminators.sh
|
|
|
|
lint-newsfile:
|
|
if: ${{ github.base_ref == 'develop' || contains(github.base_ref, 'release-') }}
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha }}
|
|
fetch-depth: 0
|
|
- uses: actions/setup-python@v2
|
|
- run: "pip install 'towncrier>=18.6.0rc1'"
|
|
- run: scripts-dev/check-newsfragment.sh
|
|
env:
|
|
PULL_REQUEST_NUMBER: ${{ github.event.number }}
|
|
|
|
lint-pydantic:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
with:
|
|
ref: ${{ github.event.pull_request.head.sha }}
|
|
fetch-depth: 0
|
|
- uses: matrix-org/setup-python-poetry@v1
|
|
with:
|
|
extras: "all"
|
|
- run: poetry run scripts-dev/check_pydantic_models.py
|
|
|
|
# Dummy step to gate other tests on without repeating the whole list
|
|
linting-done:
|
|
if: ${{ !cancelled() }} # Run this even if prior jobs were skipped
|
|
needs: [lint, lint-crlf, lint-newsfile, lint-pydantic, check-sampleconfig, check-schema-delta]
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- run: "true"
|
|
|
|
trial:
|
|
if: ${{ !cancelled() && !failure() }} # Allow previous steps to be skipped, but not fail
|
|
needs: linting-done
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
python-version: ["3.7", "3.8", "3.9", "3.10"]
|
|
database: ["sqlite"]
|
|
extras: ["all"]
|
|
include:
|
|
# Newest Python without optional deps
|
|
- python-version: "3.10"
|
|
extras: ""
|
|
|
|
# Oldest Python with PostgreSQL
|
|
- python-version: "3.7"
|
|
database: "postgres"
|
|
postgres-version: "10"
|
|
extras: "all"
|
|
|
|
# Newest Python with newest PostgreSQL
|
|
- python-version: "3.10"
|
|
database: "postgres"
|
|
postgres-version: "14"
|
|
extras: "all"
|
|
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- run: sudo apt-get -qq install xmlsec1
|
|
- name: Set up PostgreSQL ${{ matrix.postgres-version }}
|
|
if: ${{ matrix.postgres-version }}
|
|
run: |
|
|
docker run -d -p 5432:5432 \
|
|
-e POSTGRES_PASSWORD=postgres \
|
|
-e POSTGRES_INITDB_ARGS="--lc-collate C --lc-ctype C --encoding UTF8" \
|
|
postgres:${{ matrix.postgres-version }}
|
|
- uses: matrix-org/setup-python-poetry@v1
|
|
with:
|
|
python-version: ${{ matrix.python-version }}
|
|
extras: ${{ matrix.extras }}
|
|
- name: Await PostgreSQL
|
|
if: ${{ matrix.postgres-version }}
|
|
timeout-minutes: 2
|
|
run: until pg_isready -h localhost; do sleep 1; done
|
|
- run: poetry run trial --jobs=2 tests
|
|
env:
|
|
SYNAPSE_POSTGRES: ${{ matrix.database == 'postgres' || '' }}
|
|
SYNAPSE_POSTGRES_HOST: localhost
|
|
SYNAPSE_POSTGRES_USER: postgres
|
|
SYNAPSE_POSTGRES_PASSWORD: postgres
|
|
- name: Dump logs
|
|
# Logs are most useful when the command fails, always include them.
|
|
if: ${{ always() }}
|
|
# Note: Dumps to workflow logs instead of using actions/upload-artifact
|
|
# This keeps logs colocated with failing jobs
|
|
# It also ignores find's exit code; this is a best effort affair
|
|
run: >-
|
|
find _trial_temp -name '*.log'
|
|
-exec echo "::group::{}" \;
|
|
-exec cat {} \;
|
|
-exec echo "::endgroup::" \;
|
|
|| true
|
|
|
|
trial-olddeps:
|
|
# Note: sqlite only; no postgres
|
|
if: ${{ !cancelled() && !failure() }} # Allow previous steps to be skipped, but not fail
|
|
needs: linting-done
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Test with old deps
|
|
uses: docker://ubuntu:focal # For old python and sqlite
|
|
# Note: focal seems to be using 3.8, but the oldest is 3.7?
|
|
# See https://github.com/matrix-org/synapse/issues/12343
|
|
with:
|
|
workdir: /github/workspace
|
|
entrypoint: .ci/scripts/test_old_deps.sh
|
|
- name: Dump logs
|
|
# Logs are most useful when the command fails, always include them.
|
|
if: ${{ always() }}
|
|
# Note: Dumps to workflow logs instead of using actions/upload-artifact
|
|
# This keeps logs colocated with failing jobs
|
|
# It also ignores find's exit code; this is a best effort affair
|
|
run: >-
|
|
find _trial_temp -name '*.log'
|
|
-exec echo "::group::{}" \;
|
|
-exec cat {} \;
|
|
-exec echo "::endgroup::" \;
|
|
|| true
|
|
|
|
trial-pypy:
|
|
# Very slow; only run if the branch name includes 'pypy'
|
|
# Note: sqlite only; no postgres. Completely untested since poetry move.
|
|
if: ${{ contains(github.ref, 'pypy') && !failure() && !cancelled() }}
|
|
needs: linting-done
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
python-version: ["pypy-3.7"]
|
|
extras: ["all"]
|
|
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
# Install libs necessary for PyPy to build binary wheels for dependencies
|
|
- run: sudo apt-get -qq install xmlsec1 libxml2-dev libxslt-dev
|
|
- uses: matrix-org/setup-python-poetry@v1
|
|
with:
|
|
python-version: ${{ matrix.python-version }}
|
|
extras: ${{ matrix.extras }}
|
|
- run: poetry run trial --jobs=2 tests
|
|
- name: Dump logs
|
|
# Logs are most useful when the command fails, always include them.
|
|
if: ${{ always() }}
|
|
# Note: Dumps to workflow logs instead of using actions/upload-artifact
|
|
# This keeps logs colocated with failing jobs
|
|
# It also ignores find's exit code; this is a best effort affair
|
|
run: >-
|
|
find _trial_temp -name '*.log'
|
|
-exec echo "::group::{}" \;
|
|
-exec cat {} \;
|
|
-exec echo "::endgroup::" \;
|
|
|| true
|
|
|
|
sytest:
|
|
if: ${{ !failure() && !cancelled() }}
|
|
needs: linting-done
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: matrixdotorg/sytest-synapse:${{ matrix.sytest-tag }}
|
|
volumes:
|
|
- ${{ github.workspace }}:/src
|
|
env:
|
|
SYTEST_BRANCH: ${{ github.head_ref }}
|
|
POSTGRES: ${{ matrix.postgres && 1}}
|
|
MULTI_POSTGRES: ${{ (matrix.postgres == 'multi-postgres') && 1}}
|
|
WORKERS: ${{ matrix.workers && 1 }}
|
|
REDIS: ${{ matrix.redis && 1 }}
|
|
BLACKLIST: ${{ matrix.workers && 'synapse-blacklist-with-workers' }}
|
|
TOP: ${{ github.workspace }}
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- sytest-tag: focal
|
|
|
|
- sytest-tag: focal
|
|
postgres: postgres
|
|
|
|
- sytest-tag: testing
|
|
postgres: postgres
|
|
|
|
- sytest-tag: focal
|
|
postgres: multi-postgres
|
|
workers: workers
|
|
|
|
- sytest-tag: buster
|
|
postgres: multi-postgres
|
|
workers: workers
|
|
|
|
- sytest-tag: buster
|
|
postgres: postgres
|
|
workers: workers
|
|
redis: redis
|
|
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- name: Prepare test blacklist
|
|
run: cat sytest-blacklist .ci/worker-blacklist > synapse-blacklist-with-workers
|
|
- name: Run SyTest
|
|
run: /bootstrap.sh synapse
|
|
working-directory: /src
|
|
- name: Summarise results.tap
|
|
if: ${{ always() }}
|
|
run: /sytest/scripts/tap_to_gha.pl /logs/results.tap
|
|
- name: Upload SyTest logs
|
|
uses: actions/upload-artifact@v2
|
|
if: ${{ always() }}
|
|
with:
|
|
name: Sytest Logs - ${{ job.status }} - (${{ join(matrix.*, ', ') }})
|
|
path: |
|
|
/logs/results.tap
|
|
/logs/**/*.log*
|
|
|
|
export-data:
|
|
if: ${{ !failure() && !cancelled() }} # Allow previous steps to be skipped, but not fail
|
|
needs: [linting-done, portdb]
|
|
runs-on: ubuntu-latest
|
|
env:
|
|
TOP: ${{ github.workspace }}
|
|
|
|
services:
|
|
postgres:
|
|
image: postgres
|
|
ports:
|
|
- 5432:5432
|
|
env:
|
|
POSTGRES_PASSWORD: "postgres"
|
|
POSTGRES_INITDB_ARGS: "--lc-collate C --lc-ctype C --encoding UTF8"
|
|
options: >-
|
|
--health-cmd pg_isready
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries 5
|
|
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- run: sudo apt-get -qq install xmlsec1
|
|
- uses: matrix-org/setup-python-poetry@v1
|
|
with:
|
|
python-version: ${{ matrix.python-version }}
|
|
extras: "postgres"
|
|
- run: .ci/scripts/test_export_data_command.sh
|
|
|
|
portdb:
|
|
if: ${{ !failure() && !cancelled() }} # Allow previous steps to be skipped, but not fail
|
|
needs: linting-done
|
|
runs-on: ubuntu-latest
|
|
env:
|
|
TOP: ${{ github.workspace }}
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- python-version: "3.7"
|
|
postgres-version: "10"
|
|
|
|
- python-version: "3.10"
|
|
postgres-version: "14"
|
|
|
|
services:
|
|
postgres:
|
|
image: postgres:${{ matrix.postgres-version }}
|
|
ports:
|
|
- 5432:5432
|
|
env:
|
|
POSTGRES_PASSWORD: "postgres"
|
|
POSTGRES_INITDB_ARGS: "--lc-collate C --lc-ctype C --encoding UTF8"
|
|
options: >-
|
|
--health-cmd pg_isready
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries 5
|
|
|
|
steps:
|
|
- uses: actions/checkout@v2
|
|
- run: sudo apt-get -qq install xmlsec1
|
|
- uses: matrix-org/setup-python-poetry@v1
|
|
with:
|
|
python-version: ${{ matrix.python-version }}
|
|
extras: "postgres"
|
|
- run: .ci/scripts/test_synapse_port_db.sh
|
|
|
|
complement:
|
|
if: "${{ !failure() && !cancelled() }}"
|
|
needs: linting-done
|
|
runs-on: ubuntu-latest
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- arrangement: monolith
|
|
database: SQLite
|
|
|
|
- arrangement: monolith
|
|
database: Postgres
|
|
|
|
- arrangement: workers
|
|
database: Postgres
|
|
|
|
steps:
|
|
- name: Run actions/checkout@v2 for synapse
|
|
uses: actions/checkout@v2
|
|
with:
|
|
path: synapse
|
|
|
|
- name: Prepare Complement's Prerequisites
|
|
run: synapse/.ci/scripts/setup_complement_prerequisites.sh
|
|
|
|
- run: |
|
|
set -o pipefail
|
|
POSTGRES=${{ (matrix.database == 'Postgres') && 1 || '' }} WORKERS=${{ (matrix.arrangement == 'workers') && 1 || '' }} COMPLEMENT_DIR=`pwd`/complement synapse/scripts-dev/complement.sh -json 2>&1 | synapse/.ci/scripts/gotestfmt
|
|
shell: bash
|
|
name: Run Complement Tests
|
|
|
|
# a job which marks all the other jobs as complete, thus allowing PRs to be merged.
|
|
tests-done:
|
|
if: ${{ always() }}
|
|
needs:
|
|
- check-sampleconfig
|
|
- lint
|
|
- lint-crlf
|
|
- lint-newsfile
|
|
- trial
|
|
- trial-olddeps
|
|
- sytest
|
|
- export-data
|
|
- portdb
|
|
- complement
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: matrix-org/done-action@v2
|
|
with:
|
|
needs: ${{ toJSON(needs) }}
|
|
|
|
# The newsfile lint may be skipped on non PR builds
|
|
skippable:
|
|
lint-newsfile
|