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