diff --git a/.github/workflows/CI-3p-aiomysql.yml b/.github/workflows/CI-3p-aiomysql.yml index 71a97c444..f0f31b255 100644 --- a/.github/workflows/CI-3p-aiomysql.yml +++ b/.github/workflows/CI-3p-aiomysql.yml @@ -9,7 +9,7 @@ on: default: main type: string workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-3p-django-framework.yml b/.github/workflows/CI-3p-django-framework.yml index 56407b2ff..70706e52f 100644 --- a/.github/workflows/CI-3p-django-framework.yml +++ b/.github/workflows/CI-3p-django-framework.yml @@ -9,7 +9,7 @@ on: default: main type: string workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-3p-laravel-framework.yml b/.github/workflows/CI-3p-laravel-framework.yml index e37794ebd..aa6c20aba 100644 --- a/.github/workflows/CI-3p-laravel-framework.yml +++ b/.github/workflows/CI-3p-laravel-framework.yml @@ -9,7 +9,7 @@ on: default: main type: string workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-3p-mariadb-connector-c.yml b/.github/workflows/CI-3p-mariadb-connector-c.yml index bf0e2fa30..dce7207e8 100644 --- a/.github/workflows/CI-3p-mariadb-connector-c.yml +++ b/.github/workflows/CI-3p-mariadb-connector-c.yml @@ -9,7 +9,7 @@ on: default: main type: string workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-3p-mysql-connector-j.yml b/.github/workflows/CI-3p-mysql-connector-j.yml index c388fd8a1..1fd7a3fd0 100644 --- a/.github/workflows/CI-3p-mysql-connector-j.yml +++ b/.github/workflows/CI-3p-mysql-connector-j.yml @@ -9,7 +9,7 @@ on: default: main type: string workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-3p-pgjdbc.yml b/.github/workflows/CI-3p-pgjdbc.yml index d49aacee4..88ab9ecb8 100644 --- a/.github/workflows/CI-3p-pgjdbc.yml +++ b/.github/workflows/CI-3p-pgjdbc.yml @@ -9,7 +9,7 @@ on: default: main type: string workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-3p-php-pdo-mysql.yml b/.github/workflows/CI-3p-php-pdo-mysql.yml index 2fe4a2ca4..ff74813fd 100644 --- a/.github/workflows/CI-3p-php-pdo-mysql.yml +++ b/.github/workflows/CI-3p-php-pdo-mysql.yml @@ -9,7 +9,7 @@ on: default: main type: string workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-3p-php-pdo-pgsql.yml b/.github/workflows/CI-3p-php-pdo-pgsql.yml index 241223971..781eabae2 100644 --- a/.github/workflows/CI-3p-php-pdo-pgsql.yml +++ b/.github/workflows/CI-3p-php-pdo-pgsql.yml @@ -9,7 +9,7 @@ on: default: main type: string workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-3p-postgresql.yml b/.github/workflows/CI-3p-postgresql.yml index ae2957518..6331d96a6 100644 --- a/.github/workflows/CI-3p-postgresql.yml +++ b/.github/workflows/CI-3p-postgresql.yml @@ -9,7 +9,7 @@ on: default: main type: string workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-3p-sqlalchemy.yml b/.github/workflows/CI-3p-sqlalchemy.yml index c387258f1..87fb81374 100644 --- a/.github/workflows/CI-3p-sqlalchemy.yml +++ b/.github/workflows/CI-3p-sqlalchemy.yml @@ -9,7 +9,7 @@ on: default: main type: string workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-basictests.yml b/.github/workflows/CI-basictests.yml index 22f9f8431..ce1f2577d 100644 --- a/.github/workflows/CI-basictests.yml +++ b/.github/workflows/CI-basictests.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-legacy-clickhouse-g1.yml b/.github/workflows/CI-legacy-clickhouse-g1.yml index 84ebbfe1e..7e06af220 100644 --- a/.github/workflows/CI-legacy-clickhouse-g1.yml +++ b/.github/workflows/CI-legacy-clickhouse-g1.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-legacy-g1.yml b/.github/workflows/CI-legacy-g1.yml new file mode 100644 index 000000000..eecfbc9a5 --- /dev/null +++ b/.github/workflows/CI-legacy-g1.yml @@ -0,0 +1,21 @@ +name: CI-legacy-g1 +run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} ${{ github.workflow }} ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }}' + +on: + workflow_dispatch: + workflow_run: + workflows: [ CI-builds ] + types: [ completed ] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} + cancel-in-progress: true + +jobs: + run: + if: ${{ github.event.workflow_run && github.event.workflow_run.conclusion == 'success' || ! github.event.workflow_run }} + uses: sysown/proxysql/.github/workflows/ci-taptests-groups.yml@GH-Actions + secrets: inherit + with: + trigger: ${{ toJson(github) }} + testgroup: '["legacy-g1"]' diff --git a/.github/workflows/CI-legacy-g2-genai.yml b/.github/workflows/CI-legacy-g2-genai.yml index 51fb402b3..d71e01c9d 100644 --- a/.github/workflows/CI-legacy-g2-genai.yml +++ b/.github/workflows/CI-legacy-g2-genai.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-legacy-g2.yml b/.github/workflows/CI-legacy-g2.yml index 3fc205601..4310e0b0f 100644 --- a/.github/workflows/CI-legacy-g2.yml +++ b/.github/workflows/CI-legacy-g2.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-legacy-g3.yml b/.github/workflows/CI-legacy-g3.yml new file mode 100644 index 000000000..400bff451 --- /dev/null +++ b/.github/workflows/CI-legacy-g3.yml @@ -0,0 +1,21 @@ +name: CI-legacy-g3 +run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} ${{ github.workflow }} ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }}' + +on: + workflow_dispatch: + workflow_run: + workflows: [ CI-builds ] + types: [ completed ] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} + cancel-in-progress: true + +jobs: + run: + if: ${{ github.event.workflow_run && github.event.workflow_run.conclusion == 'success' || ! github.event.workflow_run }} + uses: sysown/proxysql/.github/workflows/ci-taptests-groups.yml@GH-Actions + secrets: inherit + with: + trigger: ${{ toJson(github) }} + testgroup: '["legacy-g3"]' diff --git a/.github/workflows/CI-legacy-g4.yml b/.github/workflows/CI-legacy-g4.yml index 37ce6ded2..5c7880059 100644 --- a/.github/workflows/CI-legacy-g4.yml +++ b/.github/workflows/CI-legacy-g4.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-legacy-g5.yml b/.github/workflows/CI-legacy-g5.yml new file mode 100644 index 000000000..09927b4cc --- /dev/null +++ b/.github/workflows/CI-legacy-g5.yml @@ -0,0 +1,21 @@ +name: CI-legacy-g5 +run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} ${{ github.workflow }} ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }}' + +on: + workflow_dispatch: + workflow_run: + workflows: [ CI-builds ] + types: [ completed ] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} + cancel-in-progress: true + +jobs: + run: + if: ${{ github.event.workflow_run && github.event.workflow_run.conclusion == 'success' || ! github.event.workflow_run }} + uses: sysown/proxysql/.github/workflows/ci-taptests-groups.yml@GH-Actions + secrets: inherit + with: + trigger: ${{ toJson(github) }} + testgroup: '["legacy-g5"]' diff --git a/.github/workflows/CI-lint-groups-json.yml b/.github/workflows/CI-lint-groups-json.yml new file mode 100644 index 000000000..f3c49d351 --- /dev/null +++ b/.github/workflows/CI-lint-groups-json.yml @@ -0,0 +1,17 @@ +name: CI-lint-groups-json + +on: + pull_request: + paths: + - 'test/tap/groups/groups.json' + push: + paths: + - 'test/tap/groups/groups.json' + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Lint groups.json format + run: python3 test/tap/groups/lint_groups_json.py diff --git a/.github/workflows/CI-maketest.yml b/.github/workflows/CI-maketest.yml index ce2cf6d48..151be6db9 100644 --- a/.github/workflows/CI-maketest.yml +++ b/.github/workflows/CI-maketest.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-mysql84-g1.yml b/.github/workflows/CI-mysql84-g1.yml new file mode 100644 index 000000000..1c26dbf7b --- /dev/null +++ b/.github/workflows/CI-mysql84-g1.yml @@ -0,0 +1,21 @@ +name: CI-mysql84-g1 +run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} ${{ github.workflow }} ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }}' + +on: + workflow_dispatch: + workflow_run: + workflows: [ CI-builds ] + types: [ completed ] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} + cancel-in-progress: true + +jobs: + run: + if: ${{ github.event.workflow_run && github.event.workflow_run.conclusion == 'success' || ! github.event.workflow_run }} + uses: sysown/proxysql/.github/workflows/ci-taptests-groups.yml@GH-Actions + secrets: inherit + with: + trigger: ${{ toJson(github) }} + testgroup: '["mysql84-g1"]' diff --git a/.github/workflows/CI-mysql84-g2.yml b/.github/workflows/CI-mysql84-g2.yml new file mode 100644 index 000000000..d97a40be1 --- /dev/null +++ b/.github/workflows/CI-mysql84-g2.yml @@ -0,0 +1,21 @@ +name: CI-mysql84-g2 +run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} ${{ github.workflow }} ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }}' + +on: + workflow_dispatch: + workflow_run: + workflows: [ CI-builds ] + types: [ completed ] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} + cancel-in-progress: true + +jobs: + run: + if: ${{ github.event.workflow_run && github.event.workflow_run.conclusion == 'success' || ! github.event.workflow_run }} + uses: sysown/proxysql/.github/workflows/ci-taptests-groups.yml@GH-Actions + secrets: inherit + with: + trigger: ${{ toJson(github) }} + testgroup: '["mysql84-g2"]' diff --git a/.github/workflows/CI-mysql84-g3.yml b/.github/workflows/CI-mysql84-g3.yml new file mode 100644 index 000000000..de6983514 --- /dev/null +++ b/.github/workflows/CI-mysql84-g3.yml @@ -0,0 +1,21 @@ +name: CI-mysql84-g3 +run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} ${{ github.workflow }} ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }}' + +on: + workflow_dispatch: + workflow_run: + workflows: [ CI-builds ] + types: [ completed ] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} + cancel-in-progress: true + +jobs: + run: + if: ${{ github.event.workflow_run && github.event.workflow_run.conclusion == 'success' || ! github.event.workflow_run }} + uses: sysown/proxysql/.github/workflows/ci-taptests-groups.yml@GH-Actions + secrets: inherit + with: + trigger: ${{ toJson(github) }} + testgroup: '["mysql84-g3"]' diff --git a/.github/workflows/CI-mysql84-g4.yml b/.github/workflows/CI-mysql84-g4.yml new file mode 100644 index 000000000..c8c869852 --- /dev/null +++ b/.github/workflows/CI-mysql84-g4.yml @@ -0,0 +1,21 @@ +name: CI-mysql84-g4 +run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} ${{ github.workflow }} ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }}' + +on: + workflow_dispatch: + workflow_run: + workflows: [ CI-builds ] + types: [ completed ] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} + cancel-in-progress: true + +jobs: + run: + if: ${{ github.event.workflow_run && github.event.workflow_run.conclusion == 'success' || ! github.event.workflow_run }} + uses: sysown/proxysql/.github/workflows/ci-taptests-groups.yml@GH-Actions + secrets: inherit + with: + trigger: ${{ toJson(github) }} + testgroup: '["mysql84-g4"]' diff --git a/.github/workflows/CI-mysql84-g5.yml b/.github/workflows/CI-mysql84-g5.yml new file mode 100644 index 000000000..7b8c40b08 --- /dev/null +++ b/.github/workflows/CI-mysql84-g5.yml @@ -0,0 +1,21 @@ +name: CI-mysql84-g5 +run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} ${{ github.workflow }} ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }}' + +on: + workflow_dispatch: + workflow_run: + workflows: [ CI-builds ] + types: [ completed ] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} + cancel-in-progress: true + +jobs: + run: + if: ${{ github.event.workflow_run && github.event.workflow_run.conclusion == 'success' || ! github.event.workflow_run }} + uses: sysown/proxysql/.github/workflows/ci-taptests-groups.yml@GH-Actions + secrets: inherit + with: + trigger: ${{ toJson(github) }} + testgroup: '["mysql84-g5"]' diff --git a/.github/workflows/CI-repltests.yml b/.github/workflows/CI-repltests.yml index f2beac23a..49e1577f6 100644 --- a/.github/workflows/CI-repltests.yml +++ b/.github/workflows/CI-repltests.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-selftests.yml b/.github/workflows/CI-selftests.yml index 7511805c3..3a0ea7fd7 100644 --- a/.github/workflows/CI-selftests.yml +++ b/.github/workflows/CI-selftests.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-shuntest.yml b/.github/workflows/CI-shuntest.yml index 59b59b659..89c326f64 100644 --- a/.github/workflows/CI-shuntest.yml +++ b/.github/workflows/CI-shuntest.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-taptests-asan.yml b/.github/workflows/CI-taptests-asan.yml index 42ef9b6db..49902d1bb 100644 --- a/.github/workflows/CI-taptests-asan.yml +++ b/.github/workflows/CI-taptests-asan.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-taptests-groups.yml b/.github/workflows/CI-taptests-groups.yml index 01f8ea76f..0bd1a1dfe 100644 --- a/.github/workflows/CI-taptests-groups.yml +++ b/.github/workflows/CI-taptests-groups.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-taptests-pgsql-cluster.yml b/.github/workflows/CI-taptests-pgsql-cluster.yml new file mode 100644 index 000000000..d995ce8e1 --- /dev/null +++ b/.github/workflows/CI-taptests-pgsql-cluster.yml @@ -0,0 +1,93 @@ +name: CI-taptests-pgsql-cluster +run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} ${{ github.workflow }} ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }}' + +on: + workflow_dispatch: + workflow_run: + workflows: [ CI-builds ] + types: [ completed ] + +concurrency: + group: ${{ github.workflow }}-${{ github.event.workflow_run && github.event.workflow_run.head_branch || github.ref_name }} + cancel-in-progress: true + +env: + SHA: ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }} + +jobs: + tests: + runs-on: ubuntu-22.04 + if: ${{ github.event.workflow_run && github.event.workflow_run.conclusion == 'success' || ! github.event.workflow_run }} + strategy: + fail-fast: false + matrix: + testdist: [ 'ubuntu22-tap' ] + env: + TESTDIST: ${{ matrix.testdist }} + BLDCACHE: ${{ github.event.workflow_run && github.event.workflow_run.head_sha || github.sha }}_${{ matrix.testdist }} + + steps: + + - name: Checkout + uses: actions/checkout@v4 + + - name: Cache restore src + id: cache-src + uses: actions/cache/restore@v4 + with: + key: ${{ env.BLDCACHE }}_src + fail-on-cache-miss: true + path: | + src/ + + - name: Cache restore test + id: cache-test + uses: actions/cache/restore@v4 + with: + key: ${{ env.BLDCACHE }}_test + fail-on-cache-miss: true + path: | + test/ + + - name: Build CI base image + run: | + cd test/infra/docker-base + docker build --network host -t proxysql-ci-base:latest . + + - name: Start infrastructure + run: | + export WORKSPACE="${GITHUB_WORKSPACE}" + export INFRA_ID="pgsql-cluster-${GITHUB_RUN_ID}" + export TAP_GROUP="legacy-g3" + export TEST_PY_TAP_INCL="test_cluster_sync_pgsql-t" + export PROXYSQL_CLUSTER_NODES=2 + source test/infra/common/env.sh + ./test/infra/control/ensure-infras.bash + + - name: Run test_cluster_sync_pgsql-t + run: | + export WORKSPACE="${GITHUB_WORKSPACE}" + export INFRA_ID="pgsql-cluster-${GITHUB_RUN_ID}" + export TAP_GROUP="legacy-g3" + export TEST_PY_TAP_INCL="test_cluster_sync_pgsql-t" + export PROXYSQL_CLUSTER_NODES=2 + source test/infra/common/env.sh + ./test/infra/control/run-tests-isolated.bash + + - name: Cleanup + if: always() + run: | + export WORKSPACE="${GITHUB_WORKSPACE}" + export INFRA_ID="pgsql-cluster-${GITHUB_RUN_ID}" + export TAP_GROUP="legacy-g3" + source test/infra/common/env.sh + ./test/infra/control/stop-proxysql-isolated.bash || true + ./test/infra/control/destroy-infras.bash || true + + - name: Archive logs + if: ${{ failure() && !cancelled() }} + uses: actions/upload-artifact@v4 + with: + name: ${{ github.workflow }}-${{ env.SHA }}-logs-run${{ github.run_number }} + path: | + ci_infra_logs/ diff --git a/.github/workflows/CI-taptests-ssl.yml b/.github/workflows/CI-taptests-ssl.yml index e4f7a9257..be0efa365 100644 --- a/.github/workflows/CI-taptests-ssl.yml +++ b/.github/workflows/CI-taptests-ssl.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/.github/workflows/CI-taptests.yml b/.github/workflows/CI-taptests.yml index 73b236ad7..734fbf8e3 100644 --- a/.github/workflows/CI-taptests.yml +++ b/.github/workflows/CI-taptests.yml @@ -4,7 +4,7 @@ run-name: '${{ github.event.workflow_run && github.event.workflow_run.head_branc on: workflow_dispatch: workflow_run: - workflows: [ CI-trigger ] + workflows: [ CI-builds ] types: [ completed ] concurrency: diff --git a/Makefile b/Makefile index fc9d52af4..7b916f99b 100644 --- a/Makefile +++ b/Makefile @@ -72,13 +72,13 @@ endif export GIT_VERSION # Extract CURVER from GIT_VERSION (first 3 numbers, e.g., 3.0.6 from 3.0.6-388-ga94b7d6) -CURVER := $(shell echo "$(GIT_VERSION)" | sed -nE 's/^([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' | head -1) +CURVER := $(shell echo "$(GIT_VERSION)" | sed -nE 's/^v?([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' | head -1) # Validate CURVER has 3 numbers separated by dots CURVER_CHECK := $(shell echo "$(CURVER)" | grep -cE '^[0-9]+\.[0-9]+\.[0-9]+$$') ifeq ($(CURVER_CHECK),0) - $(error CURVER "$(CURVER)" derived from GIT_VERSION "$(GIT_VERSION)" does not have 3 numbers separated by dots (expected format: X.Y.Z) + $(error CURVER "$(CURVER)" derived from GIT_VERSION "$(GIT_VERSION)" does not have 3 numbers separated by dots. Expected format: X.Y.Z) endif export CURVER diff --git a/test/infra/control/env-isolated.bash b/test/infra/control/env-isolated.bash index d1883c5d8..445191241 100755 --- a/test/infra/control/env-isolated.bash +++ b/test/infra/control/env-isolated.bash @@ -108,6 +108,11 @@ export TEST_PY_TAP_DUMP_RUNTIME="${TEST_PY_TAP_DUMP_RUNTIME:-1}" export TEST_PY_TAP_DUMP_STATS="${TEST_PY_TAP_DUMP_STATS:-1}" export TEST_TAP_TIMEOUT="${TEST_TAP_TIMEOUT:-0}" +# Cluster sync test support — expose first cluster node admin port for replica validation +if [ "${NUM_CLUSTER_NODES}" -gt 0 ]; then + export TAP_PGSQL_SYNC_REPLICA_PORT="${TAP_PGSQL_SYNC_REPLICA_PORT:-6042}" +fi + # Noise injection for race condition testing # When enabled, tests that support noise injection will introduce random delays # and stress to help detect race conditions and deadlocks diff --git a/test/infra/control/run-tests-isolated.bash b/test/infra/control/run-tests-isolated.bash index aa3e87efb..c87a11e3e 100755 --- a/test/infra/control/run-tests-isolated.bash +++ b/test/infra/control/run-tests-isolated.bash @@ -234,6 +234,7 @@ BINLOG_READER_BIN=$(find "${WORKSPACE}" -path "${WORKSPACE}/ci_infra_logs" -prun # Execution: run the container docker run \ --name "${TEST_CONTAINER}" \ + --hostname "test-runner" \ --network "${NETWORK_NAME}" \ --cap-add=NET_ADMIN \ --cap-add=SYS_ADMIN \ @@ -256,6 +257,7 @@ docker run \ -e MYSQL_BINLOG_BIN="${MYSQL_BINLOG_BIN}" \ -e BINLOG_READER_BIN="${BINLOG_READER_BIN}" \ -e TAP_USE_NOISE="${TAP_USE_NOISE:-0}" \ + -e TAP_PGSQL_SYNC_REPLICA_PORT="${TAP_PGSQL_SYNC_REPLICA_PORT:-}" \ -e MULTI_GROUP="${MULTI_GROUP:-0}" \ -e GCOV_PREFIX="/gcov/tap" \ -e GCOV_PREFIX_STRIP="3" \ diff --git a/test/tap/groups/groups.json b/test/tap/groups/groups.json index eb986f730..f79d55cab 100644 --- a/test/tap/groups/groups.json +++ b/test/tap/groups/groups.json @@ -188,14 +188,9 @@ "reg_test_3434-text_stmt_mix-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], "reg_test_3493-USE_with_comment-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], "reg_test_3504-change_user-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], - "reg_test_handshake_response_unterminated_username-t" : [ "mysql84-g1" ], - "reg_test_com_change_user_malformed_packet-t" : [ "mysql84-g1" ], "reg_test_3546-stmt_empty_params-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], "reg_test_3549-autocommit_tracking-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], - "reg_test_proxy_protocol_oversized_address-t" : [ "mysql84-g1" ], "reg_test_3585-stmt_metadata-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], - "reg_test_stmt_send_long_data_short_packet-t" : [ "mysql84-g1" ], - "reg_test_stmt_close_short_packet-t" : [ "mysql84-g1" ], "reg_test_3591-restapi_num_fds-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], "reg_test_3603-stmt_metadata-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], "reg_test_3606-mysql_warnings-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], @@ -223,18 +218,23 @@ "reg_test_5306-show_warnings_with_comment-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2" ], "reg_test_5389-flush_logs_no_drop-t" : [ "legacy-g4","mysql84-g4" ], "reg_test__ssl_client_busy_wait-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], + "reg_test_com_change_user_malformed_packet-t" : [ "mysql84-g1" ], "reg_test_compression_split_packets-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], "reg_test_fast_forward_split_packet-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], + "reg_test_handshake_response_unterminated_username-t" : [ "mysql84-g1" ], "reg_test_mariadb_metadata_check-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], "reg_test_mariadb_stmt_store_result-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], "reg_test_mariadb_stmt_store_result_async-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], "reg_test_mariadb_stmt_store_result_libmysql-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], "reg_test_proclist_use_after_free-t" : [ "legacy-g1","mysql84-g1","mysql-auto_increment_delay_multiplex=0-g1","mysql-multiplexing=false-g1","mysql-query_digests=0-g1","mysql-query_digests_keep_comment=1-g1" ], + "reg_test_proxy_protocol_oversized_address-t" : [ "mysql84-g1" ], "reg_test_sql_calc_found_rows-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], + "reg_test_stmt_close_short_packet-t" : [ "mysql84-g1" ], "reg_test_stmt_inv_param_offset-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], "reg_test_stmt_resultset_err_no_rows-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], "reg_test_stmt_resultset_err_no_rows_libmysql-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], "reg_test_stmt_resultset_err_no_rows_php-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], + "reg_test_stmt_send_long_data_short_packet-t" : [ "mysql84-g1" ], "reg_test_unexp_ping_pkt-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], "rule_matching_unit-t" : [ "unit-tests-g1" ], "savepoint-3749-t" : [ "legacy-g2","mysql84-g2","mysql-auto_increment_delay_multiplex=0-g2","mysql-multiplexing=false-g2","mysql-query_digests=0-g2","mysql-query_digests_keep_comment=1-g2" ], @@ -270,6 +270,7 @@ "test_cluster1-t" : [ "legacy-g3","mysql-auto_increment_delay_multiplex=0-g3","mysql-multiplexing=false-g3","mysql-query_digests=0-g3","mysql-query_digests_keep_comment=1-g3" ], "test_cluster_sync-t" : [ "legacy-g5","mysql-auto_increment_delay_multiplex=0-g3","mysql-multiplexing=false-g3","mysql-query_digests=0-g3","mysql-query_digests_keep_comment=1-g3" ], "test_cluster_sync_mysql_servers-t" : [ "legacy-g5","mysql-auto_increment_delay_multiplex=0-g3","mysql-multiplexing=false-g3","mysql-query_digests=0-g3","mysql-query_digests_keep_comment=1-g3" ], + "test_cluster_sync_pgsql-t" : [ "legacy-g3","mysql-auto_increment_delay_multiplex=0-g3","mysql-multiplexing=false-g3","mysql-query_digests=0-g3","mysql-query_digests_keep_comment=1-g3" ], "test_com_binlog_dump_enables_fast_forward-t" : [ "legacy-binlog-g1" ], "test_com_register_slave_enables_fast_forward-t" : [ "legacy-g3","mysql84-g3","mysql-auto_increment_delay_multiplex=0-g3","mysql-multiplexing=false-g3","mysql-query_digests=0-g3","mysql-query_digests_keep_comment=1-g3" ], "test_com_reset_connection_com_change_user-t" : [ "legacy-g3","mysql84-g3","mysql-auto_increment_delay_multiplex=0-g3","mysql-multiplexing=false-g3","mysql-query_digests=0-g3","mysql-query_digests_keep_comment=1-g3" ], diff --git a/test/tap/groups/lint_groups_json.py b/test/tap/groups/lint_groups_json.py new file mode 100755 index 000000000..44bcd4342 --- /dev/null +++ b/test/tap/groups/lint_groups_json.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +""" +Lint groups.json for format compliance. + +Enforces the conventions documented in test/tap/groups/README.md: + - Valid JSON + - One entry per line, compact arrays (no multi-line) + - Format: ' "test-name-t" : [ "group1","group2" ],' (or no comma for last) + - Keys sorted alphabetically + - File starts with '{' and ends with '}' + +Exit codes: + 0 - Format is correct + 1 - Format violations found +""" + +import json +import os +import re +import sys + + +def main(): + groups_path = os.path.join(os.path.dirname(__file__), "groups.json") + if len(sys.argv) > 1: + groups_path = sys.argv[1] + + if not os.path.isfile(groups_path): + print(f"ERROR: {groups_path} not found", file=sys.stderr) + return 1 + + with open(groups_path, "r") as f: + raw = f.read() + + lines = raw.split("\n") + errors = [] + + # Check 1: valid JSON + try: + data = json.loads(raw) + except json.JSONDecodeError as e: + errors.append(f"Invalid JSON: {e}") + # Can't do further checks + for e in errors: + print(f"ERROR: {e}", file=sys.stderr) + return 1 + + if not isinstance(data, dict): + errors.append("Top-level value must be a JSON object") + for e in errors: + print(f"ERROR: {e}", file=sys.stderr) + return 1 + + # Check 2: first and last lines + if not lines or lines[0].strip() != "{": + errors.append("Line 1: must be '{'") + if lines[-1].strip() == "": + # Allow trailing newline — check second-to-last + if len(lines) < 2 or lines[-2].strip() != "}": + errors.append(f"Last non-empty line: must be '}}'") + elif lines[-1].strip() != "}": + errors.append(f"Last line: must be '}}'") + + # Check 3: each entry is one line with correct format + entry_pattern = re.compile( + r'^ "([^"]+)" : \[ .+ \](,?)$' + ) + keys_in_order = [] + entry_lines = lines[1:] # skip opening brace + for i, line in enumerate(entry_lines, start=2): + stripped = line.strip() + if stripped == "}" or stripped == "": + continue + m = entry_pattern.match(line) + if not m: + errors.append( + f"Line {i}: does not match expected format " + f"' \"test-name\" : [ \"group1\",\"group2\" ],' " + f"Got: {line!r}" + ) + else: + keys_in_order.append(m.group(1)) + + # Check 4: keys are sorted + if keys_in_order != sorted(keys_in_order): + # Find first out-of-order key + for j in range(len(keys_in_order) - 1): + if keys_in_order[j] > keys_in_order[j + 1]: + errors.append( + f"Keys not sorted: '{keys_in_order[j + 1]}' " + f"should come before '{keys_in_order[j]}'" + ) + break + + # Check 5: last entry has no trailing comma, others do + entry_indices = [] + for i, line in enumerate(lines): + if entry_pattern.match(line): + entry_indices.append(i) + if entry_indices: + for idx in entry_indices[:-1]: + if not lines[idx].rstrip().endswith(","): + errors.append(f"Line {idx + 1}: non-last entry must end with comma") + last_idx = entry_indices[-1] + if lines[last_idx].rstrip().endswith(","): + errors.append(f"Line {last_idx + 1}: last entry must not end with comma") + + if errors: + print(f"groups.json format lint: {len(errors)} error(s) found:", file=sys.stderr) + for e in errors: + print(f" {e}", file=sys.stderr) + return 1 + + print(f"groups.json format lint: OK ({len(data)} entries, sorted, compact)") + return 0 + + +if __name__ == "__main__": + sys.exit(main())