mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-07-06 22:10:39 +00:00
* feat: add query regression perf harness Signed-off-by: discord9 <discord9@163.com> * feat: extend query regression cases Signed-off-by: discord9 <discord9@163.com> * ci: harden query regression workflows Signed-off-by: discord9 <discord9@163.com> * fix: address query regression review comments Signed-off-by: discord9 <discord9@163.com> * ci: limit query regression PR triggers Signed-off-by: discord9 <discord9@163.com> * ci: run full query regression case set Signed-off-by: discord9 <discord9@163.com> * refactor: model query regression scenarios Signed-off-by: discord9 <discord9@163.com> * fix: avoid unenforced query regression thresholds Signed-off-by: discord9 <discord9@163.com> --------- Signed-off-by: discord9 <discord9@163.com>
153 lines
5.6 KiB
YAML
153 lines
5.6 KiB
YAML
name: Query Regression
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
case:
|
|
description: Query perf case path(s) in candidate checkout, or all
|
|
required: true
|
|
default: all
|
|
base_ref:
|
|
description: Base ref/sha to build
|
|
required: true
|
|
default: main
|
|
candidate_ref:
|
|
description: Candidate ref/sha to build (empty = current ref)
|
|
required: false
|
|
default: ""
|
|
allow_large_fixture:
|
|
description: Pass --allow-large-fixture to runner
|
|
type: boolean
|
|
default: true
|
|
http_timeout:
|
|
description: Runner HTTP timeout seconds
|
|
required: true
|
|
default: "300"
|
|
cargo_profile:
|
|
description: Cargo profile to build base and candidate binaries with
|
|
required: true
|
|
type: choice
|
|
default: nightly
|
|
options:
|
|
- nightly
|
|
- release
|
|
- dev
|
|
pull_request:
|
|
types: [labeled, ready_for_review, reopened]
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
query-regression:
|
|
if: >-
|
|
${{ github.event_name == 'workflow_dispatch' ||
|
|
(github.event_name == 'pull_request' &&
|
|
!github.event.pull_request.draft &&
|
|
contains(github.event.pull_request.labels.*.name, 'query-regression') &&
|
|
(github.event.action != 'labeled' || github.event.label.name == 'query-regression')) }}
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 180
|
|
env:
|
|
CARGO_PROFILE: ${{ github.event_name == 'pull_request' && 'nightly' || inputs.cargo_profile }}
|
|
steps:
|
|
- name: Checkout base source
|
|
uses: actions/checkout@v4
|
|
with:
|
|
repository: ${{ github.repository }}
|
|
ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || inputs.base_ref }}
|
|
path: base-src
|
|
persist-credentials: false
|
|
|
|
- name: Checkout candidate source
|
|
uses: actions/checkout@v4
|
|
with:
|
|
repository: ${{ github.repository }}
|
|
ref: ${{ github.event_name == 'pull_request' && format('refs/pull/{0}/merge', github.event.pull_request.number) || inputs.candidate_ref || github.ref }}
|
|
path: candidate-src
|
|
persist-credentials: false
|
|
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
|
|
- uses: astral-sh/setup-uv@v5
|
|
|
|
- name: Rust cache (base)
|
|
uses: Swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: base-src
|
|
shared-key: query-regression-base
|
|
cache-all-crates: "true"
|
|
save-if: false
|
|
|
|
- name: Rust cache (candidate)
|
|
uses: Swatinem/rust-cache@v2
|
|
with:
|
|
workspaces: candidate-src
|
|
shared-key: query-regression-candidate
|
|
cache-all-crates: "true"
|
|
save-if: false
|
|
|
|
- name: Build base greptime
|
|
working-directory: base-src
|
|
run: cargo build --profile "${CARGO_PROFILE}" -p cmd --bin greptime
|
|
|
|
- name: Build candidate greptime and fixture generator
|
|
working-directory: candidate-src
|
|
run: cargo build --profile "${CARGO_PROFILE}" -p cmd --bin greptime --bin query_perf_fixture
|
|
|
|
- name: Run query regression
|
|
id: run
|
|
env:
|
|
CASE_PATHS: ${{ github.event_name == 'pull_request' && 'all' || inputs.case }}
|
|
HTTP_TIMEOUT: ${{ github.event_name == 'pull_request' && '300' || inputs.http_timeout }}
|
|
ALLOW_LARGE_FIXTURE: ${{ github.event_name == 'pull_request' && 'true' || inputs.allow_large_fixture }}
|
|
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
|
CASE_NAME: ${{ github.event_name == 'pull_request' && 'default case set' || inputs.case }}
|
|
BASE_REF: ${{ github.event_name == 'pull_request' && github.event.pull_request.base.sha || inputs.base_ref }}
|
|
CANDIDATE_REF: ${{ github.event_name == 'pull_request' && format('refs/pull/{0}/merge', github.event.pull_request.number) || inputs.candidate_ref || github.ref }}
|
|
run: uv run --no-project python candidate-src/.github/scripts/query-regression-run.py
|
|
|
|
- name: Write PR metadata for trusted comment workflow
|
|
if: ${{ always() && github.event_name == 'pull_request' }}
|
|
env:
|
|
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
|
HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }}
|
|
BASE_REPO: ${{ github.event.pull_request.base.repo.full_name }}
|
|
RUN_ID: ${{ github.run_id }}
|
|
RUN_ATTEMPT: ${{ github.run_attempt }}
|
|
run: uv run --no-project python candidate-src/.github/scripts/query-regression-pr-metadata.py
|
|
|
|
- name: Upload query regression artifacts
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: query-regression-report
|
|
path: |
|
|
query-regression-work/**
|
|
query-regression-summary.md
|
|
if-no-files-found: warn
|
|
|
|
- name: Upload trusted comment artifact
|
|
if: ${{ always() && github.event_name == 'pull_request' }}
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: query-regression-comment
|
|
path: |
|
|
query-regression-pr.json
|
|
query-regression-summary.md
|
|
if-no-files-found: warn
|
|
retention-days: 7
|
|
|
|
- name: Fail on regression failure
|
|
if: ${{ steps.run.outputs.status != '0' }}
|
|
run: exit 1
|