tests: Dump more info if version test fails #573
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- | |
name: CI | |
on: | |
- push | |
- pull_request | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
cancel-in-progress: true | |
jobs: | |
lint: | |
name: Run linters | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v4 | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.13" | |
- name: Set up Go | |
uses: actions/setup-go@v5 | |
with: | |
go-version: "1.21" | |
- name: Install dependencies | |
run: python -m pip install tox | |
- name: Run tox | |
run: tox -e pep8 | |
test: | |
name: Run unit tests | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
# NOTE: If you add a version here, don't forget to update the | |
# '[gh-actions]' section in tox.ini | |
python: ["3.9", "3.10", "3.11", "3.12", "3.13"] | |
db: [postgres, mysql, sqlite3] | |
env: | |
DATABASE_TYPE: "${{ matrix.db }}" | |
DATABASE_HOST: "127.0.0.1" | |
DATABASE_NAME: ${{ matrix.db != 'sqlite3' && format('patchwork-db-{0}', github.run_id) || '/dev/shm/patchwork.test.db.sqlite3' }} | |
DATABASE_USER: patchwork-user-${{ github.run_id }} | |
DATABASE_PASSWORD: password-${{ github.run_id }} | |
MYSQL_ROOT_PASSWORD: root-${{ github.run_id }} | |
services: | |
postgres: | |
image: postgres:latest | |
env: | |
POSTGRES_DB: ${{ env.DATABASE_NAME }} | |
POSTGRES_PASSWORD: ${{ env.DATABASE_PASSWORD }} | |
POSTGRES_USER: ${{ env.DATABASE_USER }} | |
ports: | |
- 5432:5432 | |
options: >- | |
--health-cmd pg_isready | |
--health-interval 10s | |
--health-timeout 5s | |
--health-retries 5 | |
mysql: | |
image: mysql:latest | |
env: | |
MYSQL_DATABASE: ${{ env.DATABASE_NAME }} | |
MYSQL_USER: ${{ env.DATABASE_USER }} | |
MYSQL_PASSWORD: ${{ env.DATABASE_PASSWORD }} | |
MYSQL_ROOT_PASSWORD: ${{ env.MYSQL_ROOT_PASSWORD }} | |
ports: | |
- 3306:3306 | |
options: >- | |
--health-cmd="mysqladmin ping" | |
--health-interval 10s | |
--health-timeout 5s | |
--health-retries 5 | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v4 | |
- name: Set up Python ${{ matrix.python }} | |
uses: actions/setup-python@v5 | |
with: | |
python-version: ${{ matrix.python }} | |
- name: Install Python dependencies | |
run: python -m pip install tox tox-gh-actions | |
- name: Log database configuration (mysql) | |
if: ${{ matrix.db == 'mysql' }} | |
run: | | |
mysql -h 127.0.0.1 -e "SELECT VERSION(), CURRENT_USER();" \ | |
-uroot -p${MYSQL_ROOT_PASSWORD} ${DATABASE_NAME} | |
- name: Log database configuration (postgres) | |
if: ${{ matrix.db == 'postgres' }} | |
run: | | |
psql -h 127.0.0.1 -c "SELECT VERSION(), CURRENT_USER, current_database()" \ | |
-U ${DATABASE_USER} -d ${DATABASE_NAME} | |
env: | |
PGPASSWORD: ${{ env.DATABASE_PASSWORD }} | |
- name: Modify database user permissions (mysql) | |
if: ${{ matrix.db == 'mysql' }} | |
run: | | |
mysql -h 127.0.0.1 -e "GRANT ALL ON \`test\\_${DATABASE_NAME}%\`.* to '${DATABASE_USER}'@'%';" \ | |
-uroot -p${MYSQL_ROOT_PASSWORD} | |
- name: Run unit tests (via tox) | |
run: tox | |
docs: | |
name: Build docs | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.13" | |
- name: Install dependencies | |
run: python -m pip install tox | |
- name: Build docs (via tox) | |
run: tox -e docs | |
- name: Archive build results | |
uses: actions/upload-artifact@v4 | |
with: | |
name: html-docs-build | |
path: docs/_build/html | |
retention-days: 7 | |
docker-compose: | |
name: Docker Image tests | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
db: [postgres, mysql, sqlite3] | |
env: | |
COMPOSE_FILE: ${{ matrix.db == 'mysql' && 'docker-compose.yml' || (matrix.db == 'postgres' && 'docker-compose-pg.yml') || 'docker-compose-sqlite3.yml' }} | |
steps: | |
- name: Checkout source code | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Set up Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.13" | |
- name: Build docker-compose service | |
run: | | |
docker compose build --build-arg UID=$(id -u) --build-arg GID=$(id -g) | |
- name: Test createsuperuser/changepassword | |
run: | | |
docker compose run -T --rm web \ | |
python manage.py createsuperuser \ | |
--username patchwork --no-input --email test@example.com | |
{ echo patchwork; echo patchwork; } | \ | |
docker compose run -T --rm web \ | |
python manage.py changepassword patchwork | |
# FIXME(stephenfin): Re-enable this once dbbackup supports Django 4.0 | |
# - name: Test dbbackup/dbrestore | |
# run: | | |
# docker compose run -T --rm web python manage.py dbbackup | |
# echo y | docker compose run -T --rm web python manage.py dbrestore | |
- name: Modify database user permissions (mysql) | |
if: ${{ matrix.db == 'mysql' }} | |
run: | | |
docker compose exec -T -- db \ | |
sh -c "exec mysql -uroot -p\"\${MYSQL_ROOT_PASSWORD}\" -e \"GRANT ALL ON \\\`test\\_\${MYSQL_DATABASE}%\\\`.* to '\${MYSQL_USER}'@'%'; FLUSH PRIVILEGES;\"" | |
- name: Run unittest | |
run: docker compose run -T --rm web tox | |
- name: Test normal startup | |
run: | | |
docker compose up --detach | |
for count in $(seq 50); do \ | |
if curl --fail --silent "http://localhost:8000"; then \ | |
break; \ | |
fi; \ | |
sleep 1; echo -n .; \ | |
done | |
echo | |
docker compose ps | |
- name: Test client access (git-pw) | |
run: | | |
python -m pip install git-pw | |
git pw --debug \ | |
--server http://localhost:8000/api/1.2 --project patchwork \ | |
--username patchwork --password patchwork series list | |
- name: Dump container logs | |
if: ${{ always() }} | |
run: docker compose logs --no-color --timestamps |