Some checks failed
go: build dev binaries / cleanup (push) Successful in 4s
Codespell / Check for spelling errors (push) Failing after 3s
docker: build dev containers / build-rust-binaries (amd64, x86_64-unknown-linux-musl) (push) Failing after 3s
docker: build dev containers / build-dev-containers (push) Has been skipped
docker: build dev containers / build-rust-binaries (arm64, true, aarch64-unknown-linux-musl) (push) Failing after 3s
End to End / FUSE Mount (push) Failing after 2s
EC Integration Tests / EC Integration Tests (push) Failing after 30s
FUSE DLM Integration Tests / FUSE DLM Integration Tests (push) Failing after 3s
FUSE Volume Server Failover Tests / FUSE Volume Server Failover (push) Failing after 3s
FUSE Integration Tests / FUSE Integration Testing (push) Failing after 2s
FUSE P2P Peer Chunk Sharing Integration Tests / FUSE P2P Peer Chunk Sharing (push) Failing after 3s
go: build binary / Go Vet (push) Failing after 2s
go: build binary / Go Vet 32-bit (push) Failing after 3s
go: build binary / Build (push) Failing after 4s
go: build binary / Build cross-platform (freebsd/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/amd64) (push) Failing after 3s
go: build binary / Build cross-platform (darwin/arm64) (push) Failing after 3s
go: build binary / Build cross-platform (windows/arm64) (push) Failing after 3s
go: build binary / Test (push) Failing after 2s
go: build binary / Test 32-bit (push) Failing after 3s
helm: lint and test charts / lint-test (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (11) (push) Failing after 3s
Java Client Integration Tests / Java Integration Tests (17) (push) Failing after 3s
go: build dev binaries / build_dev_linux_windows (amd64, linux) (push) Failing after 2s
go: build dev binaries / build_dev_linux_windows (amd64, windows) (push) Failing after 3s
go: build dev binaries / build_dev_darwin (amd64, darwin) (push) Has been skipped
go: build dev binaries / build_dev_darwin (arm64, darwin) (push) Has been skipped
Java Client Unit Tests / Java Unit Tests (11) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (17) (push) Failing after 2s
Java Client Unit Tests / Java Unit Tests (21) (push) Failing after 3s
Java Client Unit Tests / Java Unit Tests (8) (push) Failing after 3s
Kafka Quick Test (Load Test with Schema Registry) / Kafka Client Load Test (Quick) (push) Failing after 3s
Kafka Gateway Tests / Kafka Unit Tests (unit-tests-1) (push) Failing after 11s
Kafka Gateway Tests / Kafka Integration Tests (Critical) (integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka End-to-End Tests (with SMQ) (e2e-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Consumer Group Tests (Highly Isolated) (consumer-group-1) (push) Failing after 2s
Kafka Gateway Tests / Kafka Client Compatibility (with SMQ) (client-compat-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka SMQ Integration Tests (Full Stack) (smq-integration-1) (push) Failing after 3s
Kafka Gateway Tests / Kafka Protocol Tests (Isolated) (protocol-1) (push) Failing after 3s
KMS Tests / KMS Provider Integration Tests (push) Failing after 2s
KMS Tests / S3 KMS End-to-End Tests (push) Failing after 3s
Master Cold Start Tests / Master Cold Start Tests (push) Failing after 4s
Metadata Subscribe Integration Tests / Metadata Subscribe Integration Tests (push) Failing after 3s
Multi-Master Tests / Multi-Master Failover Tests (push) Failing after 3s
Performance / CPU and Heap Profile (push) Failing after 2s
Performance / S3 Read/Write Benchmark (rust volume) (push) Failing after 3s
pjdfstest POSIX Compliance / pjdfstest (push) Failing after 2s
Plugin Worker Integration Tests / Plugin Worker: erasure_coding (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: vacuum (push) Failing after 3s
Rust Volume Server Tests / Rust Integration Tests (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 1) (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 1) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 2) (push) Failing after 3s
Rust Volume Server Tests / Go Tests with Rust Volume (grpc - Shard 3) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Distributed Tests (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Performance Tests (push) Failing after 3s
Performance / Throughput Benchmark (go volume) (push) Failing after 3s
Performance / Throughput Benchmark (rust volume) (push) Failing after 2s
Performance / S3 Read/Write Benchmark (go volume) (push) Failing after 3s
Plugin Worker Integration Tests / Plugin Worker: volume_balance (push) Failing after 3s
PostgreSQL Gateway Tests / PostgreSQL Basic Tests (push) Failing after 3s
Rust Volume Server Tests / Rust Unit Tests (push) Failing after 2s
Rust Volume Server Tests / Go Tests with Rust Volume (http - Shard 3) (push) Failing after 3s
Rust Plugin Worker Tests / Rust Plugin Worker Build and Unit Tests (push) Failing after 3s
rust: build dev volume server binaries / cleanup (push) Successful in 3s
S3 ETag and ACL Tests / S3 ETag + ACL Integration Tests (push) Failing after 3s
S3 IAM Integration Tests / IAM Unit Tests (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (advanced) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (basic) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (group) (push) Failing after 3s
S3 IAM Integration Tests / S3 IAM Integration Tests (policy-enforcement) (push) Failing after 2s
S3 IAM Integration Tests / S3 IAM Integration Tests (sts) (push) Failing after 4s
S3 Keycloak Integration Tests / S3 Keycloak Integration Tests (push) Failing after 3s
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.11) (push) Failing after 3s
S3 PyArrow Parquet Tests / Go Unit Tests (Implicit Directory) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.12) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-amd64, x86_64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-darwin (darwin-arm64, aarch64-apple-darwin) (push) Has been cancelled
rust: build dev volume server binaries / build-rust-volume-dev-linux (linux-amd64, x86_64-unknown-linux-gnu) (push) Has been cancelled
S3 PyArrow Parquet Tests / PyArrow Parquet Tests (Python 3.9) (push) Has been cancelled
S3 Proxy Signature Tests / S3 Proxy Signature Verification Tests (push) Has been cancelled
S3 SDK V2 Route Disambiguation Tests / S3 SDK V2 Routing Tests (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (quick) (push) Has been cancelled
S3 SSE Tests / S3 SSE Compatibility Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Metadata Persistence Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Copy Operations Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Multipart Upload Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Performance Test (push) Has been cancelled
S3 SSE Tests / S3 Volume Encryption Test (push) Has been cancelled
S3 SSE Tests / S3 SSE Integration Tests (comprehensive) (push) Has been cancelled
Spark Integration Tests / Spark Integration Tests (push) Failing after 2s
Telemetry Integration Tests / telemetry-integration-test (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 1) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 1) (push) Failing after 3s
Ceph S3 tests / Basic S3 tests (KV store) (push) Has been cancelled
Ceph S3 tests / S3 Versioning & Object Lock tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Unit Tests (push) Failing after 3s
Ceph S3 tests / S3 CORS tests (push) Has been cancelled
Ceph S3 tests / SeaweedFS Custom S3 Copy tests (push) Has been cancelled
Ceph S3 tests / Basic S3 tests (SQL store) (push) Has been cancelled
test s3 over https using aws-cli / awscli-tests (push) Has been cancelled
TLS Rotation Integration Tests / TLS Rotation Integration Tests (push) Has been cancelled
Vacuum Integration Tests / Vacuum Integration Tests (push) Has been cancelled
S3 Policy Integration Tests / S3 Policy Variables Integration Tests (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (advanced-policy) (push) Failing after 3s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (basic-policy) (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Enforcement Integration Tests (contextual-policy) (push) Failing after 4s
S3 Policy Integration Tests / Trusted Proxy Detection Tests (push) Failing after 2s
S3 Policy Integration Tests / S3 Policy Shell Integration Tests (push) Failing after 3s
Samba on FUSE Integration / samba-integration (push) Failing after 2s
SFTP Integration Tests / SFTP Integration Testing (push) Failing after 3s
terraform: validate and test modules / fmt, validate, plan-level tests (push) Failing after 3s
terraform: validate and test modules / local cluster smoke test (real weed) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 3) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (grpc - Shard 2) (push) Failing after 3s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 2) (push) Failing after 2s
Volume Server Integration Tests / Volume Server Integration Tests (http - Shard 3) (push) Failing after 5s
mount: windows conformance / WinFsp conformance (push) Has been cancelled
mount: windows / Mount on Windows (push) Has been cancelled
842 lines
28 KiB
YAML
842 lines
28 KiB
YAML
name: "Kafka Gateway Tests"
|
|
|
|
on:
|
|
push:
|
|
branches: [ master ]
|
|
paths:
|
|
- 'weed/mq/**'
|
|
- 'weed/pb/mq_pb/**'
|
|
- 'weed/pb/schema_pb/**'
|
|
- 'test/kafka/**'
|
|
- 'go.mod'
|
|
- 'go.sum'
|
|
- '.github/workflows/kafka-tests.yml'
|
|
pull_request:
|
|
branches: [ master ]
|
|
paths:
|
|
- 'weed/mq/**'
|
|
- 'weed/pb/mq_pb/**'
|
|
- 'weed/pb/schema_pb/**'
|
|
- 'test/kafka/**'
|
|
- 'go.mod'
|
|
- 'go.sum'
|
|
- '.github/workflows/kafka-tests.yml'
|
|
|
|
concurrency:
|
|
group: ${{ github.head_ref }}/kafka-tests
|
|
cancel-in-progress: true
|
|
|
|
# Force different runners for better isolation
|
|
env:
|
|
FORCE_RUNNER_SEPARATION: true
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
kafka-unit-tests:
|
|
name: Kafka Unit Tests
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 5
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
container-id: [unit-tests-1]
|
|
container:
|
|
image: golang:1.26-alpine
|
|
options: --cpus 1.0 --memory 1g --hostname kafka-unit-${{ matrix.container-id }}
|
|
env:
|
|
GOMAXPROCS: 1
|
|
CGO_ENABLED: 0
|
|
CONTAINER_ID: ${{ matrix.container-id }}
|
|
steps:
|
|
- name: Set up Go 1.x
|
|
uses: actions/setup-go@v7
|
|
with:
|
|
go-version: ^1.26
|
|
id: go
|
|
|
|
- name: Check out code
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup Container Environment
|
|
run: |
|
|
apk add --no-cache git
|
|
ulimit -n 1024 || echo "Warning: Could not set file descriptor limit"
|
|
|
|
- name: Get dependencies
|
|
run: |
|
|
cd test/kafka
|
|
go mod download
|
|
go mod tidy
|
|
|
|
- name: Run Kafka Gateway Unit Tests
|
|
run: |
|
|
cd test/kafka
|
|
# Set process limits for container isolation
|
|
ulimit -n 512 || echo "Warning: Could not set file descriptor limit"
|
|
ulimit -u 100 || echo "Warning: Could not set process limit"
|
|
go test -v -timeout 10s ./unit/...
|
|
|
|
kafka-integration-tests:
|
|
name: Kafka Integration Tests (Critical)
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 5
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
container-id: [integration-1]
|
|
container:
|
|
image: golang:1.26-alpine
|
|
options: --cpus 2.0 --memory 2g --ulimit nofile=1024:1024 --hostname kafka-integration-${{ matrix.container-id }}
|
|
env:
|
|
GOMAXPROCS: 2
|
|
CGO_ENABLED: 0
|
|
KAFKA_TEST_ISOLATION: "true"
|
|
CONTAINER_ID: ${{ matrix.container-id }}
|
|
steps:
|
|
- name: Set up Go 1.x
|
|
uses: actions/setup-go@v7
|
|
with:
|
|
go-version: ^1.26
|
|
id: go
|
|
|
|
- name: Check out code
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup Integration Container Environment
|
|
run: |
|
|
apk add --no-cache git procps
|
|
ulimit -n 2048 || echo "Warning: Could not set file descriptor limit"
|
|
|
|
- name: Get dependencies
|
|
run: |
|
|
cd test/kafka
|
|
go mod download
|
|
go mod tidy
|
|
|
|
- name: Run Integration Tests
|
|
run: |
|
|
cd test/kafka
|
|
# Higher limits for integration tests
|
|
ulimit -n 1024 || echo "Warning: Could not set file descriptor limit"
|
|
ulimit -u 200 || echo "Warning: Could not set process limit"
|
|
go test -v -timeout 90s ./integration/...
|
|
env:
|
|
GOMAXPROCS: 2
|
|
|
|
kafka-e2e-tests:
|
|
name: Kafka End-to-End Tests (with SMQ)
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
container-id: [e2e-1]
|
|
container:
|
|
image: golang:1.26-alpine
|
|
options: --cpus 2.0 --memory 2g --hostname kafka-e2e-${{ matrix.container-id }}
|
|
env:
|
|
GOMAXPROCS: 2
|
|
CGO_ENABLED: 0
|
|
KAFKA_E2E_ISOLATION: "true"
|
|
CONTAINER_ID: ${{ matrix.container-id }}
|
|
steps:
|
|
- name: Check out code
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Set up Go 1.x
|
|
uses: actions/setup-go@v7
|
|
with:
|
|
go-version: ^1.26
|
|
cache: true
|
|
cache-dependency-path: |
|
|
**/go.sum
|
|
id: go
|
|
|
|
- name: Setup E2E Container Environment
|
|
run: |
|
|
apk add --no-cache git procps curl netcat-openbsd
|
|
ulimit -n 2048 || echo "Warning: Could not set file descriptor limit"
|
|
|
|
- name: Warm Go module cache
|
|
run: |
|
|
# Warm cache for root module
|
|
go mod download || true
|
|
# Warm cache for kafka test module
|
|
cd test/kafka
|
|
go mod download || true
|
|
|
|
- name: Get dependencies
|
|
run: |
|
|
cd test/kafka
|
|
# Use go mod download with timeout to prevent hanging
|
|
timeout 90s go mod download || echo "Warning: Dependency download timed out, continuing with cached modules"
|
|
go mod tidy
|
|
|
|
- name: Build and start SeaweedFS MQ
|
|
run: |
|
|
set -e
|
|
cd $GITHUB_WORKSPACE
|
|
# Build weed binary
|
|
go build -o /usr/local/bin/weed ./weed
|
|
# Start SeaweedFS components with MQ brokers
|
|
export WEED_DATA_DIR=/tmp/seaweedfs-e2e-$RANDOM
|
|
mkdir -p "$WEED_DATA_DIR"
|
|
|
|
# Start SeaweedFS server (master, volume, filer) with consistent IP advertising
|
|
nohup weed -v 1 server \
|
|
-ip="127.0.0.1" \
|
|
-ip.bind="0.0.0.0" \
|
|
-dir="$WEED_DATA_DIR" \
|
|
-master.raftHashicorp \
|
|
-master.port=9333 \
|
|
-volume.port=8081 \
|
|
-filer.port=8888 \
|
|
-filer=true \
|
|
-metricsPort=9325 \
|
|
-master.peers=none \
|
|
> /tmp/weed-server.log 2>&1 &
|
|
|
|
# Wait for master to be ready
|
|
for i in $(seq 1 30); do
|
|
if curl -s http://127.0.0.1:9333/cluster/status >/dev/null; then
|
|
echo "SeaweedFS master HTTP is up"; break
|
|
fi
|
|
echo "Waiting for SeaweedFS master HTTP... ($i/30)"; sleep 1
|
|
done
|
|
|
|
# Wait for master gRPC to be ready (this is what broker discovery uses)
|
|
echo "Waiting for master gRPC port..."
|
|
for i in $(seq 1 30); do
|
|
if nc -z 127.0.0.1 19333; then
|
|
echo "✓ SeaweedFS master gRPC is up (port 19333)"
|
|
break
|
|
fi
|
|
echo " Waiting for master gRPC... ($i/30)"; sleep 1
|
|
done
|
|
|
|
# Give server time to initialize all components including gRPC services
|
|
echo "Waiting for SeaweedFS components to initialize..."
|
|
sleep 15
|
|
|
|
# Additional wait specifically for gRPC services to be ready for streaming
|
|
echo "Allowing extra time for master gRPC streaming services to initialize..."
|
|
sleep 10
|
|
|
|
# Start MQ broker with maximum verbosity for debugging
|
|
echo "Starting MQ broker..."
|
|
nohup weed -v 3 mq.broker \
|
|
-master="127.0.0.1:9333" \
|
|
-ip="127.0.0.1" \
|
|
-port=17777 \
|
|
-logFlushInterval=0 \
|
|
> /tmp/weed-mq-broker.log 2>&1 &
|
|
|
|
# Wait for broker to be ready with better error reporting
|
|
sleep 15
|
|
broker_ready=false
|
|
for i in $(seq 1 20); do
|
|
if nc -z 127.0.0.1 17777; then
|
|
echo "SeaweedFS MQ broker is up"
|
|
broker_ready=true
|
|
break
|
|
fi
|
|
echo "Waiting for MQ broker... ($i/20)"; sleep 1
|
|
done
|
|
|
|
# Give broker additional time to register with master
|
|
if [ "$broker_ready" = true ]; then
|
|
echo "Allowing broker to register with master..."
|
|
sleep 30
|
|
|
|
# Check if broker is properly registered by querying cluster nodes
|
|
echo "Cluster status after broker registration:"
|
|
curl -s "http://127.0.0.1:9333/cluster/status" || echo "Could not check cluster status"
|
|
|
|
echo "Checking cluster topology (includes registered components):"
|
|
curl -s "http://127.0.0.1:9333/dir/status" | head -20 || echo "Could not check dir status"
|
|
|
|
echo "Verifying broker discovery via master client debug:"
|
|
echo "If broker registration is successful, it should appear in dir status"
|
|
|
|
echo "Testing gRPC connectivity with weed binary:"
|
|
echo "This simulates what the gateway does during broker discovery..."
|
|
timeout 10s weed shell -master=127.0.0.1:9333 -filer=127.0.0.1:8888 > /tmp/shell-test.log 2>&1 || echo "weed shell test completed or timed out - checking logs..."
|
|
echo "Shell test results:"
|
|
cat /tmp/shell-test.log 2>/dev/null | head -10 || echo "No shell test logs"
|
|
fi
|
|
|
|
# Check if broker failed to start and show logs
|
|
if [ "$broker_ready" = false ]; then
|
|
echo "ERROR: MQ broker failed to start. Broker logs:"
|
|
cat /tmp/weed-mq-broker.log || echo "No broker logs found"
|
|
echo "Server logs:"
|
|
tail -20 /tmp/weed-server.log || echo "No server logs found"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Run End-to-End Tests
|
|
run: |
|
|
cd test/kafka
|
|
# Higher limits for E2E tests
|
|
ulimit -n 1024 || echo "Warning: Could not set file descriptor limit"
|
|
ulimit -u 200 || echo "Warning: Could not set process limit"
|
|
|
|
# Allow additional time for all background processes to settle
|
|
echo "Allowing additional settlement time for SeaweedFS ecosystem..."
|
|
sleep 15
|
|
|
|
# Run tests and capture result
|
|
if ! go test -v -timeout 180s ./e2e/...; then
|
|
echo "========================================="
|
|
echo "Tests failed! Showing debug information:"
|
|
echo "========================================="
|
|
echo "Server logs (last 50 lines):"
|
|
tail -50 /tmp/weed-server.log || echo "No server logs"
|
|
echo "========================================="
|
|
echo "Broker logs (last 50 lines):"
|
|
tail -50 /tmp/weed-mq-broker.log || echo "No broker logs"
|
|
echo "========================================="
|
|
exit 1
|
|
fi
|
|
env:
|
|
GOMAXPROCS: 2
|
|
SEAWEEDFS_MASTERS: 127.0.0.1:9333
|
|
|
|
kafka-consumer-group-tests:
|
|
name: Kafka Consumer Group Tests (Highly Isolated)
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
container-id: [consumer-group-1]
|
|
container:
|
|
image: golang:1.26-alpine
|
|
options: --cpus 1.0 --memory 2g --ulimit nofile=512:512 --hostname kafka-consumer-${{ matrix.container-id }}
|
|
env:
|
|
GOMAXPROCS: 1
|
|
CGO_ENABLED: 0
|
|
KAFKA_CONSUMER_ISOLATION: "true"
|
|
CONTAINER_ID: ${{ matrix.container-id }}
|
|
steps:
|
|
- name: Check out code
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Set up Go 1.x
|
|
uses: actions/setup-go@v7
|
|
with:
|
|
go-version: ^1.26
|
|
cache: true
|
|
cache-dependency-path: |
|
|
**/go.sum
|
|
id: go
|
|
|
|
- name: Setup Consumer Group Container Environment
|
|
run: |
|
|
apk add --no-cache git procps curl netcat-openbsd
|
|
ulimit -n 256 || echo "Warning: Could not set file descriptor limit"
|
|
|
|
- name: Warm Go module cache
|
|
run: |
|
|
# Warm cache for root module
|
|
go mod download || true
|
|
# Warm cache for kafka test module
|
|
cd test/kafka
|
|
go mod download || true
|
|
|
|
- name: Get dependencies
|
|
run: |
|
|
cd test/kafka
|
|
# Use go mod download with timeout to prevent hanging
|
|
timeout 90s go mod download || echo "Warning: Dependency download timed out, continuing with cached modules"
|
|
go mod tidy
|
|
|
|
- name: Build and start SeaweedFS MQ
|
|
run: |
|
|
set -e
|
|
cd $GITHUB_WORKSPACE
|
|
# Build weed binary
|
|
go build -o /usr/local/bin/weed ./weed
|
|
# Start SeaweedFS components with MQ brokers
|
|
export WEED_DATA_DIR=/tmp/seaweedfs-mq-$RANDOM
|
|
mkdir -p "$WEED_DATA_DIR"
|
|
|
|
# Start SeaweedFS server (master, volume, filer) with consistent IP advertising
|
|
nohup weed -v 1 server \
|
|
-ip="127.0.0.1" \
|
|
-ip.bind="0.0.0.0" \
|
|
-dir="$WEED_DATA_DIR" \
|
|
-master.raftHashicorp \
|
|
-master.port=9333 \
|
|
-volume.port=8081 \
|
|
-filer.port=8888 \
|
|
-filer=true \
|
|
-metricsPort=9325 \
|
|
-master.peers=none \
|
|
> /tmp/weed-server.log 2>&1 &
|
|
|
|
# Wait for master to be ready
|
|
for i in $(seq 1 30); do
|
|
if curl -s http://127.0.0.1:9333/cluster/status >/dev/null; then
|
|
echo "SeaweedFS master HTTP is up"; break
|
|
fi
|
|
echo "Waiting for SeaweedFS master HTTP... ($i/30)"; sleep 1
|
|
done
|
|
|
|
# Wait for master gRPC to be ready (this is what broker discovery uses)
|
|
echo "Waiting for master gRPC port..."
|
|
for i in $(seq 1 30); do
|
|
if nc -z 127.0.0.1 19333; then
|
|
echo "✓ SeaweedFS master gRPC is up (port 19333)"
|
|
break
|
|
fi
|
|
echo " Waiting for master gRPC... ($i/30)"; sleep 1
|
|
done
|
|
|
|
# Give server time to initialize all components including gRPC services
|
|
echo "Waiting for SeaweedFS components to initialize..."
|
|
sleep 15
|
|
|
|
# Additional wait specifically for gRPC services to be ready for streaming
|
|
echo "Allowing extra time for master gRPC streaming services to initialize..."
|
|
sleep 10
|
|
|
|
# Start MQ broker with maximum verbosity for debugging
|
|
echo "Starting MQ broker..."
|
|
nohup weed -v 3 mq.broker \
|
|
-master="127.0.0.1:9333" \
|
|
-ip="127.0.0.1" \
|
|
-port=17777 \
|
|
-logFlushInterval=0 \
|
|
> /tmp/weed-mq-broker.log 2>&1 &
|
|
|
|
# Wait for broker to be ready with better error reporting
|
|
sleep 15
|
|
broker_ready=false
|
|
for i in $(seq 1 20); do
|
|
if nc -z 127.0.0.1 17777; then
|
|
echo "SeaweedFS MQ broker is up"
|
|
broker_ready=true
|
|
break
|
|
fi
|
|
echo "Waiting for MQ broker... ($i/20)"; sleep 1
|
|
done
|
|
|
|
# Give broker additional time to register with master
|
|
if [ "$broker_ready" = true ]; then
|
|
echo "Allowing broker to register with master..."
|
|
sleep 30
|
|
|
|
# Check if broker is properly registered by querying cluster nodes
|
|
echo "Cluster status after broker registration:"
|
|
curl -s "http://127.0.0.1:9333/cluster/status" || echo "Could not check cluster status"
|
|
|
|
echo "Checking cluster topology (includes registered components):"
|
|
curl -s "http://127.0.0.1:9333/dir/status" | head -20 || echo "Could not check dir status"
|
|
|
|
echo "Verifying broker discovery via master client debug:"
|
|
echo "If broker registration is successful, it should appear in dir status"
|
|
|
|
echo "Testing gRPC connectivity with weed binary:"
|
|
echo "This simulates what the gateway does during broker discovery..."
|
|
timeout 10s weed shell -master=127.0.0.1:9333 -filer=127.0.0.1:8888 > /tmp/shell-test.log 2>&1 || echo "weed shell test completed or timed out - checking logs..."
|
|
echo "Shell test results:"
|
|
cat /tmp/shell-test.log 2>/dev/null | head -10 || echo "No shell test logs"
|
|
fi
|
|
|
|
# Check if broker failed to start and show logs
|
|
if [ "$broker_ready" = false ]; then
|
|
echo "ERROR: MQ broker failed to start. Broker logs:"
|
|
cat /tmp/weed-mq-broker.log || echo "No broker logs found"
|
|
echo "Server logs:"
|
|
tail -20 /tmp/weed-server.log || echo "No server logs found"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Run Consumer Group Tests
|
|
run: |
|
|
cd test/kafka
|
|
# Test consumer group functionality with explicit timeout
|
|
ulimit -n 512 || echo "Warning: Could not set file descriptor limit"
|
|
ulimit -u 100 || echo "Warning: Could not set process limit"
|
|
timeout 240s go test -v -run "^TestConsumerGroups" -timeout 180s ./integration/...
|
|
env:
|
|
GOMAXPROCS: 1
|
|
SEAWEEDFS_MASTERS: 127.0.0.1:9333
|
|
|
|
kafka-client-compatibility:
|
|
name: Kafka Client Compatibility (with SMQ)
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 25
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
container-id: [client-compat-1]
|
|
container:
|
|
image: golang:1.26-alpine
|
|
options: --cpus 1.0 --memory 1.5g --shm-size 256m --hostname kafka-client-${{ matrix.container-id }}
|
|
env:
|
|
GOMAXPROCS: 1
|
|
CGO_ENABLED: 0
|
|
KAFKA_CLIENT_ISOLATION: "true"
|
|
CONTAINER_ID: ${{ matrix.container-id }}
|
|
steps:
|
|
- name: Check out code
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Set up Go 1.x
|
|
uses: actions/setup-go@v7
|
|
with:
|
|
go-version: ^1.26
|
|
cache: true
|
|
cache-dependency-path: |
|
|
**/go.sum
|
|
id: go
|
|
|
|
- name: Setup Client Container Environment
|
|
run: |
|
|
apk add --no-cache git procps curl netcat-openbsd
|
|
ulimit -n 1024 || echo "Warning: Could not set file descriptor limit"
|
|
|
|
- name: Warm Go module cache
|
|
run: |
|
|
# Warm cache for root module
|
|
go mod download || true
|
|
# Warm cache for kafka test module
|
|
cd test/kafka
|
|
go mod download || true
|
|
|
|
- name: Get dependencies
|
|
run: |
|
|
cd test/kafka
|
|
timeout 90s go mod download || echo "Warning: Dependency download timed out, continuing with cached modules"
|
|
go mod tidy
|
|
|
|
- name: Build and start SeaweedFS MQ
|
|
run: |
|
|
set -e
|
|
cd $GITHUB_WORKSPACE
|
|
# Build weed binary
|
|
go build -o /usr/local/bin/weed ./weed
|
|
# Start SeaweedFS components with MQ brokers
|
|
export WEED_DATA_DIR=/tmp/seaweedfs-client-$RANDOM
|
|
mkdir -p "$WEED_DATA_DIR"
|
|
|
|
# Start SeaweedFS server (master, volume, filer) with consistent IP advertising
|
|
nohup weed -v 1 server \
|
|
-ip="127.0.0.1" \
|
|
-ip.bind="0.0.0.0" \
|
|
-dir="$WEED_DATA_DIR" \
|
|
-master.raftHashicorp \
|
|
-master.port=9333 \
|
|
-volume.port=8081 \
|
|
-filer.port=8888 \
|
|
-filer=true \
|
|
-metricsPort=9325 \
|
|
-master.peers=none \
|
|
> /tmp/weed-server.log 2>&1 &
|
|
|
|
# Wait for master to be ready
|
|
for i in $(seq 1 30); do
|
|
if curl -s http://127.0.0.1:9333/cluster/status >/dev/null; then
|
|
echo "SeaweedFS master HTTP is up"; break
|
|
fi
|
|
echo "Waiting for SeaweedFS master HTTP... ($i/30)"; sleep 1
|
|
done
|
|
|
|
# Wait for master gRPC to be ready (this is what broker discovery uses)
|
|
echo "Waiting for master gRPC port..."
|
|
for i in $(seq 1 30); do
|
|
if nc -z 127.0.0.1 19333; then
|
|
echo "✓ SeaweedFS master gRPC is up (port 19333)"
|
|
break
|
|
fi
|
|
echo " Waiting for master gRPC... ($i/30)"; sleep 1
|
|
done
|
|
|
|
# Give server time to initialize all components including gRPC services
|
|
echo "Waiting for SeaweedFS components to initialize..."
|
|
sleep 15
|
|
|
|
# Additional wait specifically for gRPC services to be ready for streaming
|
|
echo "Allowing extra time for master gRPC streaming services to initialize..."
|
|
sleep 10
|
|
|
|
# Start MQ broker with maximum verbosity for debugging
|
|
echo "Starting MQ broker..."
|
|
nohup weed -v 3 mq.broker \
|
|
-master="127.0.0.1:9333" \
|
|
-ip="127.0.0.1" \
|
|
-port=17777 \
|
|
-logFlushInterval=0 \
|
|
> /tmp/weed-mq-broker.log 2>&1 &
|
|
|
|
# Wait for broker to be ready with better error reporting
|
|
sleep 15
|
|
broker_ready=false
|
|
for i in $(seq 1 20); do
|
|
if nc -z 127.0.0.1 17777; then
|
|
echo "SeaweedFS MQ broker is up"
|
|
broker_ready=true
|
|
break
|
|
fi
|
|
echo "Waiting for MQ broker... ($i/20)"; sleep 1
|
|
done
|
|
|
|
# Give broker additional time to register with master
|
|
if [ "$broker_ready" = true ]; then
|
|
echo "Allowing broker to register with master..."
|
|
sleep 30
|
|
|
|
# Check if broker is properly registered by querying cluster nodes
|
|
echo "Cluster status after broker registration:"
|
|
curl -s "http://127.0.0.1:9333/cluster/status" || echo "Could not check cluster status"
|
|
|
|
echo "Checking cluster topology (includes registered components):"
|
|
curl -s "http://127.0.0.1:9333/dir/status" | head -20 || echo "Could not check dir status"
|
|
|
|
echo "Verifying broker discovery via master client debug:"
|
|
echo "If broker registration is successful, it should appear in dir status"
|
|
|
|
echo "Testing gRPC connectivity with weed binary:"
|
|
echo "This simulates what the gateway does during broker discovery..."
|
|
timeout 10s weed shell -master=127.0.0.1:9333 -filer=127.0.0.1:8888 > /tmp/shell-test.log 2>&1 || echo "weed shell test completed or timed out - checking logs..."
|
|
echo "Shell test results:"
|
|
cat /tmp/shell-test.log 2>/dev/null | head -10 || echo "No shell test logs"
|
|
fi
|
|
|
|
# Check if broker failed to start and show logs
|
|
if [ "$broker_ready" = false ]; then
|
|
echo "ERROR: MQ broker failed to start. Broker logs:"
|
|
cat /tmp/weed-mq-broker.log || echo "No broker logs found"
|
|
echo "Server logs:"
|
|
tail -20 /tmp/weed-server.log || echo "No server logs found"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Run Client Compatibility Tests
|
|
run: |
|
|
cd test/kafka
|
|
go test -v -run "^TestClientCompatibility" -timeout 180s ./integration/...
|
|
env:
|
|
GOMAXPROCS: 1
|
|
SEAWEEDFS_MASTERS: 127.0.0.1:9333
|
|
|
|
kafka-smq-integration-tests:
|
|
name: Kafka SMQ Integration Tests (Full Stack)
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
container-id: [smq-integration-1]
|
|
container:
|
|
image: golang:1.26-alpine
|
|
options: --cpus 1.0 --memory 2g --hostname kafka-smq-${{ matrix.container-id }}
|
|
env:
|
|
GOMAXPROCS: 1
|
|
CGO_ENABLED: 0
|
|
KAFKA_SMQ_INTEGRATION: "true"
|
|
CONTAINER_ID: ${{ matrix.container-id }}
|
|
steps:
|
|
- name: Check out code
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Set up Go 1.x
|
|
uses: actions/setup-go@v7
|
|
with:
|
|
go-version: ^1.26
|
|
cache: true
|
|
cache-dependency-path: |
|
|
**/go.sum
|
|
id: go
|
|
|
|
- name: Setup SMQ Integration Container Environment
|
|
run: |
|
|
apk add --no-cache git procps curl netcat-openbsd
|
|
ulimit -n 1024 || echo "Warning: Could not set file descriptor limit"
|
|
|
|
- name: Warm Go module cache
|
|
run: |
|
|
# Warm cache for root module
|
|
go mod download || true
|
|
# Warm cache for kafka test module
|
|
cd test/kafka
|
|
go mod download || true
|
|
|
|
- name: Get dependencies
|
|
run: |
|
|
cd test/kafka
|
|
timeout 90s go mod download || echo "Warning: Dependency download timed out, continuing with cached modules"
|
|
go mod tidy
|
|
|
|
- name: Build and start SeaweedFS MQ
|
|
run: |
|
|
set -e
|
|
cd $GITHUB_WORKSPACE
|
|
# Build weed binary
|
|
go build -o /usr/local/bin/weed ./weed
|
|
# Start SeaweedFS components with MQ brokers
|
|
export WEED_DATA_DIR=/tmp/seaweedfs-smq-$RANDOM
|
|
mkdir -p "$WEED_DATA_DIR"
|
|
|
|
# Start SeaweedFS server (master, volume, filer) with consistent IP advertising
|
|
nohup weed -v 1 server \
|
|
-ip="127.0.0.1" \
|
|
-ip.bind="0.0.0.0" \
|
|
-dir="$WEED_DATA_DIR" \
|
|
-master.raftHashicorp \
|
|
-master.port=9333 \
|
|
-volume.port=8081 \
|
|
-filer.port=8888 \
|
|
-filer=true \
|
|
-metricsPort=9325 \
|
|
-master.peers=none \
|
|
> /tmp/weed-server.log 2>&1 &
|
|
|
|
# Wait for master to be ready
|
|
for i in $(seq 1 30); do
|
|
if curl -s http://127.0.0.1:9333/cluster/status >/dev/null; then
|
|
echo "SeaweedFS master HTTP is up"; break
|
|
fi
|
|
echo "Waiting for SeaweedFS master HTTP... ($i/30)"; sleep 1
|
|
done
|
|
|
|
# Wait for master gRPC to be ready (this is what broker discovery uses)
|
|
echo "Waiting for master gRPC port..."
|
|
for i in $(seq 1 30); do
|
|
if nc -z 127.0.0.1 19333; then
|
|
echo "✓ SeaweedFS master gRPC is up (port 19333)"
|
|
break
|
|
fi
|
|
echo " Waiting for master gRPC... ($i/30)"; sleep 1
|
|
done
|
|
|
|
# Give server time to initialize all components including gRPC services
|
|
echo "Waiting for SeaweedFS components to initialize..."
|
|
sleep 15
|
|
|
|
# Additional wait specifically for gRPC services to be ready for streaming
|
|
echo "Allowing extra time for master gRPC streaming services to initialize..."
|
|
sleep 10
|
|
|
|
# Start MQ broker with maximum verbosity for debugging
|
|
echo "Starting MQ broker..."
|
|
nohup weed -v 3 mq.broker \
|
|
-master="127.0.0.1:9333" \
|
|
-ip="127.0.0.1" \
|
|
-port=17777 \
|
|
-logFlushInterval=0 \
|
|
> /tmp/weed-mq-broker.log 2>&1 &
|
|
|
|
# Wait for broker to be ready with better error reporting
|
|
sleep 15
|
|
broker_ready=false
|
|
for i in $(seq 1 20); do
|
|
if nc -z 127.0.0.1 17777; then
|
|
echo "SeaweedFS MQ broker is up"
|
|
broker_ready=true
|
|
break
|
|
fi
|
|
echo "Waiting for MQ broker... ($i/20)"; sleep 1
|
|
done
|
|
|
|
# Give broker additional time to register with master
|
|
if [ "$broker_ready" = true ]; then
|
|
echo "Allowing broker to register with master..."
|
|
sleep 30
|
|
|
|
# Check if broker is properly registered by querying cluster nodes
|
|
echo "Cluster status after broker registration:"
|
|
curl -s "http://127.0.0.1:9333/cluster/status" || echo "Could not check cluster status"
|
|
|
|
echo "Checking cluster topology (includes registered components):"
|
|
curl -s "http://127.0.0.1:9333/dir/status" | head -20 || echo "Could not check dir status"
|
|
|
|
echo "Verifying broker discovery via master client debug:"
|
|
echo "If broker registration is successful, it should appear in dir status"
|
|
|
|
echo "Testing gRPC connectivity with weed binary:"
|
|
echo "This simulates what the gateway does during broker discovery..."
|
|
timeout 10s weed shell -master=127.0.0.1:9333 -filer=127.0.0.1:8888 > /tmp/shell-test.log 2>&1 || echo "weed shell test completed or timed out - checking logs..."
|
|
echo "Shell test results:"
|
|
cat /tmp/shell-test.log 2>/dev/null | head -10 || echo "No shell test logs"
|
|
fi
|
|
|
|
# Check if broker failed to start and show logs
|
|
if [ "$broker_ready" = false ]; then
|
|
echo "ERROR: MQ broker failed to start. Broker logs:"
|
|
cat /tmp/weed-mq-broker.log || echo "No broker logs found"
|
|
echo "Server logs:"
|
|
tail -20 /tmp/weed-server.log || echo "No server logs found"
|
|
exit 1
|
|
fi
|
|
|
|
- name: Run SMQ Integration Tests
|
|
run: |
|
|
cd test/kafka
|
|
ulimit -n 512 || echo "Warning: Could not set file descriptor limit"
|
|
ulimit -u 100 || echo "Warning: Could not set process limit"
|
|
# Run the dedicated SMQ integration tests
|
|
go test -v -run "^TestSMQIntegration" -timeout 180s ./integration/...
|
|
env:
|
|
GOMAXPROCS: 1
|
|
SEAWEEDFS_MASTERS: 127.0.0.1:9333
|
|
|
|
kafka-protocol-tests:
|
|
name: Kafka Protocol Tests (Isolated)
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 5
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
container-id: [protocol-1]
|
|
container:
|
|
image: golang:1.26-alpine
|
|
options: --cpus 1.0 --memory 1g --tmpfs /tmp:exec --hostname kafka-protocol-${{ matrix.container-id }}
|
|
env:
|
|
GOMAXPROCS: 1
|
|
CGO_ENABLED: 0
|
|
KAFKA_PROTOCOL_ISOLATION: "true"
|
|
CONTAINER_ID: ${{ matrix.container-id }}
|
|
steps:
|
|
- name: Set up Go 1.x
|
|
uses: actions/setup-go@v7
|
|
with:
|
|
go-version: ^1.26
|
|
id: go
|
|
|
|
- name: Check out code
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup Protocol Container Environment
|
|
run: |
|
|
apk add --no-cache git procps
|
|
# Ensure proper permissions for test execution
|
|
chmod -R 755 /tmp || true
|
|
export TMPDIR=/tmp
|
|
export GOCACHE=/tmp/go-cache
|
|
mkdir -p $GOCACHE
|
|
chmod 755 $GOCACHE
|
|
|
|
- name: Get dependencies
|
|
run: |
|
|
cd test/kafka
|
|
go mod download
|
|
go mod tidy
|
|
|
|
- name: Run Protocol Tests
|
|
run: |
|
|
cd test/kafka
|
|
export TMPDIR=/tmp
|
|
export GOCACHE=/tmp/go-cache
|
|
# Run protocol tests from the weed/mq/kafka directory since they test the protocol implementation
|
|
cd ../../weed/mq/kafka
|
|
go test -v -run "^Test.*" -timeout 10s ./...
|
|
env:
|
|
GOMAXPROCS: 1
|
|
TMPDIR: /tmp
|
|
GOCACHE: /tmp/go-cache
|