1
0
Files
synapse/.github/workflows/tests.yml
Brendan Abolivier 4ab2ed283c Re-comment lint
2022-09-02 15:34:50 +01:00

439 lines
14 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
env:
TOP: ${{ github.workspace }}
strategy:
matrix:
python-version: ["3.7", "3.8", "3.9", "3.10"]
database: ["sqlite"]
extras: ["all"]
is_pr:
- ${{ startsWith(github.ref, 'refs/pull/') }}
# If we're a PR then we only test min and max python.
exclude:
- is_pr: true
python-version: 3.8
- is_pr: true
python-version: 3.9
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 coverage run --branch --parallel-mode -m twisted.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
- name: Upload coverage
uses: actions/upload-artifact@v3
with:
name: coverage
path: .coverage.*
retention-days: 1
# 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 is usually defined as {{ github.workspace }}, however in this case we're
# operating in the context of the container, where the path defined by
# github.workspace doesn't exist, and the equivalent path is defined as /synapse
# in synapse_sytest.sh.
TOP: "/synapse"
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*
- name: Upload coverage
uses: actions/upload-artifact@v3
with:
name: coverage
path: /coverage/.coverage.*
retention-days: 1
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:
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 combines the coverage reports from all trials runs, ready for upload to SonarQube.
coverage:
needs:
- trial
- sytest
runs-on: ubuntu-latest
env:
TOP: ${{ github.workspace }}
steps:
- uses: actions/checkout@v2
- uses: actions/download-artifact@v3
with:
name: coverage
path: .
- uses: matrix-org/setup-python-poetry@v1
- name: Combine coverage reports
run: poetry run coverage combine
- name: Write coverage to XML
run: poetry run coverage xml
- name: Upload combined coverage
uses: actions/upload-artifact@v3
with:
name: coverage
path: coverage.xml
retention-days: 1
# 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
- coverage
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