Skip to content
Open

Dev #73

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
4da72be
Add Phase 1 implementation plan
cbaugus Feb 11, 2026
7c8ef06
Implement multi-step scenario execution engine (#26)
cbaugus Feb 11, 2026
1d6f8bc
Update Phase 1 plan with Issue #26 progress
cbaugus Feb 11, 2026
058795d
Add scenario metrics, worker integration, and tests (#26)
cbaugus Feb 11, 2026
bd7b3c0
Mark Issue #26 as complete in Phase 1 plan
cbaugus Feb 11, 2026
d485cd0
Merge feature/issue-26-multi-step-scenarios into develop
cbaugus Feb 11, 2026
2e3151d
Implement variable extraction from responses (#27)
cbaugus Feb 11, 2026
25f8daf
Update example to demonstrate variable extraction
cbaugus Feb 11, 2026
9ec09a9
Merge feature/issue-27-variable-extraction into develop
cbaugus Feb 11, 2026
937695e
Implement cookie and session management (#28)
cbaugus Feb 11, 2026
49059a9
Merge feature/issue-28-session-management into develop
cbaugus Feb 11, 2026
a6f7cb7
Implement configurable think times and delays (#29)
cbaugus Feb 11, 2026
3f13360
Merge feature/issue-29-think-times into develop
cbaugus Feb 11, 2026
eaafbfd
Implement response assertions framework (Issue #30 - Part 1)
cbaugus Feb 11, 2026
4d9eb49
Complete Issue #30: Response assertions framework (Part 2)
cbaugus Feb 11, 2026
ccb954a
Merge Issue #30: Response assertions framework
cbaugus Feb 11, 2026
da4640a
Implement percentile latency tracking (Issue #33)
cbaugus Feb 14, 2026
a8fcd66
Merge Issue #33: Percentile latency tracking
cbaugus Feb 14, 2026
30440fa
Update PHASE1_PLAN.md - Mark Issue #33 complete
cbaugus Feb 14, 2026
5297b24
Implement all HTTP methods support (Issue #32)
cbaugus Feb 14, 2026
cf0ca00
Merge Issue #32: All HTTP methods support
cbaugus Feb 14, 2026
2b5460f
Implement CSV data-driven testing (Issue #31)
cbaugus Feb 14, 2026
41187da
Merge Issue #31: CSV data-driven testing
cbaugus Feb 14, 2026
1d1536c
Implement error categorization (Issue #34)
cbaugus Feb 14, 2026
ae7736e
Merge Issue #34: Error categorization
cbaugus Feb 14, 2026
3828936
Add per-scenario throughput tracking (Issue #35)
cbaugus Feb 14, 2026
3b5343a
Merge feature/issue-35-per-scenario-throughput into develop/phase1-sc…
cbaugus Feb 14, 2026
b6691af
Update PHASE1_PLAN.md for completed Wave 3 issues
cbaugus Feb 14, 2026
36d97c7
Add connection pool statistics tracking (Issue #36)
cbaugus Feb 14, 2026
f2e1e8e
Merge feature/issue-36-connection-pool-stats into develop/phase1-scen…
cbaugus Feb 14, 2026
655e406
Update PHASE1_PLAN.md - Wave 3 Complete! 🎉
cbaugus Feb 14, 2026
bc88723
Add Phase 2 implementation plan
cbaugus Feb 14, 2026
be997b1
Add YAML configuration parser (Issue #37)
cbaugus Feb 14, 2026
056c2ea
Merge feature/issue-37-yaml-config-parser into phase2-advanced-features
cbaugus Feb 14, 2026
1a2286d
Update PHASE2_PLAN.md - Issue #37 complete
cbaugus Feb 14, 2026
e5e283c
Add comprehensive config schema validation (Issue #38)
cbaugus Feb 14, 2026
60bd71c
Merge feature/issue-38-config-schema-validation into phase2-advanced-…
cbaugus Feb 14, 2026
613dddb
Update PHASE2_PLAN.md - Wave 1 Complete! 🎉
cbaugus Feb 14, 2026
4ced8ab
Implement default value merging with precedence (Issue #39)
cbaugus Feb 14, 2026
e04ddbc
Merge Issue #39: Default value merging with precedence
cbaugus Feb 14, 2026
5f2e17b
Update PHASE2_PLAN.md: Mark Issue #39 as complete
cbaugus Feb 14, 2026
048d572
Implement environment variable overrides for YAML config (Issue #40)
cbaugus Feb 14, 2026
399df10
Merge Issue #40: Environment variable overrides for YAML config
cbaugus Feb 14, 2026
bcfef19
Update PHASE2_PLAN.md: Mark Issue #40 as complete
cbaugus Feb 14, 2026
a387d65
Implement config versioning and migration framework (Issue #41)
cbaugus Feb 14, 2026
593bdb1
Merge Issue #41: Config versioning and migration framework
cbaugus Feb 14, 2026
b646b78
Update PHASE2_PLAN.md: Mark Issue #41 complete, Wave 2 COMPLETE! 🎉
cbaugus Feb 14, 2026
ffc55c2
Implement enhanced scenario YAML definitions (Issue #42)
cbaugus Feb 14, 2026
ef786c6
Merge Issue #42: Enhanced scenario YAML definitions
cbaugus Feb 14, 2026
b04d363
Update PHASE2_PLAN.md: Mark Issue #42 complete
cbaugus Feb 14, 2026
670a784
Implement multi-scenario execution engine (Issue #43)
cbaugus Feb 14, 2026
5e13a48
Merge Issue #43: Multi-scenario execution engine
cbaugus Feb 14, 2026
813bfb9
Update PHASE2_PLAN.md - Wave 3 Complete
cbaugus Feb 14, 2026
5202074
Implement Issue #44: Config file hot-reload
cbaugus Feb 14, 2026
58bf1a9
Update PHASE2_PLAN.md - Issue #44 Complete
cbaugus Feb 14, 2026
1f72bdb
Implement Issue #45: Config examples and templates
cbaugus Feb 14, 2026
2032108
Update PHASE2_PLAN.md - Issue #45 Complete
cbaugus Feb 14, 2026
402cb21
Implement Issue #46: Config documentation generator
cbaugus Feb 14, 2026
c2b1c59
Update PHASE2_PLAN.md - Phase 2 COMPLETE!
cbaugus Feb 14, 2026
3580ce2
Add Docker support for containerized load testing
cbaugus Feb 14, 2026
bf26dec
Fix Docker build and enable containerized load testing
cbaugus Feb 14, 2026
a623758
Update DOCKER.md to reflect environment variable configuration
cbaugus Feb 14, 2026
26f0fab
Add load test scenarios documentation for e-commerce test target
cbaugus Feb 15, 2026
668dfcd
Merge Phase 2: Advanced Configuration System
cbaugus Feb 15, 2026
75f0d88
Add Docker Hub CI/CD pipeline
cbaugus Feb 15, 2026
664ccb0
Split CI/CD pipelines: main and dev branches
cbaugus Feb 15, 2026
989342f
Rename workflow files to {env}-build-cicd.yaml pattern
cbaugus Feb 15, 2026
648219f
Remove arm64 build from dev pipeline for faster builds
cbaugus Feb 15, 2026
19eb1b7
Remove artifact attestation from dev pipeline
cbaugus Feb 15, 2026
b6f7a99
Fix Docker Hub repo name: rust_loadtest not rust-loadtest
cbaugus Feb 15, 2026
229a937
Implement PERCENTILE_TRACKING_ENABLED configuration flag (#66)
cbaugus Feb 15, 2026
6aad1b4
Update README with memory configuration guidance
cbaugus Feb 15, 2026
2aab16b
Implement MAX_HISTOGRAM_LABELS to limit memory growth (#68)
cbaugus Feb 15, 2026
215080c
Document MAX_HISTOGRAM_LABELS in README
cbaugus Feb 15, 2026
e4b3003
Implement process memory usage metrics (#69)
cbaugus Feb 15, 2026
293b341
Document memory monitoring metrics in README
cbaugus Feb 15, 2026
2954d27
Implement periodic histogram rotation (#67)
cbaugus Feb 15, 2026
9ac0763
Document histogram rotation in README
cbaugus Feb 15, 2026
8df12aa
Implement Issue #72: Auto-OOM protection with automatic memory manage…
cbaugus Feb 15, 2026
5f1378b
Fix test compilation errors and ConfigWatcher Debug trait
cbaugus Feb 15, 2026
789a40b
Fix code formatting with cargo fmt
cbaugus Feb 15, 2026
090fe8a
Fix clippy linting errors for lib
cbaugus Feb 15, 2026
5610508
Apply cargo fmt to fix remaining formatting issues
cbaugus Feb 15, 2026
690124f
Fix final clippy linting issues
cbaugus Feb 15, 2026
70ca4e7
Fix ThinkTime usage in scenario_example
cbaugus Feb 15, 2026
caad930
Fix test compilation issues
cbaugus Feb 15, 2026
bca95bd
Add ThinkTime import to variable_extraction_tests
cbaugus Feb 15, 2026
43e03de
Add ThinkTime import to scenario_integration_tests
cbaugus Feb 15, 2026
a08e91b
Fix scenario_integration_tests: remove unused imports and wrap Duration
cbaugus Feb 15, 2026
32ea247
Fix scenario_worker_tests: use correct types and variants
cbaugus Feb 15, 2026
b6108a8
Apply cargo fmt to scenario_worker_tests
cbaugus Feb 15, 2026
6b914cb
Fix yaml_config_tests: correct VariableExtraction matching
cbaugus Feb 15, 2026
9c1c9e8
Fix critical memory leak from unconsumed HTTP response bodies (Issue …
cbaugus Feb 15, 2026
2018603
CRITICAL FIX: Stream response bodies in chunks to prevent memory accu…
cbaugus Feb 15, 2026
e0a3831
Fix deadlock in test_all_stats and add CI timeout safeguards (Issue #75)
cbaugus Feb 16, 2026
0d54015
Fix all 11 failing tests - add seconds support and fix histogram prec…
cbaugus Feb 16, 2026
7ee3704
Fix final 3 failing tests - update error message assertions
cbaugus Feb 16, 2026
c8c748d
Fix final 2 tests - handle verbose validation error messages
cbaugus Feb 16, 2026
931dd42
Fix formatting - break long assertion lines
cbaugus Feb 16, 2026
272fb87
Remove redundant client timeout config that broke integration tests
cbaugus Feb 16, 2026
5a4db8a
Mark assertion integration tests as ignored for CI
cbaugus Feb 17, 2026
b833acb
Fix assertion format in YAML templates
cbaugus Feb 17, 2026
b217ced
Migrate assertion integration tests to httpbin.org
cbaugus Feb 17, 2026
1a93e91
Fix formatting in assertion_integration_tests.rs
cbaugus Feb 17, 2026
b0ffd40
Fix extraction and assertion formats in YAML templates
cbaugus Feb 18, 2026
c550602
Fix extraction field name: use jsonPath instead of path
cbaugus Feb 18, 2026
942ac67
Fix jsonPath field names: assertions use 'path', extractions use 'jso…
cbaugus Feb 18, 2026
ae6baef
Mark all cookie session tests as #[ignore]
cbaugus Feb 18, 2026
93be454
Migrate csv_data_driven_tests to httpbin.org
cbaugus Feb 18, 2026
bcbaded
Fix env var leakage between env_override_tests
cbaugus Feb 20, 2026
8683f83
Fix env_override_tests with serial_test crate
cbaugus Feb 20, 2026
88ac1a6
Migrate error_categorization_tests to httpbin.org
cbaugus Feb 20, 2026
023bd30
Migrate http_methods_tests to httpbin.org for CI compatibility
cbaugus Feb 20, 2026
b1ca11d
Migrate per_scenario_throughput_tests to httpbin.org
cbaugus Feb 20, 2026
7b33b18
Fix percentile_tracking_tests: migrate to httpbin.org and fix HdrHist…
cbaugus Feb 20, 2026
548cf91
Migrate scenario_integration_tests to httpbin.org
cbaugus Feb 20, 2026
84208cd
Fix scenario_yaml_tests: use valid duration format (1s instead of 500ms)
cbaugus Feb 20, 2026
73afaca
Migrate think_time_tests to httpbin.org
cbaugus Feb 20, 2026
5561fea
Migrate variable_extraction_tests to httpbin.org
cbaugus Feb 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Build artifacts
target/
**/*.rs.bk

# IDE files
.vscode/
.idea/
*.swp
*.swo

# Git
.git/
.gitignore

# Documentation (except needed docs)
*.md
!README.md

# Docker files
Dockerfile
.dockerignore
docker-compose.yml

# Temporary files
*.tmp
*.log

# Test results
results/

# CI/CD
.github/
88 changes: 88 additions & 0 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# GitHub Actions Workflows

## Overview

This repository has two CI/CD pipelines:

### 1. Main Branch Pipeline (`main-build-cicd.yaml`)
- **Triggers on:** Push to `main` branch, PRs to main
- **Builds:** Two Docker images (standard + Chainguard)
- **Features:** Lint, test, SBOM generation, multi-platform support
- **Tags:** `latest` (main branch)

### 2. Dev Branch Pipeline (`dev-build-cicd.yaml`)
- **Triggers on:** Push to `dev` branch, PRs to dev
- **Builds:** Single Docker image (amd64 only for speed)
- **Features:** Fast builds with caching, artifact attestation
- **Tags:** `dev`, `dev-<sha>`

---

## Setup

### Docker Hub Credentials

1. **Create Docker Hub Access Token**
- Go to https://hub.docker.com/settings/security
- Click "New Access Token"
- Name: `github-actions`
- Permissions: Read, Write, Delete
- Copy the token

2. **Add GitHub Secrets**
- Go to your repo: Settings → Secrets and variables → Actions
- Add two secrets:
- `DOCKERHUB_USERNAME`: Your Docker Hub username
- `DOCKERHUB_TOKEN`: The access token from step 1

### Pipeline Details

#### Main Branch (`main-build-cicd.yaml`)
**Triggers:**
- Push to `main` branch
- Pull requests to `main`

**Process:**
1. Lint (rustfmt & clippy)
2. Run test suite
3. Build two Docker images:
- Standard Ubuntu-based image
- Minimal Chainguard static image
4. Generate SBOMs for both images
5. Push to Docker Hub

**Images:**
- `cbaugus/rust_loadtest:latest`
- `cbaugus/rust_loadtest:latest-Chainguard`

#### Dev Branch (`dev-build-cicd.yaml`)
**Triggers:**
- Push to `dev` branch
- Pull requests to `dev`
- Manual trigger via GitHub UI

**Process:**
1. Build Docker image (amd64 only)
2. Push to Docker Hub with caching

**Images:**
- `cbaugus/rust_loadtest:dev`
- `cbaugus/rust_loadtest:dev-<git-sha>`

**Platform:**
- `linux/amd64` (x86_64 only - optimized for faster dev builds)

### Usage

After the workflow runs, pull the image:

```bash
# Dev branch
docker pull cbaugus/rust-loadtest:dev

# Main/latest
docker pull cbaugus/rust-loadtest:latest

# Specific version
docker pull cbaugus/rust-loadtest:0.2.0
```
54 changes: 54 additions & 0 deletions .github/workflows/dev-build-cicd.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Dev Branch - Docker Build

on:
push:
branches:
- dev
pull_request:
branches:
- dev
workflow_dispatch:

env:
REGISTRY: docker.io
IMAGE_NAME: cbaugus/rust_loadtest

jobs:
build-and-push:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to Docker Hub
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Extract metadata (tags, labels)
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE_NAME }}
tags: |
# Tag with dev for dev branch
type=raw,value=dev
# Add SHA for traceability
type=sha,prefix=dev-

- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: linux/amd64
137 changes: 137 additions & 0 deletions .github/workflows/dev-cicd.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
name: Dev CI/CD

on:
push:
branches: [dev]
pull_request:
branches: [dev]
workflow_dispatch:

env:
REGISTRY: docker.io
IMAGE_NAME: cbaugus/rust_loadtest

jobs:
# Lint job - runs first to catch formatting/style issues early
lint:
name: Lint (rustfmt & clippy)
runs-on: ubuntu-latest
timeout-minutes: 10 # Prevent runaway linting
steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy

- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry/index
~/.cargo/registry/cache
~/.cargo/git/db
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-registry-

- name: Cache cargo build
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-cargo-build-lint-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-build-lint-

- name: Check formatting
run: cargo fmt --all --check

- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings

# Test job - runs after lint passes with strict timeouts
test:
name: Test Suite
runs-on: ubuntu-latest
needs: lint
timeout-minutes: 15 # ⚠️ CRITICAL: Prevent tests from running forever
steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo registry
uses: actions/cache@v4
with:
path: |
~/.cargo/registry/index
~/.cargo/registry/cache
~/.cargo/git/db
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-registry-

- name: Cache cargo build
uses: actions/cache@v4
with:
path: target
key: ${{ runner.os }}-cargo-build-test-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-build-test-

- name: Run unit tests
run: |
# Run tests with timeout per test to catch hanging tests
# --test-threads=1 runs tests serially to avoid conflicts with global state
cargo test --lib --all-features --verbose -- --test-threads=1
timeout-minutes: 10

- name: Run integration tests
run: |
# Integration tests may take longer, but still need timeout
cargo test --test '*' --all-features --verbose -- --test-threads=1
timeout-minutes: 10

# Build job - builds Docker image after tests pass
build-docker:
name: Build Docker Image
runs-on: ubuntu-latest
needs: test
if: github.event_name == 'push' # Only build on push, not PR
timeout-minutes: 20
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Extract metadata (tags, labels)
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.IMAGE_NAME }}
tags: |
# Tag with dev for dev branch
type=raw,value=dev
# Add SHA for traceability
type=sha,prefix=dev-

- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
platforms: linux/amd64
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: CI/CD

on:
push:
branches: ["**"]
branches: [main]
pull_request:
branches: [main]

Expand Down
Loading
Loading