name: Docker on: push: branches: - master tags: - "v*.*.*" paths-ignore: - '**/*.md' - '.gitignore' - '.github/**' - '!.github/workflows/docker.yml' workflow_dispatch: env: DOCKER_FILE: docker/Dockerfile DOCKER_REPO: codexstorage/codex-contracts-eth jobs: # Build platform specific image build: strategy: fail-fast: true matrix: target: - os: linux arch: amd64 - os: linux arch: arm64 include: - target: os: linux arch: amd64 builder: ubuntu-22.04 - target: os: linux arch: arm64 builder: buildjet-4vcpu-ubuntu-2204-arm name: Build ${{ matrix.target.os }}/${{ matrix.target.arch }} runs-on: ${{ matrix.builder }} outputs: tags-linux-amd64: ${{ steps.tags.outputs.tags-linux-amd64 }} tags-linux-arm64: ${{ steps.tags.outputs.tags-linux-arm64 }} env: PLATFORM: ${{ format('{0}/{1}', 'linux', matrix.target.arch) }} SUFFIX: ${{ format('{0}-{1}', 'linux', matrix.target.arch) }} steps: - name: Checkout uses: actions/checkout@v3 - name: Docker - Meta id: meta uses: docker/metadata-action@v4 with: images: ${{ env.DOCKER_REPO }} flavor: | latest=false tags: | type=semver,pattern={{version}},suffix=-${{ env.SUFFIX }} type=sha,suffix=-${{ env.SUFFIX }},enable=${{ !startsWith(github.ref, 'refs/tags/') }} - name: Docker - Set tags output if: github.event_name != 'pull_request' id: tags run: | if [[ '${{ matrix.target.os }}' == 'linux' && '${{ matrix.target.arch }}' == 'amd64' ]]; then echo "tags-linux-amd64=${{ steps.meta.outputs.tags }}" >> "$GITHUB_OUTPUT" elif [[ '${{ matrix.target.os }}' == 'linux' && '${{ matrix.target.arch }}' == 'arm64' ]]; then echo "tags-linux-arm64=${{ steps.meta.outputs.tags }}" >> "$GITHUB_OUTPUT" fi - name: Docker - Login to Docker Hub if: github.event_name != 'pull_request' uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Docker - Build and export to Docker id: build uses: docker/build-push-action@v4 with: context: . file: ${{ env.DOCKER_FILE }} platforms: ${{ env.PLATFORM }} load: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - name: Docker - Minify image uses: kitabisa/docker-slim-action@v1 id: slim env: DSLIM_HTTP_PROBE: false with: target: ${{ steps.meta.outputs.tags }} overwrite: true - name: Docker - Show slim report run: echo "${REPORT}" | jq -r env: REPORT: ${{ steps.slim.outputs.report }} - name: Docker - Push to Docker registry if: github.event_name != 'pull_request' id: push uses: docker/build-push-action@v4 with: context: . file: ${{ env.DOCKER_FILE }} platforms: ${{ env.PLATFORM }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} # Publish single image publish: name: Push single image if: github.event_name != 'pull_request' runs-on: ubuntu-latest needs: build steps: - name: Docker - Meta id: meta uses: docker/metadata-action@v4 with: images: ${{ env.DOCKER_REPO }} tags: | type=semver,pattern={{version}} type=sha,enable=${{ !startsWith(github.ref, 'refs/tags/') }} - name: Docker - Set tags run: | # Transform multi-line tags in to the comma-seperated TAGS=$(echo "${{ steps.meta.outputs.tags }}" | tr '\n' ',' | awk '{gsub(/,$/,"");}1') echo "TAGS=${TAGS}" >>$GITHUB_ENV - name: Docker - Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Docker - Create and push manifest images uses: Noelware/docker-manifest-action@master with: inputs: ${{ env.TAGS }} images: ${{ needs.build.outputs.tags-linux-amd64 }},${{ needs.build.outputs.tags-linux-arm64 }} push: true