aboutsummaryrefslogtreecommitdiff
path: root/.github/workflows/container_release2.yml
blob: 678f10ad105aaa76596762ad1fc202822d266462 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
name: "docker: build release containers for large volume"

# DISABLED: Merged into container_release_unified.yml
on:
  workflow_dispatch:
    inputs:
      force_run:
        description: 'This workflow is disabled. Use container_release_unified.yml instead'
        required: true
        default: 'disabled'

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        platform: [amd64, arm64, arm, 386]
        include:
          - platform: amd64
            qemu: false
          - platform: arm64
            qemu: true
          - platform: arm
            qemu: true
          - platform: 386
            qemu: true
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Free Disk Space
        run: |
          echo "Available disk space before cleanup:"
          df -h
          # Remove pre-installed tools
          sudo rm -rf /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL
          # Clean package managers
          sudo apt-get clean
          sudo rm -rf /var/lib/apt/lists/*
          # Clean Docker aggressively
          sudo docker system prune -af --volumes
          # Clean Go cache if it exists
          [ -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
          tags: type=ref,event=tag,suffix=_large_disk
          flavor: latest=false
      - name: Set up QEMU
        if: matrix.qemu
        uses: docker/setup-qemu-action@v3
      - name: Create BuildKit config
        run: |
          cat > /tmp/buildkitd.toml <<EOF
          [registry."docker.io"]
            mirrors = ["https://mirror.gcr.io"]
          EOF
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        with:
          buildkitd-config: /tmp/buildkitd.toml
      - name: Login to Docker Hub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Build ${{ matrix.platform }}
        uses: docker/build-push-action@v6
        env:
          DOCKER_BUILDKIT: 1
        with:
          context: ./docker
          push: ${{ github.event_name != 'pull_request' }}
          file: ./docker/Dockerfile.go_build
          build-args: |
            TAGS=5BytesOffset
            BUILDKIT_INLINE_CACHE=1
            BRANCH=${{ github.sha }}
          platforms: linux/${{ matrix.platform }}
          tags: ${{ steps.docker_meta.outputs.tags }}-${{ matrix.platform }}
          labels: ${{ steps.docker_meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
      - name: Clean up build artifacts
        if: always()
        run: |
          # Clean up Docker build cache and temporary files
          sudo docker system prune -f
          # Remove Go build cache
          sudo rm -rf /tmp/go-build*

  create-manifest:
    runs-on: ubuntu-latest
    needs: [build]
    if: github.event_name != 'pull_request'
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Docker meta
        id: docker_meta
        uses: docker/metadata-action@v5
        with:
          images: chrislusf/seaweedfs
          tags: type=ref,event=tag,suffix=_large_disk
          flavor: latest=false
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Create and push manifest
        run: |
          # Function to retry command with exponential backoff
          retry_with_backoff() {
            local max_attempts=5
            local timeout=1
            local attempt=1
            local exit_code=0
            
            while [ $attempt -le $max_attempts ]; do
              if "$@"; then
                return 0
              else
                exit_code=$?
              fi
              
              if [ $attempt -lt $max_attempts ]; then
                echo "Attempt $attempt failed. Retrying in ${timeout}s..." >&2
                sleep $timeout
                timeout=$((timeout * 2))
              fi
              
              attempt=$((attempt + 1))
            done
            
            echo "Command failed after $max_attempts attempts" >&2
            return $exit_code
          }
          
          # Create manifest with retry
          retry_with_backoff docker buildx imagetools create -t ${{ steps.docker_meta.outputs.tags }} \
            ${{ steps.docker_meta.outputs.tags }}-amd64 \
            ${{ steps.docker_meta.outputs.tags }}-arm64 \
            ${{ steps.docker_meta.outputs.tags }}-arm \
            ${{ steps.docker_meta.outputs.tags }}-386