- Added comprehensive bounds checking to prevent buffer overruns in multicall parsing - Implemented graduated validation system (Strict/Moderate/Permissive) to reduce false positives - Added LRU caching system for address validation with 10-minute TTL - Enhanced ABI decoder with missing Universal Router and Arbitrum-specific DEX signatures - Fixed duplicate function declarations and import conflicts across multiple files - Added error recovery mechanisms with multiple fallback strategies - Updated tests to handle new validation behavior for suspicious addresses - Fixed parser test expectations for improved validation system - Applied gofmt formatting fixes to ensure code style compliance - Fixed mutex copying issues in monitoring package by introducing MetricsSnapshot - Resolved critical security vulnerabilities in heuristic address extraction - Progress: Updated TODO audit from 10% to 35% complete 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
4.6 KiB
Local CI/CD with Drone & Harness
This project now treats GitHub Actions configs as legacy. The authoritative automation lives in the Drone and Harness definitions checked into the repository.
Running the Drone pipelines locally
Prerequisites:
- Docker Engine available (for the Drone runner images).
droneCLI installed (brew install drone-cliorgo install github.com/harness/drone-cli/drone@latest).
Common commands:
# Execute the primary test suite locally
DRONE_GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) \
DRONE_COMMIT_SHA=$(git rev-parse HEAD) \
drone exec --pipeline test-suite
# Run the security pipeline (same environment variables as above)
drone exec --pipeline security-suite
# Kick off the optional integration run (requires RPC endpoints/mocks)
drone exec --pipeline integration-opt-in
Optional tags:
legacyenables the archived integration suites (RPC-heavy).forkedenables the fork/anvil smoke tests (e.g., flash swap executor).
Pipeline summary (mirrors historical GitHub jobs):
| Drone Stage | What it Does |
|---|---|
setup-go-cache |
Warm caches, verify modules. |
lint |
golangci-lint with 10m timeout. |
unit-tests |
Full go test -race -cover ./.... |
build-binary |
Compiles ./cmd/mev-bot into bin/mev-bot. |
smoke-start |
Boots the binary for 5s using a test encryption key (expected to fail without keystore). |
math-audit |
Runs tools/math-audit and validates artifacts. |
simulate-profit |
Executes ./scripts/run_profit_simulation.sh. |
docker-build |
Dry-run Docker build via plugins/docker. |
security-suite |
Gosec, govulncheck, Nancy, and fuzz tests for pkg/security. |
integration-opt-in |
Executes go test -tags=integration ./... when explicitly triggered. |
Harness pipeline hand-off
Harness orchestration focuses on promotion to staging/production. See harness/pipelines/staging.yaml for the canonical workflow. Use Harness CLI (harness pipeline execute ...) or the UI to run the same stages locally.
Running the staging workflow without Harness
For offline validation you can mirror the Harness stages with the helper script scripts/staging-pipeline-local.sh. Every stage runs inside a container using either Podman or Docker (auto-detected, or honour LOCAL_STAGING_RUNTIME). It executes the same lint, test, audit, simulation, image build, and Helm deployment steps that the Harness staging_promotion pipeline performs.
# end-to-end local staging run (writes logs under reports/ci/local-staging)
./scripts/staging-pipeline-local.sh
# example with custom image tag and real Helm upgrade instead of dry-run
LOCAL_STAGING_IMAGE_TAG=$(git rev-parse --short HEAD) \
LOCAL_STAGING_HELM_DRY_RUN=false \
./scripts/staging-pipeline-local.sh
# skip Docker and deploy stages (lint/tests/audit/simulation only)
LOCAL_STAGING_SKIP_DOCKER=true \
LOCAL_STAGING_SKIP_DEPLOY=true \
./scripts/staging-pipeline-local.sh
Key environment toggles:
LOCAL_STAGING_BRANCH– branch recorded in logs (defaults togit rev-parse --abbrev-ref HEAD).LOCAL_STAGING_RUNTIME– forcedockerorpodman(defaults to auto-detect).LOCAL_STAGING_IMAGE_NAME,LOCAL_STAGING_IMAGE_TAG,LOCAL_STAGING_IMAGE_TAR– Docker image reference and saved tarball path.LOCAL_STAGING_SKIP_DOCKER– skip the Docker build/save stage whentrue.LOCAL_STAGING_HELM_DRY_RUN– set tofalseto perform a real Helm upgrade; defaults totrue(safe dry-run).LOCAL_STAGING_SKIP_DEPLOY– skip the Helm/Kubernetes stage whentrue.LOCAL_STAGING_KUBECONFIG– path to the kubeconfig file mounted inside the Helm/Kubectl containers (defaults to~/.kube/config).
The script only needs a container runtime and will pull the required tool images (golang:1.24, golangci-lint, helm, kubectl). Logs and artifacts are saved in reports/ci/local-staging, mirroring the Harness pipeline output layout.
Migrating from GitHub Actions
.github/workflows/remains for reference only (manual dispatch only). New checks must be added to Drone or Harness.- Update the Agent checklist (
AGENTS.md) when a GitHub workflow is fully retired. - Security and compliance reporting artifacts still upload to
reports/for archival.
Troubleshooting
- Drone steps run inside containers; ensure required host folders (e.g.,
reports/) are writable. - Some integration tests require RPC endpoints. Set environment variables (
ARBITRUM_RPC_ENDPOINT, etc.) or skip the pipeline. - For Harness, secrets mount from the Harness secret manager—you will need the CLI logged in to your Harness account before executing pipelines locally.