mirror of https://github.com/sysown/proxysql
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.
381 lines
14 KiB
381 lines
14 KiB
# 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:
|
|
|
|
```yaml
|
|
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.yml` → `ci-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.yml` → `ci-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:
|
|
|
|
```yaml
|
|
# 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.yml` → `ci-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.yml` → `ci-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.bash` → `start-proxysql-isolated.bash` → `run-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.yml` → `ci-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.yml` → `ci-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.yml` → `ci-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.yml` → `ci-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.yml` → `ci-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:
|
|
```yaml
|
|
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 |
|