name: build-image on: schedule: # 每天 UTC 时间 00:00 自动触发构建 - cron: "0 0 * * *" push: tags: - "*" branches: - master paths: - "cmd/**" - "internal/**" - "pkg/**" workflow_dispatch: env: REGISTRY_IMAGE: ehco1996/ehco jobs: prepare-matrix: runs-on: ubuntu-latest outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - id: set-matrix run: | echo '::set-output name=matrix::{"platform":["amd64","arm64"]}' build-bin: runs-on: ubuntu-latest steps: - name: Set up Go uses: actions/setup-go@v5 with: go-version: "1.21" id: go - name: Check out code into the Go module directory uses: actions/checkout@v4 # cache golang build - uses: actions/cache@v4 with: path: | ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('go.sum') }} restore-keys: | ${{ runner.os }}-go-${{ hashFiles('go.sum') }} - name: build run: | mkdir -p /tmp/ehco make build mv ./dist/ehco /tmp/ehco/ehco-amd64 make build-arm mv ./dist/ehco /tmp/ehco/ehco-arm64 cp ./build/Dockerfile /tmp/ehco/Dockerfile - name: Upload binaries uses: actions/upload-artifact@v4 with: name: binaries path: /tmp/ehco if-no-files-found: error retention-days: 1 build-image: runs-on: ubuntu-latest needs: - prepare-matrix - build-bin strategy: fail-fast: true matrix: ${{fromJson(needs.prepare-matrix.outputs.matrix)}} steps: - name: Download binaries uses: actions/download-artifact@v4 with: name: binaries path: /tmp/ehco - name: Rename the binary run: | cp /tmp/ehco/ehco-${{ matrix.platform }} /tmp/ehco/ehco - name: Set up qemu uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build multi-platform image uses: docker/build-push-action@v5 id: build with: context: /tmp/ehco file: /tmp/ehco/Dockerfile platforms: linux/${{ matrix.platform }} cache-from: type=gha cache-to: type=gha,mode=max outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true - name: Export digest run: | mkdir -p /tmp/digests digest="${{ steps.build.outputs.digest }}" touch "/tmp/digests/${digest#sha256:}" - name: Upload digest uses: actions/upload-artifact@v4 with: name: digests-${{ matrix.platform }} path: /tmp/digests/* if-no-files-found: error retention-days: 1 merge: runs-on: ubuntu-latest needs: - prepare-matrix - build-image steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Docker meta id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY_IMAGE }} tags: | type=sha type=raw,value=latest type=ref,event=tag - name: Login to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} # need add more platform when change the matrix - name: Download digests for amd64 uses: actions/download-artifact@v4 with: name: digests-amd64 path: /tmp/digests/amd64 - name: Download digests for arm64 uses: actions/download-artifact@v4 with: name: digests-arm64 path: /tmp/digests/arm64 - name: Create manifest list and push working-directory: /tmp/digests run: | echo "Creating manifest list..." AMD64_DIGEST=$(ls amd64/) ARM64_DIGEST=$(ls arm64/) echo "AMD64_DIGEST: $AMD64_DIGEST" echo "ARM64_DIGEST: $ARM64_DIGEST" docker buildx imagetools create \ --tag ${{ env.REGISTRY_IMAGE }}:latest \ ${{ env.REGISTRY_IMAGE }}@sha256:$AMD64_DIGEST \ ${{ env.REGISTRY_IMAGE }}@sha256:$ARM64_DIGEST - name: Inspect image run: | docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}