# Copyright 2024 RustFS Team # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. name: e2e-mint on: push: branches: [ main ] paths: - ".github/workflows/e2e-mint.yml" - "Dockerfile.source" - "rustfs/**" - "crates/**" workflow_dispatch: inputs: run-multi: description: "Run multi-node Mint as well" required: false default: "false" env: ACCESS_KEY: rustfsadmin SECRET_KEY: rustfsadmin RUST_LOG: info PLATFORM: linux/amd64 jobs: mint-single: runs-on: ubicloud-standard-2 timeout-minutes: 40 steps: - name: Checkout uses: actions/checkout@v6 - name: Enable buildx uses: docker/setup-buildx-action@v3 - name: Build RustFS image (source) run: | DOCKER_BUILDKIT=1 docker buildx build --load \ --platform ${PLATFORM} \ -t rustfs-ci \ -f Dockerfile.source . - name: Create network run: | docker network inspect rustfs-net >/dev/null 2>&1 || docker network create rustfs-net - name: Remove existing rustfs-single (if any) run: docker rm -f rustfs-single >/dev/null 2>&1 || true - name: Start single RustFS run: | docker run -d --name rustfs-single \ --network rustfs-net \ -e RUSTFS_ADDRESS=0.0.0.0:9000 \ -e RUSTFS_ACCESS_KEY=$ACCESS_KEY \ -e RUSTFS_SECRET_KEY=$SECRET_KEY \ -e RUSTFS_VOLUMES="/data/rustfs0 /data/rustfs1 /data/rustfs2 /data/rustfs3" \ -v /tmp/rustfs-single:/data \ rustfs-ci - name: Wait for RustFS ready run: | for i in {1..30}; do if docker exec rustfs-single curl -sf http://localhost:9000/health >/dev/null; then exit 0 fi sleep 2 done echo "RustFS did not become ready" >&2 docker logs rustfs-single || true exit 1 - name: Run Mint (single, S3-only) run: | mkdir -p artifacts/mint-single docker run --rm --network rustfs-net \ --platform ${PLATFORM} \ -e SERVER_ENDPOINT=rustfs-single:9000 \ -e ACCESS_KEY=$ACCESS_KEY \ -e SECRET_KEY=$SECRET_KEY \ -e ENABLE_HTTPS=0 \ -e SERVER_REGION=us-east-1 \ -e RUN_ON_FAIL=1 \ -e MINT_MODE=core \ -v ${GITHUB_WORKSPACE}/artifacts/mint-single:/mint/log \ --entrypoint /mint/mint.sh \ minio/mint:edge \ awscli aws-sdk-go aws-sdk-java-v2 aws-sdk-php aws-sdk-ruby s3cmd s3select - name: Collect RustFS logs run: | mkdir -p artifacts/rustfs-single docker logs rustfs-single > artifacts/rustfs-single/rustfs.log || true - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: mint-single path: artifacts/** mint-multi: if: github.event_name == 'workflow_dispatch' && github.event.inputs.run-multi == 'true' needs: mint-single runs-on: ubicloud-standard-2 timeout-minutes: 60 steps: - name: Checkout uses: actions/checkout@v6 - name: Enable buildx uses: docker/setup-buildx-action@v3 - name: Build RustFS image (source) run: | DOCKER_BUILDKIT=1 docker buildx build --load \ --platform ${PLATFORM} \ -t rustfs-ci \ -f Dockerfile.source . - name: Prepare cluster compose run: | cat > compose.yml <<'EOF' version: '3.8' services: rustfs1: image: rustfs-ci hostname: rustfs1 networks: [rustfs-net] environment: - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_ACCESS_KEY=${ACCESS_KEY} - RUSTFS_SECRET_KEY=${SECRET_KEY} - RUSTFS_VOLUMES=/data/rustfs0 /data/rustfs1 /data/rustfs2 /data/rustfs3 volumes: - rustfs1-data:/data rustfs2: image: rustfs-ci hostname: rustfs2 networks: [rustfs-net] environment: - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_ACCESS_KEY=${ACCESS_KEY} - RUSTFS_SECRET_KEY=${SECRET_KEY} - RUSTFS_VOLUMES=/data/rustfs0 /data/rustfs1 /data/rustfs2 /data/rustfs3 volumes: - rustfs2-data:/data rustfs3: image: rustfs-ci hostname: rustfs3 networks: [rustfs-net] environment: - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_ACCESS_KEY=${ACCESS_KEY} - RUSTFS_SECRET_KEY=${SECRET_KEY} - RUSTFS_VOLUMES=/data/rustfs0 /data/rustfs1 /data/rustfs2 /data/rustfs3 volumes: - rustfs3-data:/data rustfs4: image: rustfs-ci hostname: rustfs4 networks: [rustfs-net] environment: - RUSTFS_ADDRESS=0.0.0.0:9000 - RUSTFS_ACCESS_KEY=${ACCESS_KEY} - RUSTFS_SECRET_KEY=${SECRET_KEY} - RUSTFS_VOLUMES=/data/rustfs0 /data/rustfs1 /data/rustfs2 /data/rustfs3 volumes: - rustfs4-data:/data lb: image: haproxy:2.9 hostname: lb networks: [rustfs-net] ports: - "9000:9000" volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro networks: rustfs-net: name: rustfs-net volumes: rustfs1-data: rustfs2-data: rustfs3-data: rustfs4-data: EOF cat > haproxy.cfg <<'EOF' defaults mode http timeout connect 5s timeout client 30s timeout server 30s frontend fe_s3 bind *:9000 default_backend be_s3 backend be_s3 balance roundrobin server s1 rustfs1:9000 check server s2 rustfs2:9000 check server s3 rustfs3:9000 check server s4 rustfs4:9000 check EOF - name: Launch cluster run: docker compose -f compose.yml up -d - name: Wait for LB ready run: | for i in {1..60}; do if docker run --rm --network rustfs-net curlimages/curl -sf http://lb:9000/health >/dev/null; then exit 0 fi sleep 2 done echo "LB or backend not ready" >&2 docker compose -f compose.yml logs --tail=200 || true exit 1 - name: Run Mint (multi, S3-only) run: | mkdir -p artifacts/mint-multi docker run --rm --network rustfs-net \ --platform ${PLATFORM} \ -e SERVER_ENDPOINT=lb:9000 \ -e ACCESS_KEY=$ACCESS_KEY \ -e SECRET_KEY=$SECRET_KEY \ -e ENABLE_HTTPS=0 \ -e SERVER_REGION=us-east-1 \ -e RUN_ON_FAIL=1 \ -e MINT_MODE=core \ -v ${GITHUB_WORKSPACE}/artifacts/mint-multi:/mint/log \ --entrypoint /mint/mint.sh \ minio/mint:edge \ awscli aws-sdk-go aws-sdk-java-v2 aws-sdk-php aws-sdk-ruby s3cmd s3select - name: Collect logs run: | mkdir -p artifacts/cluster docker compose -f compose.yml logs --no-color > artifacts/cluster/cluster.log || true - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: mint-multi path: artifacts/**