mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-04-01 06:50:41 +00:00
* test: add fuzz_repartition_metric_table target scaffold Signed-off-by: WenyXu <wenymedia@gmail.com> * test: add metric logical lifecycle in repartition fuzz target Signed-off-by: WenyXu <wenymedia@gmail.com> * test: support partitioned metric tables in repartition fuzz Signed-off-by: WenyXu <wenymedia@gmail.com> * test: add repartition loop and partition assertions for metric target Signed-off-by: WenyXu <wenymedia@gmail.com> * test: use shared timestamp clock in metric repartition writes Signed-off-by: WenyXu <wenymedia@gmail.com> * refactor: unify string value and bound generation for fuzzing Signed-off-by: WenyXu <wenymedia@gmail.com> * test: use fixed physical table name in metric repartition fuzz Signed-off-by: WenyXu <wenymedia@gmail.com> * chore: fmt Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: update ci config Signed-off-by: WenyXu <wenymedia@gmail.com> * refactor: use btreemap Signed-off-by: WenyXu <wenymedia@gmail.com> * print count result Signed-off-by: WenyXu <wenymedia@gmail.com> * test: add csv translator for insert expr Introduce a dedicated top-level csv translator so fuzz insert expressions can be converted into writer-ready records through a structured path instead of ad-hoc formatting in targets. Signed-off-by: WenyXu <wenymedia@gmail.com> * test: add csv dump session utilities Introduce CSV dump env helpers and a session writer that creates run directories, emits seed metadata, and flushes staged CSV records for fuzz workflows. Signed-off-by: WenyXu <wenymedia@gmail.com> * test: bound csv dump buffer with auto flush Parse readable buffer sizes from env and flush staged CSV records automatically when the in-memory threshold is reached to prevent unbounded growth during long fuzz runs. Signed-off-by: WenyXu <wenymedia@gmail.com> * test: flush csv dump before repartition validation Wire csv dump session into the metric repartition fuzz flow so successful inserts are translated from insert expressions into CSV records during write loops and flushed to disk right before row validation. Signed-off-by: WenyXu <wenymedia@gmail.com> * test: keep csv dumps on failure and cleanup on pass Capture run outcomes in metric repartition fuzz, remove dump directories only after successful validation, and retain dump paths on failures so CI and local investigations can use the same artifacts. Signed-off-by: WenyXu <wenymedia@gmail.com> * test: align partial csv records with table headers Keep append payload compact by storing partial insert-expression columns, then expand to full table-context headers at flush time and fill missing values with empty strings. Signed-off-by: WenyXu <wenymedia@gmail.com> * chore: add logs Signed-off-by: WenyXu <wenymedia@gmail.com> * dump csv Signed-off-by: WenyXu <wenymedia@gmail.com> * ci: dump csv Signed-off-by: WenyXu <wenymedia@gmail.com> * refactor Signed-off-by: WenyXu <wenymedia@gmail.com> * test: add table-scoped sql dump writer primitives Signed-off-by: WenyXu <wenymedia@gmail.com> * test: capture table-scoped sql traces after execution Record insert and repartition SQL only after successful execution, include started_at_ms and elapsed_ms in trace comments, and broadcast repartition events into every logical-table trace file for consistent debugging context. Signed-off-by: WenyXu <wenymedia@gmail.com> * test: harden sql trace comments and include create sql Normalize multiline trace comments into valid SQL comment lines and append logical-table CREATE SQL to per-table traces for better timeline reconstruction during repartition debugging. Signed-off-by: WenyXu <wenymedia@gmail.com> * test: dump physical create and repartition SQL traces Signed-off-by: WenyXu <wenymedia@gmail.com> * dump repartition sql Signed-off-by: WenyXu <wenymedia@gmail.com> * test: scaffold writer control channel for barrier flow Add Barrier/Resume/Stop control skeleton and channel wiring in write_loop to prepare per-repartition validation barriers. Also align SQL dump tests with broadcast SQL payload behavior. Signed-off-by: WenyXu <wenymedia@gmail.com> * test: implement writer barrier pause and resume control Make writer control messages effective by pausing writes on barrier, resuming on resume, and stopping via channel signaling so the next commit can enforce deterministic per-repartition validation boundaries. Signed-off-by: WenyXu <wenymedia@gmail.com> * test: validate rows after each repartition barrier Add per-action barrier/ack synchronization with timeout, run immediate logical-table row validation after each repartition, and resume writer only after validation completes to improve minimal failure localization. Signed-off-by: WenyXu <wenymedia@gmail.com> * test: flush dump sessions before per-epoch validation Extract a shared flush-and-snapshot helper and call it before each immediate row validation so CSV/SQL artifacts are persisted at the same epoch boundary being validated. Signed-off-by: WenyXu <wenymedia@gmail.com> * fix: fix unit tests Signed-off-by: WenyXu <wenymedia@gmail.com> * chore: add retry Signed-off-by: WenyXu <wenymedia@gmail.com> * chore: apply suggestions from CR Signed-off-by: WenyXu <wenymedia@gmail.com> --------- Signed-off-by: WenyXu <wenymedia@gmail.com>
934 lines
31 KiB
YAML
934 lines
31 KiB
YAML
on:
|
|
schedule:
|
|
- cron: "0 15 * * 1-5"
|
|
merge_group:
|
|
pull_request:
|
|
types: [ opened, synchronize, reopened, ready_for_review ]
|
|
paths-ignore:
|
|
- 'docs/**'
|
|
- 'config/**'
|
|
- '**.md'
|
|
- '.dockerignore'
|
|
- 'docker/**'
|
|
- '.gitignore'
|
|
- 'grafana/**'
|
|
- 'Makefile'
|
|
workflow_dispatch:
|
|
|
|
name: CI
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
check-typos-and-docs:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Check typos and docs
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: crate-ci/typos@master
|
|
- name: Check the config docs
|
|
run: |
|
|
make config-docs && \
|
|
git diff --name-only --exit-code ./config/config.md \
|
|
|| (echo "'config/config.md' is not up-to-date, please run 'make config-docs'." && exit 1)
|
|
|
|
license-header-check:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
runs-on: ubuntu-latest
|
|
name: Check License Header
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: korandoru/hawkeye@v5
|
|
|
|
check:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Check
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
matrix:
|
|
os: [ ubuntu-latest ]
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- name: Rust Cache
|
|
uses: Swatinem/rust-cache@v2
|
|
with:
|
|
# Shares across multiple jobs
|
|
# Shares with `Clippy` job
|
|
shared-key: "check-lint"
|
|
cache-all-crates: "true"
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- name: Run cargo check
|
|
run: cargo check --locked --workspace --all-targets
|
|
- name: Run cargo check (all features)
|
|
run: cargo check --locked --workspace --all-targets --all-features
|
|
|
|
toml:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Toml Check
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- name: Install taplo
|
|
run: cargo +stable install taplo-cli --version ^0.9 --locked --force
|
|
- name: Run taplo
|
|
run: taplo format --check
|
|
|
|
build:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Build GreptimeDB binaries
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
matrix:
|
|
os: [ ubuntu-latest ]
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
# Shares across multiple jobs
|
|
shared-key: "build-binaries"
|
|
cache-all-crates: "true"
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- name: Install cargo-gc-bin
|
|
shell: bash
|
|
run: cargo install cargo-gc-bin --force
|
|
- name: Build greptime binaries
|
|
shell: bash
|
|
# `cargo gc` will invoke `cargo build` with specified args
|
|
run: cargo gc -- --bin greptime --bin sqlness-runner --features "pg_kvbackend,mysql_kvbackend,vector_index"
|
|
- name: Pack greptime binaries
|
|
shell: bash
|
|
run: |
|
|
mkdir bins && \
|
|
mv ./target/debug/greptime bins && \
|
|
mv ./target/debug/sqlness-runner bins
|
|
- name: Print greptime binaries info
|
|
run: ls -lh bins
|
|
- name: Upload artifacts
|
|
uses: ./.github/actions/upload-artifacts
|
|
with:
|
|
artifacts-dir: bins
|
|
version: current
|
|
|
|
fuzztest:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Fuzz Test
|
|
needs: build
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 60
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
target: [ "fuzz_create_table", "fuzz_alter_table", "fuzz_create_database", "fuzz_create_logical_table", "fuzz_alter_logical_table", "fuzz_insert", "fuzz_insert_logical_table" ]
|
|
steps:
|
|
- name: Remove unused software
|
|
run: |
|
|
echo "Disk space before:"
|
|
df -h
|
|
[[ -d /usr/share/dotnet ]] && sudo rm -rf /usr/share/dotnet
|
|
[[ -d /usr/local/lib/android ]] && sudo rm -rf /usr/local/lib/android
|
|
[[ -d /opt/ghc ]] && sudo rm -rf /opt/ghc
|
|
[[ -d /opt/hostedtoolcache/CodeQL ]] && sudo rm -rf /opt/hostedtoolcache/CodeQL
|
|
sudo docker image prune --all --force
|
|
sudo docker builder prune -a
|
|
echo "Disk space after:"
|
|
df -h
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- name: Set Rust Fuzz
|
|
shell: bash
|
|
run: |
|
|
sudo apt-get install -y libfuzzer-14-dev
|
|
rustup install nightly
|
|
cargo +nightly install cargo-fuzz cargo-gc-bin --force
|
|
- name: Download pre-built binaries
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
name: bins
|
|
path: .
|
|
- name: Unzip binaries
|
|
run: |
|
|
tar -xvf ./bins.tar.gz
|
|
rm ./bins.tar.gz
|
|
- name: Run GreptimeDB
|
|
run: |
|
|
./bins/greptime standalone start&
|
|
- name: Fuzz Test
|
|
uses: ./.github/actions/fuzz-test
|
|
env:
|
|
CUSTOM_LIBFUZZER_PATH: /usr/lib/llvm-14/lib/libFuzzer.a
|
|
GT_MYSQL_ADDR: 127.0.0.1:4002
|
|
with:
|
|
target: ${{ matrix.target }}
|
|
max-total-time: 120
|
|
|
|
unstable-fuzztest:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Unstable Fuzz Test
|
|
needs: build-greptime-ci
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 60
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
target: [ "unstable_fuzz_create_table_standalone" ]
|
|
steps:
|
|
- name: Remove unused software
|
|
run: |
|
|
echo "Disk space before:"
|
|
df -h
|
|
[[ -d /usr/share/dotnet ]] && sudo rm -rf /usr/share/dotnet
|
|
[[ -d /usr/local/lib/android ]] && sudo rm -rf /usr/local/lib/android
|
|
[[ -d /opt/ghc ]] && sudo rm -rf /opt/ghc
|
|
[[ -d /opt/hostedtoolcache/CodeQL ]] && sudo rm -rf /opt/hostedtoolcache/CodeQL
|
|
sudo docker image prune --all --force
|
|
sudo docker builder prune -a
|
|
echo "Disk space after:"
|
|
df -h
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- name: Set Rust Fuzz
|
|
shell: bash
|
|
run: |
|
|
sudo apt update && sudo apt install -y libfuzzer-14-dev
|
|
cargo install cargo-fuzz cargo-gc-bin --force
|
|
- name: Download pre-built binary
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
name: bin
|
|
path: .
|
|
- name: Unzip binary
|
|
run: |
|
|
tar -xvf ./bin.tar.gz
|
|
rm ./bin.tar.gz
|
|
- name: Run Fuzz Test
|
|
uses: ./.github/actions/fuzz-test
|
|
env:
|
|
CUSTOM_LIBFUZZER_PATH: /usr/lib/llvm-14/lib/libFuzzer.a
|
|
GT_MYSQL_ADDR: 127.0.0.1:4002
|
|
GT_FUZZ_BINARY_PATH: ./bin/greptime
|
|
GT_FUZZ_INSTANCE_ROOT_DIR: /tmp/unstable-greptime/
|
|
with:
|
|
target: ${{ matrix.target }}
|
|
max-total-time: 120
|
|
unstable: 'true'
|
|
- name: Upload unstable fuzz test logs
|
|
if: failure()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: unstable-fuzz-logs
|
|
path: /tmp/unstable-greptime/
|
|
retention-days: 3
|
|
- name: Describe pods
|
|
if: failure()
|
|
shell: bash
|
|
run: |
|
|
kubectl describe pod -n my-greptimedb
|
|
|
|
build-greptime-ci:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Build GreptimeDB binary (profile-CI)
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
matrix:
|
|
os: [ ubuntu-latest ]
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- uses: Swatinem/rust-cache@v2
|
|
with:
|
|
# Shares across multiple jobs
|
|
shared-key: "build-greptime-ci"
|
|
cache-all-crates: "true"
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- name: Install cargo-gc-bin
|
|
shell: bash
|
|
run: cargo install cargo-gc-bin --force
|
|
- name: Build greptime binary
|
|
shell: bash
|
|
# `cargo gc` will invoke `cargo build` with specified args
|
|
run: cargo gc --profile ci -- --bin greptime --features "pg_kvbackend,mysql_kvbackend"
|
|
- name: Pack greptime binary
|
|
shell: bash
|
|
run: |
|
|
mkdir bin && \
|
|
mv ./target/ci/greptime bin
|
|
- name: Print greptime binaries info
|
|
run: ls -lh bin
|
|
- name: Upload artifacts
|
|
uses: ./.github/actions/upload-artifacts
|
|
with:
|
|
artifacts-dir: bin
|
|
version: current
|
|
|
|
distributed-fuzztest:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Fuzz Test (Distributed, ${{ matrix.mode.name }}, ${{ matrix.target }})
|
|
runs-on: ubuntu-latest
|
|
needs: build-greptime-ci
|
|
timeout-minutes: 60
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
target: [ "fuzz_create_table", "fuzz_alter_table", "fuzz_create_database", "fuzz_create_logical_table", "fuzz_alter_logical_table", "fuzz_insert", "fuzz_insert_logical_table" ]
|
|
mode:
|
|
- name: "Remote WAL"
|
|
minio: true
|
|
kafka: true
|
|
values: "with-remote-wal.yaml"
|
|
include:
|
|
- target: "fuzz_repartition_table"
|
|
mode:
|
|
name: "Local WAL mito table repartition"
|
|
minio: true
|
|
kafka: false
|
|
values: "with-minio-repartition-gc.yaml"
|
|
- target: "fuzz_repartition_metric_table"
|
|
mode:
|
|
name: "Local WAL metric table repartition"
|
|
minio: true
|
|
kafka: false
|
|
values: "with-minio-repartition-gc.yaml"
|
|
steps:
|
|
- name: Remove unused software
|
|
run: |
|
|
echo "Disk space before:"
|
|
df -h
|
|
[[ -d /usr/share/dotnet ]] && sudo rm -rf /usr/share/dotnet
|
|
[[ -d /usr/local/lib/android ]] && sudo rm -rf /usr/local/lib/android
|
|
[[ -d /opt/ghc ]] && sudo rm -rf /opt/ghc
|
|
[[ -d /opt/hostedtoolcache/CodeQL ]] && sudo rm -rf /opt/hostedtoolcache/CodeQL
|
|
sudo docker image prune --all --force
|
|
sudo docker builder prune -a
|
|
echo "Disk space after:"
|
|
df -h
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- name: Setup Kind
|
|
uses: ./.github/actions/setup-kind
|
|
- if: matrix.mode.minio
|
|
name: Setup Minio
|
|
uses: ./.github/actions/setup-minio
|
|
- if: matrix.mode.kafka
|
|
name: Setup Kafka cluster
|
|
uses: ./.github/actions/setup-kafka-cluster
|
|
- name: Setup Etcd cluster
|
|
uses: ./.github/actions/setup-etcd-cluster
|
|
# Prepares for fuzz tests
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- name: Set Rust Fuzz
|
|
shell: bash
|
|
run: |
|
|
sudo apt-get install -y libfuzzer-14-dev
|
|
rustup install nightly
|
|
cargo +nightly install cargo-fuzz cargo-gc-bin --force
|
|
# Downloads ci image
|
|
- name: Download pre-built binariy
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
name: bin
|
|
path: .
|
|
- name: Unzip binary
|
|
run: |
|
|
tar -xvf ./bin.tar.gz
|
|
rm ./bin.tar.gz
|
|
- name: Build and push GreptimeDB image
|
|
uses: ./.github/actions/build-and-push-ci-image
|
|
- name: Wait for etcd
|
|
run: |
|
|
kubectl wait \
|
|
--for=condition=Ready \
|
|
pod -l app.kubernetes.io/instance=etcd \
|
|
--timeout=120s \
|
|
-n etcd-cluster
|
|
- if: matrix.mode.minio
|
|
name: Wait for minio
|
|
run: |
|
|
kubectl wait \
|
|
--for=condition=Ready \
|
|
pod -l app=minio \
|
|
--timeout=120s \
|
|
-n minio
|
|
- if: matrix.mode.kafka
|
|
name: Wait for kafka
|
|
run: |
|
|
kubectl wait \
|
|
--for=condition=Ready \
|
|
pod -l app.kubernetes.io/instance=kafka \
|
|
--timeout=120s \
|
|
-n kafka-cluster
|
|
- name: Print etcd info
|
|
shell: bash
|
|
run: kubectl get all --show-labels -n etcd-cluster
|
|
# Setup cluster for test
|
|
- name: Setup GreptimeDB cluster
|
|
uses: ./.github/actions/setup-greptimedb-cluster
|
|
with:
|
|
image-registry: localhost:5001
|
|
values-filename: ${{ matrix.mode.values }}
|
|
- name: Port forward (mysql)
|
|
run: |
|
|
kubectl port-forward service/my-greptimedb-frontend 4002:4002 -n my-greptimedb&
|
|
- name: Fuzz Test
|
|
uses: ./.github/actions/fuzz-test
|
|
env:
|
|
CUSTOM_LIBFUZZER_PATH: /usr/lib/llvm-14/lib/libFuzzer.a
|
|
GT_MYSQL_ADDR: 127.0.0.1:4002
|
|
with:
|
|
target: ${{ matrix.target }}
|
|
max-total-time: 120
|
|
- name: Describe Nodes
|
|
if: failure()
|
|
shell: bash
|
|
run: |
|
|
kubectl describe nodes
|
|
- name: Describe pod
|
|
if: failure()
|
|
shell: bash
|
|
run: |
|
|
kubectl describe pod -n my-greptimedb
|
|
- name: Export kind logs
|
|
if: failure()
|
|
shell: bash
|
|
run: |
|
|
kind export logs /tmp/kind
|
|
- name: Upload logs
|
|
if: failure()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: fuzz-tests-kind-logs-${{ matrix.mode.name }}-${{ matrix.target }}
|
|
path: /tmp/kind
|
|
retention-days: 3
|
|
- name: Collect monitor dumps
|
|
if: failure()
|
|
shell: bash
|
|
env:
|
|
GT_FUZZ_NS: my-greptimedb
|
|
GT_FUZZ_CLUSTER: my-greptimedb
|
|
GT_MONITOR_HTTP_LOCAL_PORT: 14000
|
|
GT_MONITOR_ARTIFACT_DIR: /tmp/fuzz-monitor-dumps
|
|
run: |
|
|
bash .github/scripts/collect-fuzz-monitor-artifacts.sh
|
|
- name: Upload monitor dumps
|
|
if: failure()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: fuzz-tests-monitor-dumps-${{ matrix.mode.name }}-${{ matrix.target }}
|
|
path: /tmp/fuzz-monitor-dumps
|
|
if-no-files-found: warn
|
|
retention-days: 3
|
|
- name: Upload CSV dumps
|
|
if: failure()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: fuzz-tests-csv-dumps-${{ matrix.mode.name }}-${{ matrix.target }}
|
|
path: /tmp/greptime-fuzz-dumps
|
|
if-no-files-found: warn
|
|
retention-days: 3
|
|
- name: Delete cluster
|
|
if: success()
|
|
shell: bash
|
|
run: |
|
|
kind delete cluster
|
|
docker stop $(docker ps -a -q)
|
|
docker rm $(docker ps -a -q)
|
|
docker system prune -f
|
|
|
|
distributed-fuzztest-with-chaos:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Fuzz Test with Chaos (Distributed, ${{ matrix.mode.name }}, ${{ matrix.target }})
|
|
runs-on: ubuntu-latest
|
|
needs: build-greptime-ci
|
|
timeout-minutes: 60
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
target: ["fuzz_migrate_mito_regions", "fuzz_migrate_metric_regions", "fuzz_failover_mito_regions", "fuzz_failover_metric_regions"]
|
|
mode:
|
|
- name: "Remote WAL"
|
|
minio: true
|
|
kafka: true
|
|
values: "with-remote-wal.yaml"
|
|
include:
|
|
- target: "fuzz_migrate_mito_regions"
|
|
mode:
|
|
name: "Local WAL"
|
|
minio: true
|
|
kafka: false
|
|
values: "with-minio.yaml"
|
|
- target: "fuzz_migrate_metric_regions"
|
|
mode:
|
|
name: "Local WAL"
|
|
minio: true
|
|
kafka: false
|
|
values: "with-minio.yaml"
|
|
steps:
|
|
- name: Remove unused software
|
|
run: |
|
|
echo "Disk space before:"
|
|
df -h
|
|
[[ -d /usr/share/dotnet ]] && sudo rm -rf /usr/share/dotnet
|
|
[[ -d /usr/local/lib/android ]] && sudo rm -rf /usr/local/lib/android
|
|
[[ -d /opt/ghc ]] && sudo rm -rf /opt/ghc
|
|
[[ -d /opt/hostedtoolcache/CodeQL ]] && sudo rm -rf /opt/hostedtoolcache/CodeQL
|
|
sudo docker image prune --all --force
|
|
sudo docker builder prune -a
|
|
echo "Disk space after:"
|
|
df -h
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- name: Setup Kind
|
|
uses: ./.github/actions/setup-kind
|
|
- name: Setup Chaos Mesh
|
|
uses: ./.github/actions/setup-chaos
|
|
- if: matrix.mode.minio
|
|
name: Setup Minio
|
|
uses: ./.github/actions/setup-minio
|
|
- if: matrix.mode.kafka
|
|
name: Setup Kafka cluster
|
|
uses: ./.github/actions/setup-kafka-cluster
|
|
- name: Setup Etcd cluster
|
|
uses: ./.github/actions/setup-etcd-cluster
|
|
# Prepares for fuzz tests
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- name: Set Rust Fuzz
|
|
shell: bash
|
|
run: |
|
|
sudo apt-get install -y libfuzzer-14-dev
|
|
rustup install nightly
|
|
cargo +nightly install cargo-fuzz cargo-gc-bin --force
|
|
# Downloads ci image
|
|
- name: Download pre-built binariy
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
name: bin
|
|
path: .
|
|
- name: Unzip binary
|
|
run: |
|
|
tar -xvf ./bin.tar.gz
|
|
rm ./bin.tar.gz
|
|
- name: Build and push GreptimeDB image
|
|
uses: ./.github/actions/build-and-push-ci-image
|
|
- name: Wait for etcd
|
|
run: |
|
|
kubectl wait \
|
|
--for=condition=Ready \
|
|
pod -l app.kubernetes.io/instance=etcd \
|
|
--timeout=120s \
|
|
-n etcd-cluster
|
|
- if: matrix.mode.minio
|
|
name: Wait for minio
|
|
run: |
|
|
kubectl wait \
|
|
--for=condition=Ready \
|
|
pod -l app=minio \
|
|
--timeout=120s \
|
|
-n minio
|
|
- if: matrix.mode.kafka
|
|
name: Wait for kafka
|
|
run: |
|
|
kubectl wait \
|
|
--for=condition=Ready \
|
|
pod -l app.kubernetes.io/instance=kafka \
|
|
--timeout=120s \
|
|
-n kafka-cluster
|
|
- name: Print etcd info
|
|
shell: bash
|
|
run: kubectl get all --show-labels -n etcd-cluster
|
|
# Setup cluster for test
|
|
- name: Setup GreptimeDB cluster
|
|
uses: ./.github/actions/setup-greptimedb-cluster
|
|
with:
|
|
image-registry: localhost:5001
|
|
values-filename: ${{ matrix.mode.values }}
|
|
enable-region-failover: ${{ matrix.mode.kafka }}
|
|
- name: Port forward (mysql)
|
|
run: |
|
|
kubectl port-forward service/my-greptimedb-frontend 4002:4002 -n my-greptimedb&
|
|
- name: Fuzz Test
|
|
uses: ./.github/actions/fuzz-test
|
|
env:
|
|
CUSTOM_LIBFUZZER_PATH: /usr/lib/llvm-14/lib/libFuzzer.a
|
|
GT_MYSQL_ADDR: 127.0.0.1:4002
|
|
with:
|
|
target: ${{ matrix.target }}
|
|
max-total-time: 120
|
|
- name: Describe Nodes
|
|
if: failure()
|
|
shell: bash
|
|
run: |
|
|
kubectl describe nodes
|
|
- name: Describe pods
|
|
if: failure()
|
|
shell: bash
|
|
run: |
|
|
kubectl describe pod -n my-greptimedb
|
|
- name: Export kind logs
|
|
if: failure()
|
|
shell: bash
|
|
run: |
|
|
kind export logs /tmp/kind
|
|
- name: Upload logs
|
|
if: failure()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: fuzz-tests-kind-logs-${{ matrix.mode.name }}-${{ matrix.target }}
|
|
path: /tmp/kind
|
|
retention-days: 3
|
|
- name: Collect monitor dumps
|
|
if: failure()
|
|
shell: bash
|
|
env:
|
|
GT_FUZZ_NS: my-greptimedb
|
|
GT_FUZZ_CLUSTER: my-greptimedb
|
|
GT_MONITOR_HTTP_LOCAL_PORT: 14000
|
|
GT_MONITOR_ARTIFACT_DIR: /tmp/fuzz-monitor-dumps
|
|
run: |
|
|
bash .github/scripts/collect-fuzz-monitor-artifacts.sh
|
|
- name: Upload monitor dumps
|
|
if: failure()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: fuzz-tests-monitor-dumps-${{ matrix.mode.name }}-${{ matrix.target }}
|
|
path: /tmp/fuzz-monitor-dumps
|
|
if-no-files-found: warn
|
|
retention-days: 3
|
|
- name: Delete cluster
|
|
if: success()
|
|
shell: bash
|
|
run: |
|
|
kind delete cluster
|
|
docker stop $(docker ps -a -q)
|
|
docker rm $(docker ps -a -q)
|
|
docker system prune -f
|
|
|
|
sqlness:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Sqlness Test (${{ matrix.mode.name }})
|
|
needs: build
|
|
runs-on: ${{ matrix.os }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
os: [ ubuntu-latest ]
|
|
mode:
|
|
- name: "Basic"
|
|
opts: ""
|
|
kafka: false
|
|
- name: "Remote WAL"
|
|
opts: "-w kafka -k 127.0.0.1:9092"
|
|
kafka: true
|
|
- name: "PostgreSQL KvBackend"
|
|
opts: "--setup-pg"
|
|
kafka: false
|
|
- name: "MySQL Kvbackend"
|
|
opts: "--setup-mysql"
|
|
kafka: false
|
|
- name: "Flat format"
|
|
opts: "--enable-flat-format"
|
|
kafka: false
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- if: matrix.mode.kafka
|
|
name: Setup kafka server
|
|
working-directory: tests-integration/fixtures
|
|
run: ../../.github/scripts/pull-test-deps-images.sh && docker compose up -d --wait kafka
|
|
|
|
- name: Download pre-built binaries
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
name: bins
|
|
path: .
|
|
- name: Unzip binaries
|
|
run: tar -xvf ./bins.tar.gz
|
|
- name: Run sqlness
|
|
run: RUST_BACKTRACE=1 ./bins/sqlness-runner bare ${{ matrix.mode.opts }} -c ./tests/cases --bins-dir ./bins --preserve-state
|
|
- name: Upload sqlness logs
|
|
if: failure()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: sqlness-logs-${{ matrix.mode.name }}
|
|
path: /tmp/sqlness*
|
|
retention-days: 3
|
|
|
|
fmt:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Rustfmt
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
with:
|
|
components: rustfmt
|
|
- name: Check format
|
|
run: make fmt-check
|
|
|
|
clippy:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Clippy
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
with:
|
|
components: clippy
|
|
- name: Rust Cache
|
|
uses: Swatinem/rust-cache@v2
|
|
with:
|
|
# Shares across multiple jobs
|
|
# Shares with `Check` job
|
|
shared-key: "check-lint"
|
|
cache-all-crates: "true"
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- name: Run cargo clippy
|
|
run: make clippy
|
|
|
|
check-udeps:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Check Unused Dependencies
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
- name: Rust Cache
|
|
uses: Swatinem/rust-cache@v2
|
|
with:
|
|
shared-key: "check-udeps"
|
|
cache-all-crates: "true"
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- name: Install cargo-udeps
|
|
run: cargo install cargo-udeps --locked
|
|
- name: Check unused dependencies
|
|
run: make check-udeps
|
|
|
|
conflict-check:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Check for conflict
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- name: Merge Conflict Finder
|
|
uses: olivernybroe/action-conflict-finder@v4.0
|
|
|
|
test:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' && github.event_name != 'merge_group' }}
|
|
runs-on: ubuntu-22.04-arm
|
|
timeout-minutes: 60
|
|
needs: [conflict-check, clippy, fmt, check-udeps]
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: rui314/setup-mold@v1
|
|
- name: Install toolchain
|
|
uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
with:
|
|
cache: false
|
|
- name: Rust Cache
|
|
uses: Swatinem/rust-cache@v2
|
|
with:
|
|
# Shares cross multiple jobs
|
|
shared-key: "coverage-test"
|
|
cache-all-crates: "true"
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- name: Install latest nextest release
|
|
uses: taiki-e/install-action@nextest
|
|
|
|
- name: Setup external services
|
|
working-directory: tests-integration/fixtures
|
|
run: ../../.github/scripts/pull-test-deps-images.sh && docker compose up -d --wait
|
|
|
|
- name: Run nextest cases
|
|
run: cargo nextest run --workspace -F dashboard -F pg_kvbackend -F mysql_kvbackend -F vector_index
|
|
env:
|
|
CARGO_BUILD_RUSTFLAGS: "-C link-arg=-fuse-ld=mold"
|
|
RUST_BACKTRACE: 1
|
|
RUST_MIN_STACK: 8388608 # 8MB
|
|
CARGO_INCREMENTAL: 0
|
|
GT_S3_BUCKET: ${{ vars.AWS_CI_TEST_BUCKET }}
|
|
GT_S3_ACCESS_KEY_ID: ${{ secrets.AWS_CI_TEST_ACCESS_KEY_ID }}
|
|
GT_S3_ACCESS_KEY: ${{ secrets.AWS_CI_TEST_SECRET_ACCESS_KEY }}
|
|
GT_S3_REGION: ${{ vars.AWS_CI_TEST_BUCKET_REGION }}
|
|
GT_MINIO_BUCKET: greptime
|
|
GT_MINIO_ACCESS_KEY_ID: superpower_ci_user
|
|
GT_MINIO_ACCESS_KEY: superpower_password
|
|
GT_MINIO_REGION: us-west-2
|
|
GT_MINIO_ENDPOINT_URL: http://127.0.0.1:9000
|
|
GT_ETCD_TLS_ENDPOINTS: https://127.0.0.1:2378
|
|
GT_ETCD_ENDPOINTS: http://127.0.0.1:2379
|
|
GT_POSTGRES_ENDPOINTS: postgres://greptimedb:admin@127.0.0.1:5432/postgres
|
|
GT_POSTGRES15_ENDPOINTS: postgres://test_user:test_password@127.0.0.1:5433/postgres
|
|
GT_POSTGRES15_SCHEMA: test_schema
|
|
GT_MYSQL_ENDPOINTS: mysql://greptimedb:admin@127.0.0.1:3306/mysql
|
|
GT_KAFKA_ENDPOINTS: 127.0.0.1:9092
|
|
GT_KAFKA_SASL_ENDPOINTS: 127.0.0.1:9093
|
|
UNITTEST_LOG_DIR: "__unittest_logs"
|
|
|
|
coverage:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' && github.event_name == 'merge_group' }}
|
|
runs-on: ubuntu-22.04-8-cores
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
persist-credentials: false
|
|
- uses: arduino/setup-protoc@v3
|
|
with:
|
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
- uses: rui314/setup-mold@v1
|
|
- name: Install toolchain
|
|
uses: actions-rust-lang/setup-rust-toolchain@v1
|
|
with:
|
|
components: llvm-tools
|
|
cache: false
|
|
- name: Rust Cache
|
|
uses: Swatinem/rust-cache@v2
|
|
with:
|
|
# Shares cross multiple jobs
|
|
shared-key: "coverage-test"
|
|
save-if: ${{ github.ref == 'refs/heads/main' }}
|
|
- name: Install latest nextest release
|
|
uses: taiki-e/install-action@nextest
|
|
- name: Install cargo-llvm-cov
|
|
uses: taiki-e/install-action@cargo-llvm-cov
|
|
|
|
- name: Setup external services
|
|
working-directory: tests-integration/fixtures
|
|
run: ../../.github/scripts/pull-test-deps-images.sh && docker compose up -d --wait
|
|
|
|
- name: Run nextest cases
|
|
run: cargo llvm-cov nextest --workspace --lcov --output-path lcov.info -F dashboard -F pg_kvbackend -F mysql_kvbackend -F vector_index
|
|
env:
|
|
CARGO_BUILD_RUSTFLAGS: "-C link-arg=-fuse-ld=mold"
|
|
RUST_BACKTRACE: 1
|
|
CARGO_INCREMENTAL: 0
|
|
GT_S3_BUCKET: ${{ vars.AWS_CI_TEST_BUCKET }}
|
|
GT_S3_ACCESS_KEY_ID: ${{ secrets.AWS_CI_TEST_ACCESS_KEY_ID }}
|
|
GT_S3_ACCESS_KEY: ${{ secrets.AWS_CI_TEST_SECRET_ACCESS_KEY }}
|
|
GT_S3_REGION: ${{ vars.AWS_CI_TEST_BUCKET_REGION }}
|
|
GT_MINIO_BUCKET: greptime
|
|
GT_MINIO_ACCESS_KEY_ID: superpower_ci_user
|
|
GT_MINIO_ACCESS_KEY: superpower_password
|
|
GT_MINIO_REGION: us-west-2
|
|
GT_MINIO_ENDPOINT_URL: http://127.0.0.1:9000
|
|
GT_ETCD_TLS_ENDPOINTS: https://127.0.0.1:2378
|
|
GT_ETCD_ENDPOINTS: http://127.0.0.1:2379
|
|
GT_POSTGRES_ENDPOINTS: postgres://greptimedb:admin@127.0.0.1:5432/postgres
|
|
GT_POSTGRES15_ENDPOINTS: postgres://test_user:test_password@127.0.0.1:5433/postgres
|
|
GT_POSTGRES15_SCHEMA: test_schema
|
|
GT_MYSQL_ENDPOINTS: mysql://greptimedb:admin@127.0.0.1:3306/mysql
|
|
GT_KAFKA_ENDPOINTS: 127.0.0.1:9092
|
|
GT_KAFKA_SASL_ENDPOINTS: 127.0.0.1:9093
|
|
UNITTEST_LOG_DIR: "__unittest_logs"
|
|
- name: Codecov upload
|
|
uses: codecov/codecov-action@v4
|
|
with:
|
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
files: ./lcov.info
|
|
flags: rust
|
|
fail_ci_if_error: false
|
|
verbose: true
|
|
|
|
run-multi-lang-tests:
|
|
if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
name: Run Multi-language SDK Tests
|
|
needs: build
|
|
uses: ./.github/workflows/run-multi-lang-tests.yml
|
|
with:
|
|
artifact-name: bins
|
|
|
|
|
|
# compat:
|
|
# if: ${{ github.repository == 'GreptimeTeam/greptimedb' }}
|
|
# name: Compatibility Test
|
|
# needs: build
|
|
# runs-on: ubuntu-22.04
|
|
# timeout-minutes: 60
|
|
# steps:
|
|
# - uses: actions/checkout@v4
|
|
# - name: Download pre-built binaries
|
|
# uses: actions/download-artifact@v4
|
|
# with:
|
|
# name: bins
|
|
# path: .
|
|
# - name: Unzip binaries
|
|
# run: |
|
|
# mkdir -p ./bins/current
|
|
# tar -xvf ./bins.tar.gz --strip-components=1 -C ./bins/current
|
|
# - run: ./tests/compat/test-compat.sh 0.6.0
|