name: "docker: build all release containers (unified)" on: push: tags: - '*' workflow_dispatch: {} permissions: contents: read # Limit concurrent builds to avoid rate limits concurrency: group: release-${{ github.ref }} cancel-in-progress: false jobs: build: runs-on: ubuntu-latest strategy: # Build sequentially to avoid rate limits max-parallel: 2 matrix: include: # Normal volume - multi-arch - variant: normal platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/386 dockerfile: ./docker/Dockerfile.go_build build_args: "" tag_suffix: "" # Large disk - multi-arch - variant: large_disk platforms: linux/amd64,linux/arm64,linux/arm/v7,linux/386 dockerfile: ./docker/Dockerfile.go_build build_args: TAGS=5BytesOffset tag_suffix: _large_disk # Full tags - amd64 only - variant: full platforms: linux/amd64 dockerfile: ./docker/Dockerfile.go_build build_args: TAGS=elastic,gocdk,rclone,sqlite,tarantool,tikv,ydb tag_suffix: _full # Large disk + full tags - amd64 only - variant: large_disk_full platforms: linux/amd64 dockerfile: ./docker/Dockerfile.go_build build_args: TAGS=5BytesOffset,elastic,gocdk,rclone,sqlite,tarantool,tikv,ydb tag_suffix: _large_disk_full # RocksDB large disk - amd64 only - variant: rocksdb platforms: linux/amd64 dockerfile: ./docker/Dockerfile.rocksdb_large build_args: "" tag_suffix: _large_disk_rocksdb steps: - name: Checkout uses: actions/checkout@v4 - name: Free Disk Space run: | echo "Available disk space before cleanup:" df -h sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL sudo apt-get clean sudo rm -rf /var/lib/apt/lists/* sudo docker system prune -af --volumes [ -d ~/.cache/go-build ] && rm -rf ~/.cache/go-build || true [ -d /go/pkg ] && rm -rf /go/pkg || true echo "Available disk space after cleanup:" df -h - name: Docker meta id: docker_meta uses: docker/metadata-action@v5 with: images: | chrislusf/seaweedfs ghcr.io/chrislusf/seaweedfs tags: type=ref,event=tag,suffix=${{ matrix.tag_suffix }} flavor: latest=false labels: | org.opencontainers.image.title=seaweedfs org.opencontainers.image.description=SeaweedFS is a distributed storage system for blobs, objects, files, and data lake, to store and serve billions of files fast! org.opencontainers.image.vendor=Chris Lu - name: Set up QEMU if: contains(matrix.platforms, 'arm') uses: docker/setup-qemu-action@v3 - name: Create BuildKit config run: | cat > /tmp/buildkitd.toml <&2 sleep $timeout timeout=$((timeout * 2)) fi attempt=$((attempt + 1)) done echo "Command failed after $max_attempts attempts" >&2 return $exit_code } # Copy multi-arch image from GHCR to Docker Hub with retry # This is much more efficient than pulling/pushing individual arch images echo "Copying ${{ matrix.variant }} from GHCR to Docker Hub..." retry_with_backoff crane copy \ ghcr.io/chrislusf/seaweedfs:${{ github.ref_name }}${{ matrix.tag_suffix }} \ chrislusf/seaweedfs:${{ github.ref_name }}${{ matrix.tag_suffix }} echo "✓ Successfully copied ${{ matrix.variant }} to Docker Hub"