diff --git a/.github/workflows/container_latest.yml b/.github/workflows/container_latest.yml index 7d8868f35..6d3deb02a 100644 --- a/.github/workflows/container_latest.yml +++ b/.github/workflows/container_latest.yml @@ -15,15 +15,8 @@ jobs: strategy: matrix: platform: [amd64, arm64, arm, 386] - include: - - platform: amd64 - qemu: false - - platform: arm64 - qemu: true - - platform: arm - qemu: true - - platform: 386 - qemu: true + variant: [standard, large_disk] + steps: - name: Checkout uses: actions/checkout@v6 @@ -43,6 +36,18 @@ jobs: [ -d /go/pkg ] && rm -rf /go/pkg || true echo "Available disk space after cleanup:" df -h + + - name: Configure variant + id: config + run: | + if [ "${{ matrix.variant }}" == "large_disk" ]; then + echo "tag_suffix=_large_disk" >> $GITHUB_OUTPUT + echo "build_args=TAGS=5BytesOffset" >> $GITHUB_OUTPUT + else + echo "tag_suffix=" >> $GITHUB_OUTPUT + echo "build_args=" >> $GITHUB_OUTPUT + fi + - name: Docker meta id: docker_meta uses: docker/metadata-action@v5 @@ -50,13 +55,13 @@ jobs: images: | chrislusf/seaweedfs ghcr.io/chrislusf/seaweedfs - tags: type=raw,value=latest + tags: type=raw,value=latest,suffix=${{ steps.config.outputs.tag_suffix }} 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: matrix.qemu + if: matrix.platform != 'amd64' uses: docker/setup-qemu-action@v3 - name: Create BuildKit config run: | @@ -82,7 +87,7 @@ jobs: registry: ghcr.io username: ${{ secrets.GHCR_USERNAME }} password: ${{ secrets.GHCR_TOKEN }} - - name: Build ${{ matrix.platform }} + - name: Build ${{ matrix.platform }} ${{ matrix.variant }} uses: docker/build-push-action@v6 env: DOCKER_BUILDKIT: 1 @@ -92,13 +97,14 @@ jobs: file: ./docker/Dockerfile.go_build platforms: linux/${{ matrix.platform }} # Push to GHCR only during build to avoid Docker Hub rate limits - tags: ghcr.io/chrislusf/seaweedfs:latest-${{ matrix.platform }} + tags: ghcr.io/chrislusf/seaweedfs:latest${{ steps.config.outputs.tag_suffix }}-${{ matrix.platform }} labels: ${{ steps.docker_meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max + cache-from: type=gha,scope=${{ matrix.variant }}-${{ matrix.platform }} + cache-to: type=gha,mode=max,scope=${{ matrix.variant }}-${{ matrix.platform }} build-args: | BUILDKIT_INLINE_CACHE=1 BRANCH=${{ github.sha }} + ${{ steps.config.outputs.build_args }} - name: Clean up build artifacts if: always() run: | @@ -111,9 +117,22 @@ jobs: runs-on: ubuntu-latest needs: [build] if: github.event_name != 'pull_request' + strategy: + matrix: + variant: [standard, large_disk] steps: - name: Checkout uses: actions/checkout@v6 + + - name: Configure variant + id: config + run: | + if [ "${{ matrix.variant }}" == "large_disk" ]; then + echo "tag_suffix=_large_disk" >> $GITHUB_OUTPUT + else + echo "tag_suffix=" >> $GITHUB_OUTPUT + fi + - name: Docker meta id: docker_meta uses: docker/metadata-action@v5 @@ -121,7 +140,7 @@ jobs: images: | chrislusf/seaweedfs ghcr.io/chrislusf/seaweedfs - tags: type=raw,value=latest + tags: type=raw,value=latest,suffix=${{ steps.config.outputs.tag_suffix }} - name: Login to Docker Hub uses: docker/login-action@v3 with: @@ -142,13 +161,15 @@ jobs: crane version - name: Create and push manifest run: | + SUFFIX="${{ steps.config.outputs.tag_suffix }}" + # Create manifest on GHCR first (no rate limits) echo "Creating GHCR manifest (no rate limits)..." - docker buildx imagetools create -t ghcr.io/chrislusf/seaweedfs:latest \ - ghcr.io/chrislusf/seaweedfs:latest-amd64 \ - ghcr.io/chrislusf/seaweedfs:latest-arm64 \ - ghcr.io/chrislusf/seaweedfs:latest-arm \ - ghcr.io/chrislusf/seaweedfs:latest-386 + docker buildx imagetools create -t ghcr.io/chrislusf/seaweedfs:latest${SUFFIX} \ + ghcr.io/chrislusf/seaweedfs:latest${SUFFIX}-amd64 \ + ghcr.io/chrislusf/seaweedfs:latest${SUFFIX}-arm64 \ + ghcr.io/chrislusf/seaweedfs:latest${SUFFIX}-arm \ + ghcr.io/chrislusf/seaweedfs:latest${SUFFIX}-386 # Copy the complete multi-arch image from GHCR to Docker Hub # This only requires one pull from GHCR (no rate limit) and one push to Docker Hub @@ -184,16 +205,16 @@ jobs: # Use crane or skopeo to copy, fallback to docker if not available if command -v crane &> /dev/null; then echo "Using crane to copy..." - retry_with_backoff crane copy ghcr.io/chrislusf/seaweedfs:latest chrislusf/seaweedfs:latest + retry_with_backoff crane copy ghcr.io/chrislusf/seaweedfs:latest${SUFFIX} chrislusf/seaweedfs:latest${SUFFIX} elif command -v skopeo &> /dev/null; then echo "Using skopeo to copy..." - retry_with_backoff skopeo copy --all docker://ghcr.io/chrislusf/seaweedfs:latest docker://chrislusf/seaweedfs:latest + retry_with_backoff skopeo copy --all docker://ghcr.io/chrislusf/seaweedfs:latest${SUFFIX} docker://chrislusf/seaweedfs:latest${SUFFIX} else echo "Using docker buildx imagetools (pulling 4 images from Docker Hub)..." # Fallback: create manifest directly on Docker Hub (pulls from Docker Hub - rate limited) - retry_with_backoff docker buildx imagetools create -t chrislusf/seaweedfs:latest \ - ghcr.io/chrislusf/seaweedfs:latest-amd64 \ - ghcr.io/chrislusf/seaweedfs:latest-arm64 \ - ghcr.io/chrislusf/seaweedfs:latest-arm \ - ghcr.io/chrislusf/seaweedfs:latest-386 + retry_with_backoff docker buildx imagetools create -t chrislusf/seaweedfs:latest${SUFFIX} \ + ghcr.io/chrislusf/seaweedfs:latest${SUFFIX}-amd64 \ + ghcr.io/chrislusf/seaweedfs:latest${SUFFIX}-arm64 \ + ghcr.io/chrislusf/seaweedfs:latest${SUFFIX}-arm \ + ghcr.io/chrislusf/seaweedfs:latest${SUFFIX}-386 fi