From 5acd059d58d156e4387cfabd569633acdf006233 Mon Sep 17 00:00:00 2001 From: Horst Gutmann Date: Tue, 9 Apr 2024 09:51:27 +0200 Subject: [PATCH 1/3] feat: Generate linux/amd64 and linux/arm64 images --- .github/workflows/docker.yml | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index d0f6bfad..e7892a75 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -31,13 +31,28 @@ jobs: # project is not that large: fetch-depth: 0 - - name: Build Docker Image - run: make build + - name: Set up QEMU + uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - name: Push Docker Image - if: startsWith(github.ref, 'refs/tags/') && github.event_name == 'push' - run: make push + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 + with: + images: ghcr.io/grafana/flagger-k6-webhook + tags: | + type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' && github.event_name == 'push' }} + type=raw,value={{tag}},enable=${{ github.ref == 'refs/tags' && github.event_name == 'push' }} + type=sha,enable=${{ github.event_name == 'pull_request' }} + + - name: Build and push Docker image + uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0 + with: + platforms: | + linux/amd64 + linux/arm64 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} - - name: Push Latest Docker Image - if: github.ref == 'refs/heads/main' && github.event_name == 'push' - run: make push-latest From 7d67a4fdbde38f6bf06ee60345f14d63eeea0793 Mon Sep 17 00:00:00 2001 From: Horst Gutmann Date: Tue, 9 Apr 2024 12:42:49 +0200 Subject: [PATCH 2/3] Run platform builds on separate runners --- .github/workflows/docker.yml | 166 ++++++++++++++++++++++++++--------- 1 file changed, 125 insertions(+), 41 deletions(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index e7892a75..1ea84d6e 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -8,51 +8,135 @@ on: branches: - main +env: + REGISTRY_IMAGE: ghcr.io/grafana/flagger-k6-webhook + TAG_CONFIG: | + type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' && github.event_name == 'push' }} + type=raw,value={{tag}},enable=${{ github.ref == 'refs/tags' && github.event_name == 'push' }} + type=sha,enable=${{ github.event_name == 'pull_request' }} + jobs: - docker: + # We create a docker image per platform in this first step: + build: + strategy: + fail-fast: false + # Based on + # https://github.com/orgs/community/discussions/26253#discussioncomment-6745038 + # we only want amd64 images to be built for PRs to speed up the feedback + # loop: + matrix: + platform: + - linux/amd64 + - linux/arm64 + isPR: + - ${{ github.event_name == 'pull_request' }} + include: + - platform: linux/amd64 + exclude: + - isPR: true + runs-on: ubuntu-latest - permissions: - contents: read - packages: write + steps: + - name: Login to GitHub Container Registry + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Checkout Repository + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + with: + # Workaround for https://github.com/actions/checkout/issues/1467 as the + # project is not that large: + fetch-depth: 0 + + - name: Set up QEMU + uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 + with: + images: ${{ env.REGISTRY_IMAGE }} + tags: ${{ env.TAG_CONFIG }} + + - name: Build and push Docker image + uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0 + with: + platforms: ${{ matrix.platform }} + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + + - name: Export digest + id: digest + if: github.event_name != 'pull_request' + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + echo "artifact_name=digests-${{ matrix.platform }}" | sed -e 's/\//-/g' >> "$GITHUB_OUTPUT" + - name: Upload digest + if: github.event_name != 'pull_request' + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 + with: + name: ${{ steps.digest.outputs.artifact_name }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + if: github.event_name != 'pull_request' + needs: + - build steps: - - name: Login to GitHub Container Registry - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} + - name: Download digests (linux/amd64) + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: digests-linux-amd64 + path: /tmp/digests-linux-amd64 + + - name: Download digests (linux/arm64) + uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 + with: + name: digests-linux-arm64 + path: /tmp/digests-linux-arm64 + + - name: Merge digests + run: | + mkdir -p /tmp/digests + cp /tmp/digests-linux-amd64/* /tmp/digests/ + cp /tmp/digests-linux-arm64/* /tmp/digests/ + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 - - name: Checkout Repository - uses: actions/checkout@v4 - with: - # Workaround for https://github.com/actions/checkout/issues/1467 as the - # project is not that large: - fetch-depth: 0 - - - name: Set up QEMU - uses: docker/setup-qemu-action@68827325e0b33c7199eb31dd4e31fbe9023e06e3 # v3.0.0 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0 - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 - with: - images: ghcr.io/grafana/flagger-k6-webhook - tags: | - type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' && github.event_name == 'push' }} - type=raw,value={{tag}},enable=${{ github.ref == 'refs/tags' && github.event_name == 'push' }} - type=sha,enable=${{ github.event_name == 'pull_request' }} - - - name: Build and push Docker image - uses: docker/build-push-action@4a13e500e55cf31b7a5d59a38ab2040ab0f42f56 # v5.1.0 - with: - platforms: | - linux/amd64 - linux/arm64 - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} + - name: Docker meta + id: meta + uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 + with: + images: ${{ env.REGISTRY_IMAGE }} + tags: ${{ env.TAG_CONFIG }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *) + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }} From 2733435470591b5a48d380f74eda7e5ef4f4d3ff Mon Sep 17 00:00:00 2001 From: Horst Gutmann Date: Wed, 10 Apr 2024 13:50:08 +0200 Subject: [PATCH 3/3] Remove unused Makefile targets --- Makefile | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/Makefile b/Makefile index 396122ac..ce724963 100755 --- a/Makefile +++ b/Makefile @@ -1,16 +1,4 @@ -.PHONY: dev build push push-latest -VERSION := $(shell git describe --tags --dirty --always) -IMAGE ?= ghcr.io/grafana/flagger-k6-webhook +.PHONY: dev dev: go build -o ./flagger-k6-webhook cmd/main.go - -build: - docker build --platform=linux/amd64 -t $(IMAGE) . - docker tag $(IMAGE) $(IMAGE):$(VERSION) - -push: build - docker push $(IMAGE):$(VERSION) - -push-latest: build - docker push $(IMAGE)