|
@@ -0,0 +1,156 @@
|
|
|
+# 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:
|
|
|
+ mypy:
|
|
|
+ runs-on: ubuntu-latest
|
|
|
+ steps:
|
|
|
+ - uses: actions/checkout@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.2.0b1"
|
|
|
+ # 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)
|
|
|
+ - run: poetry run mypy
|
|
|
+ trial:
|
|
|
+ runs-on: ubuntu-latest
|
|
|
+ strategy:
|
|
|
+ matrix:
|
|
|
+ include:
|
|
|
+ - database: "sqlite"
|
|
|
+ - database: "postgres"
|
|
|
+ postgres-version: "14"
|
|
|
+
|
|
|
+ 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: actions/setup-python@v2
|
|
|
+ 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
|
|
|
+ - 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:
|
|
|
+ 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@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@v2
|
|
|
+ if: ${{ always() }}
|
|
|
+ with:
|
|
|
+ name: Sytest Logs - ${{ job.status }} - (${{ join(matrix.*, ', ') }})
|
|
|
+ path: |
|
|
|
+ /logs/results.tap
|
|
|
+ /logs/**/*.log*
|
|
|
+
|
|
|
+
|
|
|
+ # TODO: run complement (as with twisted trunk, see #12473).
|
|
|
+
|
|
|
+ # open an issue if the build fails, so we know about it.
|
|
|
+ open-issue:
|
|
|
+ if: failure()
|
|
|
+ needs:
|
|
|
+ # TODO: should mypy be included here? It feels more brittle than the other two.
|
|
|
+ - mypy
|
|
|
+ - trial
|
|
|
+ - sytest
|
|
|
+
|
|
|
+ runs-on: ubuntu-latest
|
|
|
+
|
|
|
+ steps:
|
|
|
+ - uses: actions/checkout@v2
|
|
|
+ - uses: JasonEtco/create-an-issue@5d9504915f79f9cc6d791934b8ef34f2353dd74d # v2.5.0, 2020-12-06
|
|
|
+ env:
|
|
|
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
|
+ with:
|
|
|
+ update_existing: true
|
|
|
+ filename: .ci/latest_deps_build_failed_issue_template.md
|
|
|
+
|