name: "S3 Mutation Regression Tests" on: pull_request: paths: - 'weed/s3api/**' - 'test/s3/delete/**' - 'test/s3/distributed_lock/**' - 'test/s3/versioning/**' - 'test/volume_server/framework/**' - 'docker/compose/s3.json' - '.github/workflows/s3-mutation-regression-tests.yml' concurrency: group: ${{ github.head_ref }}/s3-mutation-regression-tests cancel-in-progress: true permissions: contents: read jobs: s3-versioning-regressions: name: S3 Versioning Regression Tests runs-on: ubuntu-22.04 timeout-minutes: 25 steps: - name: Check out code uses: actions/checkout@v7 - name: Set up Go uses: actions/setup-go@v7 with: go-version-file: 'go.mod' - name: Run S3 versioning regression tests timeout-minutes: 20 working-directory: test/s3/versioning run: | set -x # Run every versioning test, so a regression test lands covered instead # of waiting for someone to remember this file. Name a test in EXCLUDE, # with the reason, to keep it out. # # TestVersioningPagination*: opt-in stress tests that build 1500+ # versions. They self-skip without ENABLE_STRESS_TESTS and have their # own make target, so this gate should not carry them. EXCLUDE='TestVersioningPagination.*' tests=$(go test . -list '.*' | grep '^Test' | sort -u) # An empty list would make -run match nothing and pass this job vacuously. [ -n "$tests" ] || { echo "listed no versioning tests"; exit 1; } selected=$(echo "$tests" | grep -vE "^($EXCLUDE)$") [ -n "$selected" ] || { echo "EXCLUDE matched every test"; exit 1; } echo "running $(echo "$selected" | wc -l) of $(echo "$tests" | wc -l) versioning tests" # make swallows a lone trailing $, taking the anchor with it, so escape it. make test-with-server TEST_PATTERN="^($(echo "$selected" | paste -sd'|' -))"'$$' - name: Show server logs on failure if: failure() working-directory: test/s3/versioning run: | echo "=== Server Logs ===" if [ -f weed-test.log ]; then tail -100 weed-test.log fi - name: Upload versioning logs on failure if: failure() uses: actions/upload-artifact@v7 with: name: s3-versioning-regression-logs path: test/s3/versioning/weed-test*.log retention-days: 3 s3-delete-regressions: name: S3 Delete Regression Tests runs-on: ubuntu-22.04 timeout-minutes: 20 steps: - name: Check out code uses: actions/checkout@v7 - name: Set up Go uses: actions/setup-go@v7 with: go-version-file: 'go.mod' - name: Run S3 delete regression tests timeout-minutes: 15 working-directory: test/s3/delete run: | set -x make test-with-server - name: Show server logs on failure if: failure() working-directory: test/s3/delete run: | echo "=== Server Logs ===" if [ -f weed-test.log ]; then tail -100 weed-test.log fi - name: Upload delete logs on failure if: failure() uses: actions/upload-artifact@v7 with: name: s3-delete-regression-logs path: test/s3/delete/weed-test*.log retention-days: 3 s3-distributed-lock-regressions: name: S3 Distributed Lock Regression Tests runs-on: ubuntu-22.04 timeout-minutes: 30 steps: - name: Check out code uses: actions/checkout@v7 - name: Set up Go uses: actions/setup-go@v7 with: go-version-file: 'go.mod' - name: Build SeaweedFS run: | go build -o weed/weed -buildvcs=false ./weed - name: Run distributed lock regressions timeout-minutes: 25 env: TMPDIR: ${{ github.workspace }}/test/s3/distributed_lock/tmp S3_DISTRIBUTED_LOCK_KEEP_LOGS: "1" WEED_BINARY: ${{ github.workspace }}/weed/weed run: | set -x mkdir -p "$TMPDIR" go test -v -count=1 -timeout=20m ./test/s3/distributed_lock - name: Upload distributed lock logs on failure if: failure() uses: actions/upload-artifact@v7 with: name: s3-distributed-lock-regression-logs path: test/s3/distributed_lock/tmp/seaweedfs_s3_distributed_lock_* retention-days: 3