Skip to content

Upgraded buildx in merge step #82

Upgraded buildx in merge step

Upgraded buildx in merge step #82

Workflow file for this run

name: Docker
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
on:
push:
branches: [ "main" ]
# Publish semver tags as releases.
tags: [ 'v*.*.*' ]
pull_request:
branches: [ "main" ]
env:
# Use docker.io for Docker Hub if empty
REGISTRY: ghcr.io
# github.repository as <account>/<repo>
IMAGE_NAME: ${{ github.repository }}
jobs:
build:
strategy:
fail-fast: false
matrix:
platform:
- docker: linux/amd64
go: amd64
- docker: linux/arm/v6
go: arm
qemu: arm
dockerfile: alpine.Dockerfile
- docker: linux/arm/v7
go: arm
qemu: arm
- docker: linux/arm64
go: arm64
qemu: arm64
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3.0.0
if: matrix.platform.qemu
with:
platforms: ${{ matrix.platform.qemu }}
# Set up BuildKit Docker container builder to be able to build
# multi-platform images and export cache
# https://github.com/docker/setup-buildx-action
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
version: v0.16.2
- name: Go package cache
uses: actions/cache@v4
with:
path: go-package-cache
key: ${{ matrix.platform.go }}-docker-go-package-${{ hashFiles('go.sum') }}
restore-keys: |
${{ matrix.platform.go }}-docker-go-package-
- name: Go build cache
uses: actions/cache@v4
with:
path: go-build-cache
key: ${{ matrix.platform.go }}-docker-go-build-${{ hashFiles('go.sum') }}
restore-keys: |
${{ matrix.platform.go }}-docker-go-build-
- name: Inject go package cache into docker
uses: reproducible-containers/buildkit-cache-dance@v3
with:
cache-map: |
{
"go-package-cache": "/root/go/pkg/mod",
"go-build-cache": "/root/.cache/go-build"
}
# Login against a Docker registry except on PR
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image in PR
id: build-and-push-pr
uses: docker/build-push-action@v6
if: github.event_name == 'pull_request'
with:
context: .
file: ${{ matrix.platform.dockerfile && matrix.platform.dockerfile || 'Dockerfile' }}
build-args: GOARCH=${{ matrix.platform.go }}
platforms: ${{ matrix.platform.docker }}
push: false
labels: ${{ steps.meta.outputs.labels }}
annotations: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
# Build and push Docker image with Buildx (push if not on PR)
# https://github.com/docker/build-push-action
- name: Build and push Docker image outside Branch
id: build-and-push
uses: docker/build-push-action@v6
if: github.event_name != 'pull_request'
with:
context: .
file: ${{ matrix.platform.dockerfile && matrix.platform.dockerfile || 'Dockerfile' }}
build-args: GOARCH=${{ matrix.platform.go }}
platforms: ${{ matrix.platform.docker }}
push: true
labels: ${{ steps.meta.outputs.labels }}
annotations: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
outputs: type=registry,name=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }},push-by-digest=true,name-canonical=true
- name: Export digest
if: github.event_name != 'pull_request'
run: |
mkdir -p /tmp/digests
digest="${{ steps.build-and-push.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
if: github.event_name != 'pull_request'
uses: actions/upload-artifact@v4
with:
name: digests-${{ strategy.job-index }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1
create-manifests:
runs-on: ubuntu-latest
needs: [ build ]
if: github.event_name != 'pull_request'
permissions:
contents: read
packages: write
# This is used to complete the identity challenge
# with sigstore/fulcio when running outside of PRs.
id-token: write
steps:
- name: Download digests
uses: actions/download-artifact@v4
with:
pattern: digests-*
merge-multiple: true
path: /tmp/digests
# Set up BuildKit Docker container builder to be able to build
# multi-platform images and export cache
# https://github.com/docker/setup-buildx-action
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
version: v0.16.2
# Login against a Docker registry except on PR
# https://github.com/docker/login-action
- name: Log into registry ${{ env.REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# Install the cosign tool except on PR
# https://github.com/sigstore/cosign-installer
- name: Install cosign
uses: sigstore/cosign-installer@v3
with:
cosign-release: 'v2.3.0'
# Extract metadata (tags, labels) for Docker
# https://github.com/docker/metadata-action
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
type=edge,branch=main
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=sha,enable=false
- name: Create manifest list and push
working-directory: /tmp/digests
run: |
TAGS="$(jq -crj '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON")"
docker buildx imagetools create ${TAGS} \
$(printf '${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}@sha256:%s ' *)
# Sign the resulting Docker image digest except on PRs.
# This will only write to the public Rekor transparency log when the Docker
# repository is public to avoid leaking data. If you would like to publish
# transparency data even for private images, pass --force to cosign below.
# https://github.com/sigstore/cosign
- name: Sign the published Docker image
working-directory: /tmp/digests
# This step uses the identity token to provision an ephemeral certificate
# against the sigstore community Fulcio instance.
run: |
RAW_TAGS="$(jq -crj '.tags | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON")"
TAGS=""
for RAW_TAG in ${RAW_TAGS}; do
TAGS="${TAGS}$(printf "${RAW_TAG}@sha256:%s " *)"
done
for TAG in ${TAGS}; do
echo "Signing ${TAG}"
cosign sign --yes "${TAG}"
done
- name: Inspect image
run: |
RAW_TAGS="$(jq -crj '.tags | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON")"
for RAW_TAG in ${RAW_TAGS}; do
echo "Inspecting ${RAW_TAG}"
docker buildx imagetools inspect "${RAW_TAG}"
done