From 3a2bdced9869cf10d7c1a8fcfeb3e761a09e218c Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Mon, 7 Sep 2026 05:06:45 +0000 Subject: [PATCH] Run migration tests against all supported backends --- .github/workflows/migration_tests.yaml | 181 +++++++++++++++++++++++++ .github/workflows/qc_checks.yaml | 47 ------- 2 files changed, 181 insertions(+), 47 deletions(-) create mode 100644 .github/workflows/migration_tests.yaml diff --git a/.github/workflows/migration_tests.yaml b/.github/workflows/migration_tests.yaml new file mode 100644 index 0000000000..d6be2b8c96 --- /dev/null +++ b/.github/workflows/migration_tests.yaml @@ -0,0 +1,181 @@ +# Data migration unit tests, run against every supported database backend + +name: Migration Tests + +on: + push: + branches-ignore: ["l10*", "dependabot/**", "backport/**"] + pull_request: + branches-ignore: ["l10*"] + +env: + python_version: 3.12 + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + INVENTREE_MEDIA_ROOT: /home/runner/work/InvenTree/test_inventree_media + INVENTREE_STATIC_ROOT: /home/runner/work/InvenTree/test_inventree_static + INVENTREE_BACKUP_DIR: /home/runner/work/InvenTree/test_inventree_backup + INVENTREE_SITE_URL: http://localhost:8000 + +permissions: + contents: read + +jobs: + paths-filter: + name: Filter + runs-on: ubuntu-latest + + outputs: + migrations: ${{ steps.filter.outputs.migrations }} + force: ${{ steps.force.outputs.force }} + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d # v4.0.3 + id: filter + with: + filters: | + migrations: + - '**/test_migrations.py' + - '**/*migrations.py', + - '**/migrations/**' + - '.github/workflows**' + - 'src/backend/requirements.txt' + - name: Is CI being forced? + run: echo "force=true" >> $GITHUB_OUTPUT + id: force + if: | + contains(github.event.pull_request.labels.*.name, 'dependency') || + contains(github.event.pull_request.labels.*.name, 'full-run') + + sqlite: + name: Tests - Migrations [SQLite] + runs-on: ubuntu-latest + needs: paths-filter + if: ${{ (needs.paths-filter.outputs.force == 'true') || (github.ref == 'refs/heads/master' && needs.paths-filter.outputs.migrations == 'true') }} + + env: + INVENTREE_DB_ENGINE: sqlite3 + INVENTREE_DB_NAME: /home/runner/work/InvenTree/db.sqlite3 + INVENTREE_DEBUG: true + INVENTREE_LOG_LEVEL: WARNING + INVENTREE_PLUGINS_ENABLED: false + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - name: Environment Setup + uses: ./.github/actions/setup + with: + apt-dependency: gettext poppler-utils + dev-install: true + update: true + - name: Run Tests + run: invoke dev.test --check --migrations --report --coverage --translations + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 + if: always() + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: inventree/InvenTree + flags: migrations-sqlite + + mysql: + name: Tests - Migrations [MySQL] + runs-on: ubuntu-24.04 + needs: paths-filter + if: ${{ (needs.paths-filter.outputs.force == 'true') || (github.ref == 'refs/heads/master' && needs.paths-filter.outputs.migrations == 'true') }} + + env: + INVENTREE_DB_ENGINE: django.db.backends.mysql + INVENTREE_DB_NAME: inventree + INVENTREE_DB_USER: root + INVENTREE_DB_PASSWORD: password + INVENTREE_DB_HOST: "127.0.0.1" + INVENTREE_DB_PORT: 3306 + INVENTREE_DEBUG: true + INVENTREE_LOG_LEVEL: WARNING + INVENTREE_PLUGINS_ENABLED: false + + services: + mysql: + image: mysql:9 + env: + MYSQL_ALLOW_EMPTY_PASSWORD: yes + MYSQL_DATABASE: inventree + MYSQL_USER: inventree + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: password + options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3 + ports: + - 3306:3306 + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - name: Environment Setup + uses: ./.github/actions/setup + with: + apt-dependency: gettext poppler-utils libmysqlclient-dev + pip-dependency: mysqlclient + dev-install: true + update: true + - name: Run Tests + run: invoke dev.test --check --migrations --report --coverage --translations + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 + if: always() + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: inventree/InvenTree + flags: migrations-mysql + + postgresql: + name: Tests - Migrations [PostgreSQL] + runs-on: ubuntu-latest + needs: paths-filter + if: ${{ (needs.paths-filter.outputs.force == 'true') || (github.ref == 'refs/heads/master' && needs.paths-filter.outputs.migrations == 'true') }} + + env: + INVENTREE_DB_ENGINE: django.db.backends.postgresql + INVENTREE_DB_NAME: inventree + INVENTREE_DB_USER: inventree + INVENTREE_DB_PASSWORD: password + INVENTREE_DB_HOST: "127.0.0.1" + INVENTREE_DB_PORT: 5432 + INVENTREE_DEBUG: false + INVENTREE_LOG_LEVEL: WARNING + INVENTREE_PLUGINS_ENABLED: false + + services: + postgres: + image: postgres:17 + env: + POSTGRES_USER: inventree + POSTGRES_PASSWORD: password + ports: + - 5432:5432 + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + - name: Environment Setup + uses: ./.github/actions/setup + with: + apt-dependency: gettext poppler-utils libpq-dev + pip-dependency: psycopg + dev-install: true + update: true + - name: Run Tests + run: invoke dev.test --check --migrations --report --coverage --translations + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 + if: always() + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: inventree/InvenTree + flags: migrations-postgresql diff --git a/.github/workflows/qc_checks.yaml b/.github/workflows/qc_checks.yaml index 137d7ade17..f53261e062 100644 --- a/.github/workflows/qc_checks.yaml +++ b/.github/workflows/qc_checks.yaml @@ -559,53 +559,6 @@ jobs: - name: Data Export Test uses: ./.github/actions/migration - migration-tests: - name: Tests - Migrations [PostgreSQL] - runs-on: ubuntu-latest - needs: paths-filter - if: ${{ (needs.paths-filter.outputs.force == 'true') || (github.ref == 'refs/heads/master' && needs.paths-filter.outputs.migrations == 'true') }} - - env: - INVENTREE_DB_ENGINE: django.db.backends.postgresql - INVENTREE_DB_NAME: inventree - INVENTREE_DB_USER: inventree - INVENTREE_DB_PASSWORD: password - INVENTREE_DB_HOST: "127.0.0.1" - INVENTREE_DB_PORT: 5432 - INVENTREE_DEBUG: False - INVENTREE_LOG_LEVEL: WARNING - INVENTREE_PLUGINS_ENABLED: false - - services: - postgres: - image: postgres:17 - env: - POSTGRES_USER: inventree - POSTGRES_PASSWORD: password - ports: - - 5432:5432 - - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - name: Environment Setup - uses: ./.github/actions/setup - with: - apt-dependency: gettext poppler-utils libpq-dev - pip-dependency: psycopg - dev-install: true - update: true - - name: Run Tests - run: invoke dev.test --check --migrations --report --coverage --translations - - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@fb8b3582c8e4def4969c97caa2f19720cb33a72f # v7.0.0 - if: always() - with: - token: ${{ secrets.CODECOV_TOKEN }} - slug: inventree/InvenTree - flags: migrations - migrations-checks: name: Tests - Full Migration [SQLite] runs-on: ubuntu-latest