You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
proxysql/doc/GH-Actions
Rene Cannao bc42730061
Add GitHub Actions CI/CD documentation
3 weeks ago
..
README.md Add GitHub Actions CI/CD documentation 3 weeks ago

README.md

GitHub Actions CI/CD Documentation

Architecture

ProxySQL CI uses a two-tier workflow architecture:

  1. Caller workflows live on the main branches (e.g. v3.0). They are thin wrappers that trigger on events (push, PR, manual dispatch) and delegate to reusable workflows.
  2. Reusable workflows live on the GH-Actions branch. They contain the actual build/test logic, matrix definitions, caching strategy, and infrastructure orchestration.

This separation allows updating CI logic on the GH-Actions branch without touching the main codebase.

Execution Flow

Push/PR
  └─► CI-trigger (on: push/pull_request)
        │
        ├─[in_progress]─► CI-builds (3 matrix builds, caches artifacts)
        │                    ├── debian12-dbg
        │                    ├── ubuntu22-tap
        │                    └── ubuntu24-tap-genai-gcov
        │
        ├─[in_progress]─► CI-legacy-g2        (ubuntu22-tap cache)
        ├─[in_progress]─► CI-legacy-g2-genai  (ubuntu24-tap-genai-gcov cache)
        │
        ├─[completed]──► CI-selftests         (ubuntu22-tap cache)
        ├─[completed]──► CI-basictests        (ubuntu22-tap cache)
        ├─[completed]──► CI-maketest          (ubuntu22-tap cache)
        ├─[completed]──► CI-taptests-groups   (ubuntu22-tap cache) [BROKEN: #5521]
        ├─[completed]──► CI-taptests          (ubuntu22-tap cache) [BROKEN: #5521]
        ├─[completed]──► CI-taptests-ssl      (ubuntu22-tap cache) [BROKEN: #5521]
        ├─[completed]──► CI-taptests-asan     (ubuntu22-tap cache) [BROKEN: #5521]
        ├─[completed]──► CI-repltests         (ubuntu22-tap cache) [BROKEN: #5521]
        ├─[completed]──► CI-shuntest          (ubuntu22-tap cache) [BROKEN: #5521]
        ├─[completed]──► CI-codeql
        ├─[completed]──► CI-package-build
        │
        └─[completed]──► CI-3p-* (10 third-party integration workflows)

Trigger types:

  • in_progress — fires as soon as CI-trigger starts. Used by CI-builds (which must run first) and workflows that wait on build caches.
  • completed — fires after CI-trigger finishes. Used by test workflows that depend on CI-builds having already populated the cache.

Concurrency

Every workflow uses concurrency groups to prevent resource waste:

concurrency:
  group: ${{ github.workflow }}-${{ github.ref_name }}
  cancel-in-progress: true

Only one run per workflow per branch is active at any time. A new push cancels the previous run.


CI-trigger

File CI-trigger.ymlci-trigger.yml@GH-Actions
Triggers Push to version branches (v[0-9].[0-9x]+...), pull requests, manual dispatch
Paths ignored .github/**, **.md
Purpose Entry point for the entire CI pipeline. Does not do any work itself — its in_progress and completed events trigger all downstream workflows.

CI-builds

File CI-builds.ymlci-builds.yml@GH-Actions
Triggers CI-trigger in_progress, manual dispatch
Runs on ubuntu-24.04
Purpose Compiles ProxySQL in Docker containers and caches the artifacts for downstream test workflows.

Build Matrix

Matrix Entry Make Target Build Flags Use Case
debian12-dbg make debian12-dbg Debug (-O0 -ggdb) 3rd-party integration testing
ubuntu22-tap make ubuntu22-dbg Debug + TAP test binaries Standard TAP testing
ubuntu24-tap-genai-gcov make ubuntu24-dbg Debug + PROXYSQLGENAI=1 + WITHGCOV=1 GenAI feature testing with code coverage

Build Flag Injection

Build flags are injected into docker-compose.yml environment before the build runs, using the same pattern for each:

# In the Build step:
if [[ "${{ matrix.type }}" =~ "-asan" ]]; then
  sed -i "/command/i \      - WITHASAN=1" docker-compose.yml
fi
if [[ "${{ matrix.type }}" =~ "-genai" ]]; then
  sed -i "/command/i \      - PROXYSQLGENAI=1" docker-compose.yml
fi
if [[ "${{ matrix.type }}" =~ "-gcov" ]]; then
  sed -i "/command/i \      - WITHGCOV=1" docker-compose.yml
fi

Cache Strategy

Each build produces four cache entries keyed by {SHA}_{dist}{type}:

Cache Suffix Contents Used By
_bin .git/ + binaries/ Package builds
_src src/ (includes proxysql binary) All test workflows
_test test/ (includes TAP test binaries) TAP test workflows
_matrix tap-matrix*.json files TAP matrix workflows

Caches expire after 7 days of inactivity.


Test Workflows — In-Repo Infrastructure

These workflows use the test/infra/ orchestration system (no external dependencies).

CI-selftests

File CI-selftests.ymlci-selftests.yml@GH-Actions
Cache ubuntu22-tap_src
Status Working
Infrastructure None (runs ProxySQL directly on the runner)
What it tests ProxySQL self-test commands (PROXYSQLTEST 1-6), core dumps, query digest stats

CI-basictests

File CI-basictests.ymlci-basictests.yml@GH-Actions
Cache ubuntu22-tap_src
Status Working (migrated from jenkins-build-scripts, PR #5525)
Infrastructure MySQL 5.7 (via test/infra/infra-mysql57/)
TAP Group basictests
What it tests Sysbench benchmark, COM_CHANGE_USER, orchestrator failover
Env flags SKIP_CLUSTER_START=1

Uses ensure-infras.bashstart-proxysql-isolated.bashrun-tests-isolated.bash pipeline with the basictests TAP group. The setup-infras.bash hook aliases hostgroup pairs (e.g. 1300/1301 → 0/1) for backwards compatibility with proxysql-tester.py.

CI-legacy-g2

File CI-legacy-g2.ymlci-legacy-g2.yml@GH-Actions
Cache ubuntu22-tap_src + ubuntu22-tap_test
Status New
Infrastructure MySQL 5.7, MariaDB 10, PostgreSQL 16, ClickHouse 23
TAP Group legacy-g2 (44 TAP tests)
Env flags SKIP_CLUSTER_START=1, TAP_USE_NOISE=1

Runs the second batch of legacy TAP tests using the standard ubuntu22 build. Noise injection is enabled to help detect race conditions.

CI-legacy-g2-genai

File CI-legacy-g2-genai.ymlci-legacy-g2-genai.yml@GH-Actions
Cache ubuntu24-tap-genai-gcov_src + ubuntu24-tap-genai-gcov_test
Status New
Infrastructure MySQL 5.7, MariaDB 10, PostgreSQL 16, ClickHouse 23
TAP Group legacy-g2 (44 TAP tests)
Env flags SKIP_CLUSTER_START=1, TAP_USE_NOISE=1, COVERAGE=1
Artifacts Coverage report uploaded as workflow artifact

Same tests as CI-legacy-g2 but runs against the GenAI build (PROXYSQLGENAI=1) with code coverage enabled (WITHGCOV=1). This validates that GenAI features don't break existing functionality.

CI-maketest

File CI-maketest.ymlci-maketest.yml@GH-Actions
Cache ubuntu22-tap_src
Status Working
Infrastructure MySQL 5.7 (Docker)
What it tests Runs make test inside a Docker build container

Test Workflows — Broken (Depend on jenkins-build-scripts)

These workflows still reference the private proxysql/jenkins-build-scripts repository and fail with fatal: repository not found. See issue #5521 for migration tracking.

CI-taptests-groups

Status Broken (#5521)
Purpose Runs TAP tests in parallel groups. Dynamically builds a test matrix from tap-matrix.json.
Migration Medium effort. Most infrastructure exists in-repo (test/tap/groups/).

CI-repltests

Status Broken (#5521, #5523)
Purpose Replication chain tests with sysbench load and data consistency verification. Tests MySQL 5.6/5.7/8.0 with/without SSL and debezium.
Migration Requires porting proxysql_repl_tests/ from jenkins-build-scripts.

CI-shuntest

Status Broken (#5521)
Purpose Backend shunning/failover algorithm tests. Uses the same proxysql_repl_tests infrastructure as CI-repltests.
Migration Unblocked by CI-repltests migration.

CI-taptests, CI-taptests-ssl, CI-taptests-asan

Status Broken (#5521)
Purpose Various TAP test execution modes: standard, SSL-focused, and AddressSanitizer.
Migration Similar to CI-taptests-groups.

CI-package-build

File CI-package-build.ymlci-package-build.yml@GH-Actions
Triggers Push (not workflow_run)
Status Working
Purpose Builds .deb and .rpm packages for distribution. Independent of the CI-trigger cascade.

CI-codeql

File CI-codeql.ymlci-codeql.yml@GH-Actions
Triggers CI-trigger completed
Status Working
Purpose GitHub CodeQL security analysis.

Third-Party Integration Workflows (CI-3p-*)

Ten workflows test ProxySQL against external client libraries and frameworks. They all:

  • Trigger on CI-trigger completed
  • Use repository variables for matrix configuration (database versions, connector versions)
  • Run separate MySQL and MariaDB/PostgreSQL jobs
  • Are independent of the build cache (they build ProxySQL inline)
Workflow Client Library Protocols
CI-3p-aiomysql Python aiomysql (async) MySQL
CI-3p-django-framework Django ORM MySQL, PostgreSQL
CI-3p-laravel-framework Laravel Eloquent MySQL, PostgreSQL
CI-3p-mariadb-connector-c MariaDB C connector MySQL
CI-3p-mysql-connector-j MySQL Connector/J (Java) MySQL
CI-3p-pgjdbc PostgreSQL JDBC PostgreSQL
CI-3p-php-pdo-mysql PHP PDO MySQL MySQL
CI-3p-php-pdo-pgsql PHP PDO PostgreSQL PostgreSQL
CI-3p-postgresql libpq (native) PostgreSQL
CI-3p-sqlalchemy SQLAlchemy ORM MySQL, PostgreSQL

Matrix Variables

Each 3p workflow reads its test matrix from GitHub repository variables:

MATRIX_3P_AIOMYSQL_infradb_mysql      # e.g. ["mysql57", "mysql84", "mysql91"]
MATRIX_3P_AIOMYSQL_connector_mysql    # e.g. ["0.1.1", "0.2.0"]
MATRIX_3P_AIOMYSQL_infradb_mariadb    # e.g. ["mariadb105", "mariadb115"]
MATRIX_3P_AIOMYSQL_connector_mariadb  # e.g. ["0.1.1", "0.2.0"]

Other Workflows

claude.yml

Claude Code automation for AI-assisted development. Triggers on issue comments, PR comments, and issue assignments.

claude-code-review.yml

Automated code review using Claude. Triggers on pull request events.


Test Infrastructure (test/infra/)

Test workflows that use the in-repo infrastructure follow this pipeline:

ensure-infras.bash          # Start ProxySQL + backends based on TAP group's infras.lst
  ├── start-proxysql-isolated.bash   # ProxySQL in Docker container
  ├── infra-mysql57/docker-compose-init.bash  # MySQL 5.7 (3 nodes + 3 orchestrators)
  ├── docker-pgsql16-single/...              # PostgreSQL 16
  └── ...other backends from infras.lst

run-tests-isolated.bash     # Launch test runner container
  ├── Source group env.sh (TEST_PY_* flags)
  ├── Source env-isolated.bash (TAP_* connection vars)
  └── Run proxysql-tester.py

stop-proxysql-isolated.bash # Cleanup ProxySQL
destroy-infras.bash         # Cleanup backends

TAP Groups

Tests are organized into groups under test/tap/groups/. Each group has:

File Purpose
infras.lst Required backend infrastructure (one per line)
env.sh Environment overrides (test flags, hostgroup defaults)
pre-proxysql.bash Hook: runs before tests (cluster setup)
setup-infras.bash Hook: runs after infra is up (hostgroup aliasing, etc.)
pre-cleanup.bash Hook: runs before teardown

Group assignment is defined in test/tap/groups/groups.json which maps test binary names to group names (e.g. legacy-g1, legacy-g2, mysql84-g1, etc.).

Key Environment Variables

Variable Default Purpose
INFRA_ID dev-$USER Namespace for Docker containers (enables parallel runs)
TAP_GROUP Which test group to run
SKIP_CLUSTER_START 0 Skip ProxySQL cluster setup
TAP_USE_NOISE 0 Enable random delay injection for race condition testing
COVERAGE 0 Enable code coverage collection
WITHGCOV 0 Tell proxysql-tester.py binary was built with gcov

Adding a New Test Workflow

To add a new workflow for TAP group <group> with build variant <build>:

  1. Reusable workflow — Create .github/workflows/ci-<name>.yml on the GH-Actions branch. Use ci-legacy-g2.yml as a template. Set the BLDCACHE env to match the build variant cache key (e.g. ubuntu22-tap_src).

  2. Caller workflow — Create .github/workflows/CI-<name>.yml on the main branch:

    name: CI-<name>
    on:
      workflow_dispatch:
      workflow_run:
        workflows: [ CI-trigger ]
        types: [ in_progress ]  # or completed
    jobs:
      run:
        uses: sysown/proxysql/.github/workflows/ci-<name>.yml@GH-Actions
        secrets: inherit
        with:
          trigger: ${{ toJson(github) }}
    
  3. TAP group (if new) — Create test/tap/groups/<group>/ with infras.lst and env.sh. Add test assignments to groups.json.

Use in_progress trigger type if the workflow should start building immediately (parallel with CI-builds). Use completed if it must wait for CI-builds to finish populating the cache.


File Locations

What Where
Caller workflows .github/workflows/CI-*.yml (main branch)
Reusable workflows .github/workflows/ci-*.yml (GH-Actions branch)
Test infrastructure test/infra/
Control scripts test/infra/control/
TAP groups test/tap/groups/
Group-to-test mapping test/tap/groups/groups.json
Python test runner test/scripts/bin/proxysql-tester.py
Tester config test/scripts/etc/proxysql-tester.yml
Docker base image test/infra/docker-base/Dockerfile
Migration tracking Issue #5521