From 35c94cd7fc5ddbccdbcb923163203593c7822846 Mon Sep 17 00:00:00 2001 From: andres-spacemesh <106999199+andres-spacemesh@users.noreply.github.com> Date: Fri, 17 Jan 2025 11:21:06 +0000 Subject: [PATCH] Build mac-arm64 and push to docker hub (#6617) ## Motivation Build and push mac-arm64 image --- .github/workflows/dockerhub.yml | 67 ++++++++++++++++++++++++++++++--- Makefile | 34 ++++++++++++++--- 2 files changed, 90 insertions(+), 11 deletions(-) diff --git a/.github/workflows/dockerhub.yml b/.github/workflows/dockerhub.yml index f47026fe10..791376e999 100644 --- a/.github/workflows/dockerhub.yml +++ b/.github/workflows/dockerhub.yml @@ -19,8 +19,15 @@ on: description: 'A custom image tag' default: '' jobs: - dockerpush: - runs-on: ubuntu-22.04 + dockerpush-images: + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + - os: ubuntu-22.04 + outname_sufix: "linux-amd64" + - os: ubuntu-latest-arm-8-cores + outname_sufix: "linux-arm64" steps: - name: checkout uses: actions/checkout@v4 @@ -33,32 +40,82 @@ jobs: username: ${{ secrets.GH_ACTION_TOKEN_USER }} password: ${{ secrets.GH_ACTION_TOKEN }} if: vars.GOPRIVATE + + - name: get tag sufix arm64 + if: ${{ runner.arch == 'arm64' }} + run: | + echo "SUFIX=-arm64" >> $GITHUB_ENV + - name: get tag sufix amd64 + if: ${{ runner.arch != 'arm64' }} + run: | + echo "SUFIX=-amd64" >> $GITHUB_ENV + - name: Build docker images run: | - export VERSION="${{ github.ref_name }}" + export VERSION="${{ github.ref_name }}" TAG_SUFIX=$SUFIX make dockerbuild-go make dockerbuild-bs - name: Push docker images to dockerhub run: | + export TAG_SUFIX=$SUFIX make dockerpush-only make dockerpush-bs-only - name: Push docker images to dockerhub if: inputs.custom_image_tag run: | - export DOCKER_IMAGE_VERSION="${{ inputs.custom_image_tag }}" + export DOCKER_IMAGE_VERSION="${{ inputs.custom_image_tag }}" TAG_SUFIX=$SUFIX make dockerpush-only make dockerpush-bs-only - name: Push docker images with version tag to dockerhub if: startsWith(github.ref, 'refs/tags/') run: | - export DOCKER_IMAGE_VERSION="${{ github.ref_name }}" + export DOCKER_IMAGE_VERSION="${{ github.ref_name }}" TAG_SUFIX=$SUFIX make dockerpush-only make dockerpush-bs-only export DOCKER_IMAGE_REPO="go-spacemesh" make dockerpush-only make dockerpush-bs-only + + dockerpush-manifest: + needs: [dockerpush-images] + runs-on: ubuntu-22.04 + steps: + - name: checkout + uses: actions/checkout@v4 + with: + ssh-key: ${{ secrets.GH_ACTION_PRIVATE_KEY }} + + - uses: extractions/netrc@v2 + with: + machine: github.com + username: ${{ secrets.GH_ACTION_TOKEN_USER }} + password: ${{ secrets.GH_ACTION_TOKEN }} + if: vars.GOPRIVATE + + - name: Push docker manifest to dockerhub + run: | + make dockerpush-go-manifest + make dockerpush-bs-manifest + + - name: Push docker manifest to dockerhub + if: inputs.custom_image_tag + run: | + export DOCKER_IMAGE_VERSION="${{ inputs.custom_image_tag }}" + make dockerpush-go-manifest + make dockerpush-bs-manifest + + - name: Push docker manifest with version tag to dockerhub + if: startsWith(github.ref, 'refs/tags/') + run: | + export DOCKER_IMAGE_VERSION="${{ github.ref_name }}" + make dockerpush-go-manifest + make dockerpush-bs-manifest + + export DOCKER_IMAGE_REPO="go-spacemesh" + make dockerpush-go-manifest + make dockerpush-bs-manifest diff --git a/Makefile b/Makefile index f2055e597a..7508057a62 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,8 @@ GOTESTSUM_VERSION := v1.12.0 GOSCALE_VERSION := v1.2.0 MOCKGEN_VERSION := v0.5.0 +TAG_SUFIX ?= "" + # Add an indicator to the branch name if dirty and use commithash if running in detached mode ifeq ($(BRANCH),HEAD) BRANCH = $(SHA) @@ -156,7 +158,7 @@ dockerbuild-go: --secret id=mynetrc,src=$(HOME)/.netrc \ --build-arg VERSION=${VERSION} \ -t go-spacemesh:$(SHA) \ - -t $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION) \ + -t $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION)$(TAG_SUFIX) \ . .PHONY: dockerbuild-go @@ -167,15 +169,15 @@ dockerpush-only: ifneq ($(DOCKER_USERNAME):$(DOCKER_PASSWORD),:) echo "$(DOCKER_PASSWORD)" | docker login -u "$(DOCKER_USERNAME)" --password-stdin endif - docker tag go-spacemesh:$(SHA) $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION) - docker push $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION) + docker tag go-spacemesh:$(SHA) $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION)$(TAG_SUFIX) + docker push $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION)$(TAG_SUFIX) .PHONY: dockerpush-only dockerbuild-bs: DOCKER_BUILDKIT=1 docker build \ --secret id=mynetrc,src=$(HOME)/.netrc \ -t go-spacemesh-bs:$(SHA) \ - -t $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION) \ + -t $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION)$(TAG_SUFIX) \ -f ./bootstrap.Dockerfile \ . .PHONY: dockerbuild-bs @@ -187,10 +189,30 @@ dockerpush-bs-only: ifneq ($(DOCKER_USERNAME):$(DOCKER_PASSWORD),:) echo "$(DOCKER_PASSWORD)" | docker login -u "$(DOCKER_USERNAME)" --password-stdin endif - docker tag go-spacemesh-bs:$(SHA) $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION) - docker push $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION) + docker tag go-spacemesh-bs:$(SHA) $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION)$(TAG_SUFIX) + docker push $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION)$(TAG_SUFIX) .PHONY: dockerpush-bs-only +dockerpush-go-manifest: +ifneq ($(DOCKER_USERNAME):$(DOCKER_PASSWORD),:) + @echo "$(DOCKER_PASSWORD)" | docker login -u "$(DOCKER_USERNAME)" --password-stdin +endif + docker manifest create $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION) --amend $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION)-amd64 $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION)-arm64 + docker manifest annotate $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION) $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION)-amd64 --os linux --arch amd64 + docker manifest annotate $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION) $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION)-arm64 --os linux --arch arm64 + docker manifest push $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO):$(DOCKER_IMAGE_VERSION) +.PHONY: dockerpush-go-manifest + +dockerpush-bs-manifest: +ifneq ($(DOCKER_USERNAME):$(DOCKER_PASSWORD),:) + @echo "$(DOCKER_PASSWORD)" | docker login -u "$(DOCKER_USERNAME)" --password-stdin +endif + docker manifest create $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION) --amend $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION)-amd64 $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION)-arm64 + docker manifest annotate $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION) $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION)-amd64 --os linux --arch amd64 + docker manifest annotate $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION) $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION)-arm64 --os linux --arch arm64 + docker manifest push $(DOCKER_HUB)/$(DOCKER_IMAGE_REPO)-bs:$(DOCKER_IMAGE_VERSION) +.PHONY: dockerpush-bs-manifest + fuzz: @$(ULIMIT) CGO_LDFLAGS="$(CGO_TEST_LDFLAGS)" ./scripts/fuzz.sh $(FUZZTIME) .PHONY: fuzz