From eba53bc51d940fd027f70a3111b5079d8aa38724 Mon Sep 17 00:00:00 2001 From: Guilherme Sperb Machado Date: Wed, 14 Feb 2024 23:11:30 +0100 Subject: [PATCH] add a new workflow with a different approach for multi-platform --- .github/workflows/docker.yml | 159 +++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 .github/workflows/docker.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..ade7b7f --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,159 @@ +name: Build and Publish container (multi-platform) + +on: + workflow_dispatch: + inputs: + publish: + description: 'Publish to ghcr?' + required: false + default: 'false' + specific-version: + description: 'Publish tag with specific version? (from .env)' + required: true + default: 'true' + latest-version: + description: 'Publish tag "latest"?' + required: true + default: 'false' + +env: + IMAGE_ID_BASE: ghcr.io/axlabs/neo3-privatenet-docker/neo-cli + IMAGE_ID_PLUGINS: ghcr.io/axlabs/neo3-privatenet-docker/neo-cli-with-plugins + VERSION_LATEST: latest + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm64 + steps: + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Load .env + id: loadenv + uses: ./.github/actions/load-env + + - name: Build and push base image (neo-node) + id: build-base-image + uses: docker/build-push-action@v5 + with: + platforms: ${{ matrix.platform }} + tags: "${{ env.IMAGE_ID_BASE }}:${{ steps.loadenv.outputs.image-tag }}" + context: ./neo-node + outputs: type=image,name=${{ env.IMAGE_ID_BASE }},push-by-digest=true,name-canonical=true,push=true + + - name: Build and push neo-cli-with-plugins + id: build-plugins-image + uses: docker/build-push-action@v5 + with: + platforms: ${{ matrix.platform }} + tags: "${{ env.IMAGE_ID_PLUGINS }}:${{ steps.loadenv.outputs.image-tag }}" + file: ./docker/Dockerfile + target: NeoCliFinal + build-args: IMAGE_TAG=${{ steps.loadenv.outputs.image-tag }} + context: ./neo-modules + outputs: type=image,name=${{ env.IMAGE_ID_PLUGINS }},push-by-digest=true,name-canonical=true,push=true + + - name: Export digest - base image + run: | + mkdir -p /tmp/digests-base-image + digest="${{ steps.build-base-image.outputs.digest }}" + touch "/tmp/digests-base-image/${digest#sha256:}" + + - name: Export digest - neo-cli-with-plugins + run: | + mkdir -p /tmp/digests-plugins-image + digest="${{ steps.build-plugins-image.outputs.digest }}" + touch "/tmp/digests-plugins-image/${digest#sha256:}" + + - name: Upload digest - base image + uses: actions/upload-artifact@v4 + with: + name: digests-base-image-${{ env.PLATFORM_PAIR }} + path: /tmp/digests-base-image/* + if-no-files-found: error + retention-days: 1 + + - name: Upload digest - neo-cli-with-plugins + uses: actions/upload-artifact@v4 + with: + name: digests-plugins-image-${{ env.PLATFORM_PAIR }} + path: /tmp/digests-plugins-image/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + needs: + - build + steps: + - name: Load .env + id: loadenv + uses: ./.github/actions/load-env + + - name: Download digests - base image + uses: actions/download-artifact@v4 + with: + path: /tmp/digests-base-image + pattern: digests-base-image-* + merge-multiple: true + + - name: Download digests - neo-cli-with-plugins + uses: actions/download-artifact@v4 + with: + path: /tmp/digests-plugins-image + pattern: digests-plugins-image-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create manifest list and push - base image + working-directory: /tmp/digests-base-image + run: | + docker buildx imagetools create -t ${{ env.IMAGE_ID_BASE }}:${{ steps.loadenv.outputs.image-tag }} \ + $(printf '${{ env.IMAGE_ID_BASE }}@sha256:%s ' *) + + - name: Create manifest list and push - neo-cli-with-plugins + working-directory: /tmp/digests-plugins-image + run: | + docker buildx imagetools create -t ${{ env.IMAGE_ID_PLUGINS }}:${{ steps.loadenv.outputs.image-tag }} \ + $(printf '${{ env.IMAGE_ID_PLUGINS }}@sha256:%s ' *) + + - name: Inspect image - base image + run: | + docker buildx imagetools inspect ${{ env.IMAGE_ID_BASE }}:${{ steps.loadenv.outputs.image-tag }} + + - name: Inspect image - neo-cli-with-plugins + run: | + docker buildx imagetools inspect ${{ env.IMAGE_ID_PLUGINS }}:${{ steps.loadenv.outputs.image-tag }}