name: "Volume Server Integration Tests" on: pull_request: branches: [ master ] paths: - 'test/volume_server/**' - 'weed/server/**' - 'weed/storage/**' - 'weed/pb/volume_server.proto' - 'weed/pb/volume_server_pb/**' - '.github/workflows/volume-server-integration-tests.yml' push: branches: [ master, main ] paths: - 'test/volume_server/**' - 'weed/server/**' - 'weed/storage/**' - 'weed/pb/volume_server.proto' - 'weed/pb/volume_server_pb/**' - '.github/workflows/volume-server-integration-tests.yml' concurrency: group: ${{ github.head_ref || github.ref }}/volume-server-integration-tests cancel-in-progress: true permissions: contents: read env: TEST_TIMEOUT: '30m' # Keep in step with the length of matrix.shard below. SHARD_COUNT: 3 jobs: volume-server-integration-tests: name: Volume Server Integration Tests (${{ matrix.test-type }} - Shard ${{ matrix.shard }}) runs-on: ubuntu-22.04 timeout-minutes: 45 strategy: fail-fast: false matrix: test-type: [grpc, http] shard: [1, 2, 3] steps: - name: Checkout code uses: actions/checkout@v7 - name: Set up Go uses: actions/setup-go@v7 with: go-version-file: 'go.mod' - name: Build SeaweedFS binary run: | cd weed go build -o weed . chmod +x weed ./weed version # Dealing the listed tests out one by one keeps the shards even. Bucketing # them by first letter did not: names cluster, so ^Test[I-S] drew 50 of # the 114 grpc tests and ran nearly twice as long as the other two shards. - name: Select this shard's tests env: TEST_TYPE: ${{ matrix.test-type }} SHARD: ${{ matrix.shard }} run: | tests=$(go test ./test/volume_server/"$TEST_TYPE"/... -list '.*' | grep '^Test' | sort -u) # An empty list would make -run match nothing and the shard pass vacuously. [ -n "$tests" ] || { echo "listed no tests in test/volume_server/$TEST_TYPE"; exit 1; } selected=$(echo "$tests" | awk -v n="$SHARD_COUNT" -v i="$SHARD" 'NR % n == i - 1') echo "shard $SHARD of $SHARD_COUNT runs $(echo "$selected" | wc -l) of $(echo "$tests" | wc -l) tests" echo "TEST_PATTERN=^($(echo "$selected" | paste -sd'|' -))\$" >> "$GITHUB_ENV" - name: Run volume server integration tests env: WEED_BINARY: ${{ github.workspace }}/weed/weed run: | echo "Running volume server integration tests for ${{ matrix.test-type }} (Shard ${{ matrix.shard }} of ${SHARD_COUNT})..." go test -v -count=1 -timeout=${{ env.TEST_TIMEOUT }} ./test/volume_server/${{ matrix.test-type }}/... -run "${TEST_PATTERN}" - name: Collect logs on failure if: failure() run: | mkdir -p /tmp/volume-server-it-logs find /tmp -maxdepth 1 -type d -name "seaweedfs_volume_server_it_*" -print -exec cp -r {} /tmp/volume-server-it-logs/ \; || true - name: Archive logs on failure if: failure() uses: actions/upload-artifact@v7 with: name: volume-server-integration-test-logs path: /tmp/volume-server-it-logs/ if-no-files-found: warn retention-days: 7 - name: Test summary if: always() run: | echo "## Volume Server Integration Test Summary (${{ matrix.test-type }} - Shard ${{ matrix.shard }})" >> "$GITHUB_STEP_SUMMARY" echo "- Suite: test/volume_server/${{ matrix.test-type }} (shard ${{ matrix.shard }} of ${SHARD_COUNT}, see 'Select this shard's tests' for the split)" >> "$GITHUB_STEP_SUMMARY" echo "- Command: go test -v -count=1 -timeout=${{ env.TEST_TIMEOUT }} ./test/volume_server/${{ matrix.test-type }}/... -run \"\${TEST_PATTERN}\"" >> "$GITHUB_STEP_SUMMARY"