123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- # People who are freshly `pip install`ing from PyPI will pull in the latest versions of
- # dependencies which match the broad requirements. Since most CI runs are against
- # the locked poetry environment, run specifically against the latest dependencies to
- # know if there's an upcoming breaking change.
- #
- # As an overview this workflow:
- # - checks out develop,
- # - installs from source, pulling in the dependencies like a fresh `pip install` would, and
- # - runs mypy and test suites in that checkout.
- #
- # Based on the twisted trunk CI job.
- name: Latest dependencies
- on:
- schedule:
- - cron: 0 7 * * *
- workflow_dispatch:
- concurrency:
- group: ${{ github.workflow }}-${{ github.ref }}
- cancel-in-progress: true
- jobs:
- check_repo:
- # Prevent this workflow from running on any fork of Synapse other than matrix-org/synapse, as it is
- # only useful to the Synapse core team.
- # All other workflow steps depend on this one, thus if 'should_run_workflow' is not 'true', the rest
- # of the workflow will be skipped as well.
- runs-on: ubuntu-latest
- outputs:
- should_run_workflow: ${{ steps.check_condition.outputs.should_run_workflow }}
- steps:
- - id: check_condition
- run: echo "should_run_workflow=${{ github.repository == 'matrix-org/synapse' }}" >> "$GITHUB_OUTPUT"
- mypy:
- needs: check_repo
- if: needs.check_repo.outputs.should_run_workflow == 'true'
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - name: Install Rust
- uses: dtolnay/rust-toolchain@stable
- - uses: Swatinem/rust-cache@v2
- # The dev dependencies aren't exposed in the wheel metadata (at least with current
- # poetry-core versions), so we install with poetry.
- - uses: matrix-org/setup-python-poetry@v1
- with:
- python-version: "3.x"
- poetry-version: "1.3.2"
- extras: "all"
- # Dump installed versions for debugging.
- - run: poetry run pip list > before.txt
- # Upgrade all runtime dependencies only. This is intended to mimic a fresh
- # `pip install matrix-synapse[all]` as closely as possible.
- - run: poetry update --no-dev
- - run: poetry run pip list > after.txt && (diff -u before.txt after.txt || true)
- - name: Remove unhelpful options from mypy config
- run: sed -e '/warn_unused_ignores = True/d' -e '/warn_redundant_casts = True/d' -i mypy.ini
- - run: poetry run mypy
- trial:
- needs: check_repo
- if: needs.check_repo.outputs.should_run_workflow == 'true'
- runs-on: ubuntu-latest
- strategy:
- matrix:
- include:
- - database: "sqlite"
- - database: "postgres"
- postgres-version: "14"
- steps:
- - uses: actions/checkout@v4
- - name: Install Rust
- uses: dtolnay/rust-toolchain@stable
- - uses: Swatinem/rust-cache@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: actions/setup-python@v4
- with:
- python-version: "3.x"
- - run: pip install .[all,test]
- - name: Await PostgreSQL
- if: ${{ matrix.postgres-version }}
- timeout-minutes: 2
- run: until pg_isready -h localhost; do sleep 1; done
- # We nuke the local copy, as we've installed synapse into the virtualenv
- # (rather than use an editable install, which we no longer support). If we
- # don't do this then python can't find the native lib.
- - run: rm -rf synapse/
- - run: python -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
- sytest:
- needs: check_repo
- if: needs.check_repo.outputs.should_run_workflow == 'true'
- runs-on: ubuntu-latest
- container:
- image: matrixdotorg/sytest-synapse:testing
- volumes:
- - ${{ github.workspace }}:/src
- strategy:
- fail-fast: false
- matrix:
- include:
- - sytest-tag: focal
- - sytest-tag: focal
- postgres: postgres
- workers: workers
- redis: redis
- env:
- POSTGRES: ${{ matrix.postgres && 1}}
- WORKERS: ${{ matrix.workers && 1 }}
- REDIS: ${{ matrix.redis && 1 }}
- BLACKLIST: ${{ matrix.workers && 'synapse-blacklist-with-workers' }}
- steps:
- - uses: actions/checkout@v4
- - name: Install Rust
- uses: dtolnay/rust-toolchain@stable
- - uses: Swatinem/rust-cache@v2
- - name: Ensure sytest runs `pip install`
- # Delete the lockfile so sytest will `pip install` rather than `poetry install`
- run: rm /src/poetry.lock
- working-directory: /src
- - 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@v3
- if: ${{ always() }}
- with:
- name: Sytest Logs - ${{ job.status }} - (${{ join(matrix.*, ', ') }})
- path: |
- /logs/results.tap
- /logs/**/*.log*
- complement:
- needs: check_repo
- if: "!failure() && !cancelled() && needs.check_repo.outputs.should_run_workflow == 'true'"
- 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@v4 for synapse
- uses: actions/checkout@v4
- with:
- path: synapse
- - name: Prepare Complement's Prerequisites
- run: synapse/.ci/scripts/setup_complement_prerequisites.sh
- - uses: actions/setup-go@v4
- with:
- cache-dependency-path: complement/go.sum
- go-version-file: complement/go.mod
- - run: |
- set -o pipefail
- TEST_ONLY_IGNORE_POETRY_LOCKFILE=1 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
- # Open an issue if the build fails, so we know about it.
- # Only do this if we're not experimenting with this action in a PR.
- open-issue:
- if: "failure() && github.event_name != 'push' && github.event_name != 'pull_request' && needs.check_repo.outputs.should_run_workflow == 'true'"
- needs:
- # TODO: should mypy be included here? It feels more brittle than the others.
- - mypy
- - trial
- - sytest
- - complement
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - uses: JasonEtco/create-an-issue@e27dddc79c92bc6e4562f268fffa5ed752639abd # v2.9.1
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- with:
- update_existing: true
- filename: .ci/latest_deps_build_failed_issue_template.md
|