✨ translate SQLite defaults to MySQL #377
Workflow file for this run
This file contains hidden or 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: Test | |
on: | |
push: | |
branches: | |
- master | |
pull_request: | |
branches: | |
- master | |
workflow_call: | |
defaults: | |
run: | |
shell: bash | |
permissions: read-all | |
concurrency: | |
group: test-${{ github.ref }} | |
cancel-in-progress: true | |
jobs: | |
analyze: | |
name: "Analyze" | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v5 | |
- name: Set up Python | |
uses: actions/setup-python@v6 | |
with: | |
python-version: "3.x" | |
- name: Install dependencies | |
run: | | |
python3 -m pip install --upgrade pip | |
pip install -r requirements_dev.txt | |
- name: Run static analysis | |
run: tox -e linters | |
test: | |
needs: analyze | |
name: "Test" | |
runs-on: ubuntu-latest | |
strategy: | |
fail-fast: false | |
max-parallel: 8 | |
matrix: | |
include: | |
- toxenv: "python3.9" | |
db: "mariadb:5.5" | |
legacy_db: 1 | |
experimental: true | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mariadb:5.5" | |
legacy_db: 1 | |
experimental: true | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mariadb:5.5" | |
legacy_db: 1 | |
experimental: true | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mariadb:5.5" | |
legacy_db: 1 | |
experimental: true | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mariadb:5.5" | |
legacy_db: 1 | |
experimental: true | |
py: "3.13" | |
- toxenv: "python3.9" | |
db: "mariadb:10.0" | |
legacy_db: 1 | |
experimental: true | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mariadb:10.0" | |
legacy_db: 1 | |
experimental: true | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mariadb:10.0" | |
legacy_db: 1 | |
experimental: true | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mariadb:10.0" | |
legacy_db: 1 | |
experimental: true | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mariadb:10.0" | |
legacy_db: 1 | |
experimental: true | |
py: "3.13" | |
- toxenv: "python3.9" | |
db: "mariadb:10.6" | |
legacy_db: 0 | |
experimental: false | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mariadb:10.6" | |
legacy_db: 0 | |
experimental: false | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mariadb:10.6" | |
legacy_db: 0 | |
experimental: false | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mariadb:10.6" | |
legacy_db: 0 | |
experimental: false | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mariadb:10.6" | |
legacy_db: 0 | |
experimental: false | |
py: "3.13" | |
- toxenv: "python3.9" | |
db: "mariadb:10.11" | |
legacy_db: 0 | |
experimental: false | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mariadb:10.11" | |
legacy_db: 0 | |
experimental: false | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mariadb:10.11" | |
legacy_db: 0 | |
experimental: false | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mariadb:10.11" | |
legacy_db: 0 | |
experimental: false | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mariadb:10.11" | |
legacy_db: 0 | |
experimental: false | |
py: "3.13" | |
- toxenv: "python3.9" | |
db: "mariadb:11.4" | |
legacy_db: 0 | |
experimental: false | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mariadb:11.4" | |
legacy_db: 0 | |
experimental: false | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mariadb:11.4" | |
legacy_db: 0 | |
experimental: false | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mariadb:11.4" | |
legacy_db: 0 | |
experimental: false | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mariadb:11.4" | |
legacy_db: 0 | |
experimental: false | |
py: "3.13" | |
- toxenv: "python3.9" | |
db: "mariadb:11.8" | |
legacy_db: 0 | |
experimental: false | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mariadb:11.8" | |
legacy_db: 0 | |
experimental: false | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mariadb:11.8" | |
legacy_db: 0 | |
experimental: false | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mariadb:11.8" | |
legacy_db: 0 | |
experimental: false | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mariadb:11.8" | |
legacy_db: 0 | |
experimental: false | |
py: "3.13" | |
- toxenv: "python3.9" | |
db: "mysql:5.5" | |
legacy_db: 1 | |
experimental: true | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mysql:5.5" | |
legacy_db: 1 | |
experimental: true | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mysql:5.5" | |
legacy_db: 1 | |
experimental: true | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mysql:5.5" | |
legacy_db: 1 | |
experimental: true | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mysql:5.5" | |
legacy_db: 1 | |
experimental: true | |
py: "3.13" | |
- toxenv: "python3.9" | |
db: "mysql:5.6" | |
legacy_db: 1 | |
experimental: true | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mysql:5.6" | |
legacy_db: 1 | |
experimental: true | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mysql:5.6" | |
legacy_db: 1 | |
experimental: true | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mysql:5.6" | |
legacy_db: 1 | |
experimental: true | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mysql:5.6" | |
legacy_db: 1 | |
experimental: true | |
py: "3.13" | |
- toxenv: "python3.9" | |
db: "mysql:5.7" | |
legacy_db: 0 | |
experimental: true | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mysql:5.7" | |
legacy_db: 0 | |
experimental: true | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mysql:5.7" | |
legacy_db: 0 | |
experimental: true | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mysql:5.7" | |
legacy_db: 0 | |
experimental: true | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mysql:5.7" | |
legacy_db: 0 | |
experimental: true | |
py: "3.13" | |
- toxenv: "python3.9" | |
db: "mysql:8.0" | |
legacy_db: 0 | |
experimental: false | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mysql:8.0" | |
legacy_db: 0 | |
experimental: false | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mysql:8.0" | |
legacy_db: 0 | |
experimental: false | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mysql:8.0" | |
legacy_db: 0 | |
experimental: false | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mysql:8.0" | |
legacy_db: 0 | |
experimental: false | |
py: "3.13" | |
- toxenv: "python3.9" | |
db: "mysql:8.4" | |
legacy_db: 0 | |
experimental: true | |
py: "3.9" | |
- toxenv: "python3.10" | |
db: "mysql:8.4" | |
legacy_db: 0 | |
experimental: true | |
py: "3.10" | |
- toxenv: "python3.11" | |
db: "mysql:8.4" | |
legacy_db: 0 | |
experimental: true | |
py: "3.11" | |
- toxenv: "python3.12" | |
db: "mysql:8.4" | |
legacy_db: 0 | |
experimental: true | |
py: "3.12" | |
- toxenv: "python3.13" | |
db: "mysql:8.4" | |
legacy_db: 0 | |
experimental: true | |
py: "3.13" | |
continue-on-error: ${{ matrix.experimental }} | |
services: | |
mysql: | |
image: ${{ matrix.db }} | |
ports: | |
- 3306:3306 | |
env: | |
MYSQL_ALLOW_EMPTY_PASSWORD: yes | |
MARIADB_ALLOW_EMPTY_ROOT_PASSWORD: yes | |
options: >- | |
--name=mysqld | |
--health-start-period=60s | |
--health-cmd="command -v healthcheck.sh >/dev/null 2>&1 && healthcheck.sh --connect --innodb_initialized || mysqladmin ping -h 127.0.0.1 --silent" | |
--health-interval=10s | |
--health-timeout=5s | |
--health-retries=30 | |
steps: | |
- uses: actions/checkout@v5 | |
- name: Set up Python ${{ matrix.py }} | |
uses: actions/setup-python@v6 | |
with: | |
python-version: ${{ matrix.py }} | |
cache: "pip" | |
cache-dependency-path: requirements_dev.txt | |
- name: Install dependencies | |
run: | | |
python -m pip install --upgrade pip | |
python -m pip install -U tox-gh-actions | |
pip install -r requirements_dev.txt | |
- name: Install MySQL client | |
run: | | |
set -e | |
sudo apt-get update | |
sudo apt-get install -y mysql-client | |
- name: Set up MySQL | |
env: | |
DB: ${{ matrix.db }} | |
MYSQL_USER: tester | |
MYSQL_PASSWORD: testpass | |
MYSQL_DATABASE: test_db | |
MYSQL_HOST: 0.0.0.0 | |
MYSQL_PORT: 3306 | |
run: | | |
set -e | |
case "$DB" in | |
'mysql:8.0'|'mysql:8.4') | |
mysql -h127.0.0.1 -uroot -e "SET GLOBAL local_infile=on" | |
docker cp mysqld:/var/lib/mysql/public_key.pem "${HOME}" | |
docker cp mysqld:/var/lib/mysql/ca.pem "${HOME}" | |
docker cp mysqld:/var/lib/mysql/server-cert.pem "${HOME}" | |
docker cp mysqld:/var/lib/mysql/client-key.pem "${HOME}" | |
docker cp mysqld:/var/lib/mysql/client-cert.pem "${HOME}" | |
;; | |
esac | |
USER_CREATION_COMMANDS='' | |
WITH_PLUGIN='' | |
if [ "$DB" == 'mysql:8.0' ]; then | |
WITH_PLUGIN='with mysql_native_password' | |
USER_CREATION_COMMANDS=' | |
CREATE USER | |
user_sha256 IDENTIFIED WITH "sha256_password" BY "pass_sha256", | |
nopass_sha256 IDENTIFIED WITH "sha256_password", | |
user_caching_sha2 IDENTIFIED WITH "caching_sha2_password" BY "pass_caching_sha2", | |
nopass_caching_sha2 IDENTIFIED WITH "caching_sha2_password" | |
PASSWORD EXPIRE NEVER; | |
GRANT RELOAD ON *.* TO user_caching_sha2;' | |
elif [ "$DB" == 'mysql:8.4' ]; then | |
WITH_PLUGIN='with caching_sha2_password' | |
USER_CREATION_COMMANDS=' | |
CREATE USER | |
user_caching_sha2 IDENTIFIED WITH "caching_sha2_password" BY "pass_caching_sha2", | |
nopass_caching_sha2 IDENTIFIED WITH "caching_sha2_password" | |
PASSWORD EXPIRE NEVER; | |
GRANT RELOAD ON *.* TO user_caching_sha2;' | |
fi | |
if [ ! -z "$USER_CREATION_COMMANDS" ]; then | |
mysql -uroot -h127.0.0.1 -e "$USER_CREATION_COMMANDS" | |
fi | |
mysql -h127.0.0.1 -uroot -e "create database $MYSQL_DATABASE DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" | |
mysql -h127.0.0.1 -uroot -e "create user $MYSQL_USER identified $WITH_PLUGIN by '${MYSQL_PASSWORD}'; grant all on ${MYSQL_DATABASE}.* to ${MYSQL_USER};" | |
mysql -h127.0.0.1 -uroot -e "create user ${MYSQL_USER}@localhost identified $WITH_PLUGIN by '${MYSQL_PASSWORD}'; grant all on ${MYSQL_DATABASE}.* to ${MYSQL_USER}@localhost;" | |
- name: Create db_credentials.json | |
env: | |
MYSQL_USER: tester | |
MYSQL_PASSWORD: testpass | |
MYSQL_DATABASE: test_db | |
MYSQL_HOST: 0.0.0.0 | |
MYSQL_PORT: 3306 | |
run: | | |
set -e | |
jq -n \ | |
--arg mysql_user "$MYSQL_USER" \ | |
--arg mysql_password "$MYSQL_PASSWORD" \ | |
--arg mysql_database "$MYSQL_DATABASE" \ | |
--arg mysql_host "$MYSQL_HOST" \ | |
--arg mysql_port $MYSQL_PORT \ | |
'$ARGS.named' > tests/db_credentials.json | |
- name: Test with tox | |
env: | |
LEGACY_DB: ${{ matrix.legacy_db }} | |
TOXENV: ${{ matrix.toxenv }} | |
run: tox | |
- name: Upload coverage to Codecov | |
env: | |
OS: ubuntu-latest | |
PYTHON: ${{ matrix.py }} | |
uses: codecov/codecov-action@v5 | |
continue-on-error: true | |
with: | |
token: ${{ secrets.CODECOV_TOKEN }} | |
slug: techouse/sqlite3-to-mysql | |
files: ./coverage.xml | |
env_vars: OS,PYTHON | |
verbose: true | |
- name: Cleanup | |
if: ${{ always() }} | |
run: | | |
rm -rf tests/db_credentials.json |