Skip to content

try fix oracle tests in CI #1188

try fix oracle tests in CI

try fix oracle tests in CI #1188

Workflow file for this run

name: Test
permissions:
contents: read
on:
push:
tags-ignore:
- '*'
branches: ['main']
pull_request:
branches: ['main']
workflow_call:
workflow_dispatch:
inputs:
debug:
description: 'Open ssh debug session.'
required: true
default: false
type: boolean
schedule:
# Every Sunday at 9:00 AM Los Angeles time.
# GitHub cron is UTC; 09:00 PT == 17:00 UTC (PST).
- cron: '0 17 * * 0'
jobs:
postgres:
runs-on: ubuntu-latest
permissions:
contents: read
actions: write
# Service containers to run with `container-job`
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.11', '3.12', '3.13', '3.14']
postgres-version: ['12', 'latest']
psycopg-version: ['psycopg2', 'psycopg3']
django-version:
- '4.2' # LTS April 2026
- '5.1' # December 2025
- '5.2' # LTS April 2028
- '6.0rc1' # April 2027
exclude:
- django-version: '4.2'
postgres-version: 'latest'
- python-version: '3.13'
django-version: '4.2'
- python-version: '3.14'
django-version: '4.2'
- postgres-version: '12'
psycopg-version: 'psycopg3'
- postgres-version: '12'
django-version: '5.1'
- postgres-version: '12'
django-version: '5.2'
# https://github.com/psycopg/psycopg2/pull/1695
- python-version: '3.13'
psycopg-version: 'psycopg2'
- python-version: '3.14'
django-version: '5.1'
# https://github.com/psycopg/psycopg2/pull/1695
- python-version: '3.14'
psycopg-version: 'psycopg2'
- postgres-version: '12'
django-version: '6.0rc1'
- python-version: '3.10'
django-version: '6.0rc1'
- python-version: '3.11'
django-version: '6.0rc1'
env:
RDBMS: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
POSTGRES_HOST: localhost
POSTGRES_PORT: 5432
COVERAGE_FILE: linux-py${{ matrix.python-version }}-dj${{ matrix.django-version }}-${{ matrix.psycopg-version }}-pg${{ matrix.postgres-version }}.coverage
TEST_PYTHON_VERSION: ${{ matrix.python-version }}
TEST_DJANGO_VERSION: ${{ matrix.django-version }}
TEST_DATABASE_CLIENT_VERSION: ${{ matrix.psycopg-version }}
TEST_DATABASE_VERSION: ${{ matrix.postgres-version }}
# Service containers to run with `runner-job`
services:
# Label used to access the service container
postgres:
# Docker Hub image
image: postgres:${{ matrix.postgres-version }}
# Provide the password for postgres
env:
POSTGRES_PASSWORD: postgres
# Set health checks to wait until postgres has started
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps tcp port 5432 on service container to the host
- 5432:5432
steps:
- uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
id: sp
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Upgrade all dependencies for our weekly runs
if: github.event_name == 'schedule'
run: uv lock --upgrade
- name: Setup Just
uses: extractions/setup-just@v3
- name: Install Release Dependencies
shell: bash
run: |
just setup ${{ steps.sp.outputs.python-path }}
if [[ "${{ matrix.django-version }}" =~ (a|b|rc) ]]; then
just test-lock Django==${{ matrix.django-version }}
else
just test-lock Django~=${{ matrix.django-version }}.0
fi
- name: Install Emacs
if: ${{ github.event.inputs.debug == 'true' }}
run: |
sudo apt install emacs
- name: Setup tmate session
if: ${{ github.event.inputs.debug == 'true' }}
uses: mxschmitt/[email protected]
with:
detached: true
timeout-minutes: 60
- name: Run Unit Tests
run: |
just test-all ${{ matrix.psycopg-version }}
- name: Store coverage files
uses: actions/upload-artifact@v5
with:
name: ${{ env.COVERAGE_FILE }}
path: ${{ env.COVERAGE_FILE }}
sqlite:
runs-on: ubuntu-latest
permissions:
contents: read
actions: write
env:
RDBMS: sqlite
COVERAGE_FILE: linux-py${{ matrix.python-version }}-dj${{ matrix.django-version }}-sqlite.coverage
TEST_PYTHON_VERSION: ${{ matrix.python-version }}
TEST_DJANGO_VERSION: ${{ matrix.django-version }}
TEST_DATABASE_VERSION: "sqlite"
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.12', '3.14']
django-version:
- '4.2' # LTS April 2024
- '5.2' # LTS April 2028
- '6.0rc1' # April 2027
exclude:
- python-version: '3.12'
django-version: '4.2'
- python-version: '3.14'
django-version: '4.2'
- python-version: '3.10'
django-version: '5.2'
- python-version: '3.14'
django-version: '5.2'
- python-version: '3.10'
django-version: '6.0rc1'
- python-version: '3.12'
django-version: '6.0rc1'
steps:
- uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
id: sp
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Upgrade all dependencies for our weekly runs
if: github.event_name == 'schedule'
run: uv lock --upgrade
- name: Setup Just
uses: extractions/setup-just@v3
- name: Install Release Dependencies
run: |
just setup ${{ steps.sp.outputs.python-path }}
just install
if [[ "${{ matrix.django-version }}" =~ (a|b|rc) ]]; then
just test-lock Django==${{ matrix.django-version }}
else
just test-lock Django~=${{ matrix.django-version }}.0
fi
- name: Install Emacs
if: ${{ github.event.inputs.debug == 'true' }}
run: |
sudo apt install emacs
- name: Setup tmate session
if: ${{ github.event.inputs.debug == 'true' }}
uses: mxschmitt/[email protected]
with:
detached: true
timeout-minutes: 60
- name: Run Unit Tests
run: |
just test-all
- name: Store coverage files
uses: actions/upload-artifact@v5
with:
name: ${{ env.COVERAGE_FILE }}
path: ${{ env.COVERAGE_FILE }}
mysql:
runs-on: ubuntu-latest
permissions:
contents: read
actions: write
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.12', '3.14']
mysql-version: ['8.0', 'latest']
mysqlclient-version: ['1.4.3', '']
django-version:
- '4.2' # LTS April 2024
- '5.2' # LTS April 2028
- '6.0rc1' # April 2027
exclude:
- django-version: '4.2'
mysql-version: 'latest'
- django-version: '6.0rc1'
mysql-version: '8.0'
- mysql-version: 'latest'
mysqlclient-version: '1.4.3'
- python-version: '3.12'
django-version: '4.2'
- python-version: '3.14'
django-version: '4.2'
- python-version: '3.10'
django-version: '5.2'
- python-version: '3.14'
django-version: '5.2'
- django-version: '5.2'
mysqlclient-version: '1.4.3'
- python-version: '3.10'
django-version: '6.0rc1'
- python-version: '3.12'
django-version: '6.0rc1'
env:
RDBMS: mysql
MYSQL_VERSION: ${{ matrix.mysql-version }}
COVERAGE_FILE: linux-py${{ matrix.python-version }}-dj${{ matrix.django-version }}-${{ matrix.mysqlclient-version }}-mysql${{ matrix.mysql-version }}.coverage
TEST_PYTHON_VERSION: ${{ matrix.python-version }}
TEST_DJANGO_VERSION: ${{ matrix.django-version }}
TEST_DATABASE_CLIENT_VERSION: ${{ matrix.mysqlclient-version }}
TEST_DATABASE_VERSION: ${{ matrix.mysql-version }}
services:
mysql:
# Docker Hub image
image: mysql:${{ matrix.mysql-version }}
# Provide the password for mysql
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test
# Set health checks to wait until mysql has started
options: >-
--health-cmd "mysqladmin ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps tcp port 3306 on service container to the host
- 3306:3306
steps:
- uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
id: sp
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Install Emacs
if: ${{ github.event.inputs.debug == 'true' }}
run: |
sudo apt install emacs
- name: Setup tmate session
if: ${{ github.event.inputs.debug == 'true' }}
uses: mxschmitt/[email protected]
with:
detached: true
timeout-minutes: 60
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Upgrade all dependencies for our weekly runs
if: github.event_name == 'schedule'
run: uv lock --upgrade
- name: Setup Just
uses: extractions/setup-just@v3
- name: Install Release Dependencies
shell: bash
run: |
just setup ${{ steps.sp.outputs.python-path }}
if [[ "${{ matrix.django-version }}" =~ (a|b|rc) ]]; then
just test-lock Django==${{ matrix.django-version }}
else
just test-lock Django~=${{ matrix.django-version }}.0
fi
- name: Install mysqlclient if needed
if: ${{ matrix.mysqlclient-version != '' }}
run: just test-lock mysqlclient==${{ matrix.mysqlclient-version }}
- name: Run Unit Tests
run: |
just test-all mysql
- name: Store coverage files
uses: actions/upload-artifact@v5
with:
name: ${{ env.COVERAGE_FILE }}
path: ${{ env.COVERAGE_FILE }}
mariadb:
runs-on: ubuntu-latest
permissions:
contents: read
actions: write
env:
RDBMS: mariadb
COVERAGE_FILE: linux-py${{ matrix.python-version }}-dj${{ matrix.django-version }}-${{ matrix.mysqlclient-version }}-mariadb${{ matrix.mariadb-version }}.coverage
TEST_PYTHON_VERSION: ${{ matrix.python-version }}
TEST_DJANGO_VERSION: ${{ matrix.django-version }}
TEST_DATABASE_CLIENT_VERSION: ${{ matrix.mysqlclient-version }}
TEST_DATABASE_VERSION: ${{ matrix.mariadb-version }}
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.12', '3.14']
mysqlclient-version: ['1.4.3', '']
mariadb-version: ['10.4', 'latest']
mariadb-healthcheck: ["mysqladmin ping", "healthcheck.sh --connect --innodb_initialized"]
django-version:
- '4.2' # LTS April 2024
- '5.2' # LTS April 2028
- '6.0rc1' # April 2027
exclude:
- django-version: '4.2'
mariadb-version: 'latest'
- django-version: '5.2'
mariadb-version: '10.4'
- django-version: '6.0rc1'
mariadb-version: '10.4'
- mariadb-version: 'latest'
mysqlclient-version: '1.4.3'
- python-version: '3.12'
django-version: '4.2'
- python-version: '3.14'
django-version: '4.2'
- python-version: '3.10'
django-version: '5.2'
- python-version: '3.14'
django-version: '5.2'
- django-version: '5.2'
mysqlclient-version: '1.4.3'
- python-version: '3.10'
django-version: '6.0rc1'
- python-version: '3.12'
django-version: '6.0rc1'
- mariadb-version: '10.4'
mysqlclient-version: ''
- mariadb-version: 'latest'
mariadb-healthcheck: "mysqladmin ping"
- mariadb-version: '10.4'
mariadb-healthcheck: "healthcheck.sh --connect --innodb_initialized"
services:
mysql:
# Docker Hub image
image: mariadb:${{ matrix.mariadb-version }}
# Provide the password for mysql
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test
# Set health checks to wait until mysql has started
options: >-
--health-cmd="${{ matrix.mariadb-healthcheck }}"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps tcp port 3306 on service container to the host
- 3306:3306
steps:
- uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
id: sp
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Install Emacs
if: ${{ github.event.inputs.debug == 'true' }}
run: |
sudo apt install emacs
- name: Setup tmate session
if: ${{ github.event.inputs.debug == 'true' }}
uses: mxschmitt/[email protected]
with:
detached: true
timeout-minutes: 60
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Upgrade all dependencies for our weekly runs
if: github.event_name == 'schedule'
run: uv lock --upgrade
- name: Setup Just
uses: extractions/setup-just@v3
- name: Install Release Dependencies
run: |
just setup ${{ steps.sp.outputs.python-path }}
if [[ "${{ matrix.django-version }}" =~ (a|b|rc) ]]; then
just test-lock Django==${{ matrix.django-version }}
else
just test-lock Django~=${{ matrix.django-version }}.0
fi
- name: Install mysqlclient if needed
if: ${{ matrix.mysqlclient-version != '' }}
run: just test-lock mysqlclient==${{ matrix.mysqlclient-version }}
- name: Run Unit Tests
run: |
just test-all mysql
- name: Store coverage files
uses: actions/upload-artifact@v5
with:
name: ${{ env.COVERAGE_FILE }}
path: ${{ env.COVERAGE_FILE }}
oracle:
runs-on: ubuntu-latest
permissions:
contents: read
actions: write
env:
RDBMS: oracle
TEST_PYTHON_VERSION: ${{ matrix.python-version }}
TEST_DJANGO_VERSION: ${{ matrix.django-version }}
TEST_DATABASE_VERSION: ${{ matrix.oracle-version }}
# oracle bug is encountered in Linux CI - does not manifest using same
# oracle DB containers on OSX
IGNORE_ORA_01843: True
IGNORE_ORA_00932: True
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.12', '3.14']
django-version:
- '4.2' # LTS April 2026
- '5.2' # LTS April 2028
- '6.0rc1' # April 2027
oracle-version:
- 'oracle-xe:21'
- 'oracle-free:latest'
exclude:
- python-version: '3.12'
django-version: '4.2'
- python-version: '3.14'
django-version: '4.2'
- python-version: '3.10'
django-version: '5.2'
- python-version: '3.14'
django-version: '5.2'
- python-version: '3.10'
django-version: '6.0rc1'
- python-version: '3.12'
django-version: '6.0rc1'
- django-version: '4.2'
oracle-version: 'oracle-free:latest'
- django-version: '5.2'
oracle-version: 'oracle-xe:21'
- django-version: '6.0rc1'
oracle-version: 'oracle-xe:21'
services:
oracle:
image: gvenzl/${{ matrix.oracle-version }}
env:
ORACLE_PASSWORD: password
# Forward Oracle port
ports:
- 1521:1521
# Provide healthcheck script options for startup
options: >-
--health-cmd healthcheck.sh
--health-interval 10s
--health-timeout 5s
--health-retries 10
steps:
- name: Set coverage file
run: |
ORACLE_TAG=$(echo "${{ matrix.oracle-version }}" | cut -d':' -f2)
echo "COVERAGE_FILE=linux-py${{ matrix.python-version }}-dj${{ matrix.django-version }}-oracle${ORACLE_TAG}.coverage" >> $GITHUB_ENV
if [[ "${{ matrix.django-version }}" == "4.2" ]]; then
echo "ORACLE_DATABASE=XEPDB1" >> $GITHUB_ENV
else
echo "ORACLE_DATABASE=FREEPDB1" >> $GITHUB_ENV
fi
- uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
id: sp
uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Install Emacs
if: ${{ github.event.inputs.debug == 'true' }}
run: |
sudo apt install emacs
- name: Setup tmate session
if: ${{ github.event.inputs.debug == 'true' }}
uses: mxschmitt/[email protected]
with:
detached: true
timeout-minutes: 60
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Upgrade all dependencies for our weekly runs
if: github.event_name == 'schedule'
run: uv lock --upgrade
- name: Setup Just
uses: extractions/setup-just@v3
- name: Install Oracle Client
# https://askubuntu.com/questions/1512196/libaio1-on-noble
run: |
sudo apt install alien libaio1t64
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1
if [[ "${{ matrix.django-version }}" == "4.2" ]]; then
curl --output oracle-client.rpm https://download.oracle.com/otn_software/linux/instantclient/2116000/oracle-instantclient-basiclite-21.16.0.0.0-1.el8.x86_64.rpm
sudo alien -i oracle-client.rpm
sudo sh -c "echo /usr/lib/oracle/21/client64/lib/ > /etc/ld.so.conf.d/oracle.conf"
else
curl --output oracle-client.rpm https://download.oracle.com/otn_software/linux/instantclient/2326000/oracle-instantclient-basiclite-23.26.0.0.0-1.el9.x86_64.rpm
sudo alien -i oracle-client.rpm
sudo sh -c "echo /usr/lib/oracle/23/client64/lib/ > /etc/ld.so.conf.d/oracle.conf"
fi
sudo ldconfig
- name: Install Release Dependencies
run: |
just setup ${{ steps.sp.outputs.python-path }}
if [[ "${{ matrix.django-version }}" =~ (a|b|rc) ]]; then
just test-lock Django==${{ matrix.django-version }}
else
just test-lock Django~=${{ matrix.django-version }}.0
fi
- name: Run Full Unit Tests
run: |
if [[ "${{ matrix.django-version }}" == "4.2" ]]; then
just test-all cx_oracle
else
just test-all oracledb
fi
- name: Store coverage files
uses: actions/upload-artifact@v5
with:
name: ${{ env.COVERAGE_FILE }}
path: ${{ env.COVERAGE_FILE }}
windows:
runs-on: windows-latest
permissions:
contents: read
actions: write
env:
RDBMS: sqlite
COVERAGE_FILE: windows-py${{ matrix.python-version }}-dj${{ matrix.django-version }}-sqlite.coverage
TEST_PYTHON_VERSION: ${{ matrix.python-version }}
TEST_DJANGO_VERSION: ${{ matrix.django-version }}
TEST_DATABASE_VERSION: "sqlite"
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.12', '3.14']
django-version:
- '4.2' # LTS April 2026
- '5.2' # LTS April 2028
- '6.0rc1' # April 2027
exclude:
- python-version: '3.12'
django-version: '4.2'
- python-version: '3.14'
django-version: '4.2'
- python-version: '3.10'
django-version: '5.2'
- python-version: '3.14'
django-version: '5.2'
- python-version: '3.10'
django-version: '6.0rc1'
- python-version: '3.12'
django-version: '6.0rc1'
steps:
- uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
id: sp
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Upgrade all dependencies for our weekly runs
if: github.event_name == 'schedule'
run: uv lock --upgrade
- name: Setup Just
uses: extractions/setup-just@v3
- name: Install Release Dependencies
run: |
just setup ${{ steps.sp.outputs.python-path }}
just install
$version = "${{ matrix.django-version }}"
if ($version -match "(a|b|rc)") {
just test-lock "Django==$version"
} else {
just test-lock "Django~=$version.0"
}
shell: pwsh
- name: install-vim-windows
if: ${{ github.event.inputs.debug == 'true' }}
uses: rhysd/action-setup-vim@v1
- name: Setup tmate session
if: ${{ github.event.inputs.debug == 'true' }}
uses: mxschmitt/[email protected]
with:
detached: true
timeout-minutes: 60
- name: Run Unit Tests
run: |
just test-all
- name: Store coverage files
uses: actions/upload-artifact@v5
with:
name: ${{ env.COVERAGE_FILE }}
path: ${{ env.COVERAGE_FILE }}
macos:
runs-on: macos-latest
permissions:
contents: read
actions: write
env:
RDBMS: sqlite
COVERAGE_FILE: macos-py${{ matrix.python-version }}-dj${{ matrix.django-version }}-sqlite.coverage
TEST_PYTHON_VERSION: ${{ matrix.python-version }}
TEST_DJANGO_VERSION: ${{ matrix.django-version }}
TEST_DATABASE_VERSION: "sqlite"
strategy:
fail-fast: false
matrix:
python-version: ['3.10', '3.12', '3.14']
django-version:
- '4.2' # LTS April 2024
- '5.2' # LTS April 2028
- '6.0rc1' # April 2027
exclude:
- python-version: '3.12'
django-version: '4.2'
- python-version: '3.14'
django-version: '4.2'
- python-version: '3.10'
django-version: '5.2'
- python-version: '3.14'
django-version: '5.2'
- python-version: '3.10'
django-version: '6.0rc1'
- python-version: '3.12'
django-version: '6.0rc1'
steps:
- uses: actions/checkout@v6
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
id: sp
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Upgrade all dependencies for our weekly runs
if: github.event_name == 'schedule'
run: uv lock --upgrade
- name: Setup Just
uses: extractions/setup-just@v3
- name: Install Release Dependencies
run: |
just setup ${{ steps.sp.outputs.python-path }}
just install
if [[ "${{ matrix.django-version }}" =~ (a|b|rc) ]]; then
just test-lock Django==${{ matrix.django-version }}
else
just test-lock Django~=${{ matrix.django-version }}.0
fi
- name: install-emacs-macos
if: ${{ github.event.inputs.debug == 'true' }}
run: |
brew install emacs
- name: Setup tmate session
if: ${{ github.event.inputs.debug == 'true' }}
uses: mxschmitt/[email protected]
with:
detached: true
timeout-minutes: 60
- name: Run Unit Tests
run: |
just test-all
- name: Store coverage files
uses: actions/upload-artifact@v5
with:
name: ${{ env.COVERAGE_FILE }}
path: ${{ env.COVERAGE_FILE }}
coverage-combine:
needs: [postgres, sqlite, mysql, mariadb, oracle, windows, macos]
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
id: sp
with:
python-version: '3.12'
- name: Install uv
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
- name: Upgrade all dependencies for our weekly runs
if: github.event_name == 'schedule'
run: uv lock --upgrade
- name: Setup Just
uses: extractions/setup-just@v3
- name: Install Release Dependencies
run: |
just setup ${{ steps.sp.outputs.python-path }}
just install
- name: Get coverage files
uses: actions/download-artifact@v6
with:
pattern: "*.coverage"
merge-multiple: true
- run: ls -la *.coverage
- run: just coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
files:
./coverage.xml