Skip to content

Build MinIO Docker Images #17

Build MinIO Docker Images

Build MinIO Docker Images #17

Workflow file for this run

name: Build MinIO Docker Images
on:
schedule:
# Run daily at 00:00 UTC to check for new releases
- cron: '0 0 * * *'
workflow_dispatch:
inputs:
version:
description: 'MinIO version to build (e.g., RELEASE.2024-10-13T13-34-11Z). Leave empty to build latest.'
required: false
type: string
force_rebuild:
description: 'Force rebuild even if image already exists'
required: false
type: boolean
default: false
skip_latest_tag:
description: 'Skip tagging as latest (useful for building older versions)'
required: false
type: boolean
default: false
env:
GITHUB_REGISTRY: ghcr.io
IMAGE_NAME: amoniacou/minio
jobs:
check-release:
runs-on: ubuntu-24.04
outputs:
version: ${{ steps.minio-release.outputs.version }}
clean_version: ${{ steps.minio-release.outputs.clean_version }}
should_build: ${{ steps.check-image.outputs.exists == 'false' }}
steps:
- name: Get latest MinIO release
id: minio-release
run: |
if [ -n "${{ github.event.inputs.version }}" ]; then
VERSION="${{ github.event.inputs.version }}"
echo "Using manually specified version: $VERSION"
else
# Fetch the latest release from MinIO GitHub
LATEST_RELEASE=$(curl -s https://api.github.com/repos/minio/minio/releases/latest | jq -r '.tag_name')
VERSION="$LATEST_RELEASE"
echo "Latest MinIO release: $VERSION"
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
# Extract a clean version for Docker tags (remove RELEASE. prefix if present)
CLEAN_VERSION=$(echo "$VERSION" | sed 's/^RELEASE\.//')
echo "clean_version=$CLEAN_VERSION" >> $GITHUB_OUTPUT
- name: Check if image already exists
id: check-image
run: |
VERSION="${{ steps.minio-release.outputs.version }}"
GHCR_IMAGE="${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}"
FORCE_REBUILD="${{ github.event.inputs.force_rebuild }}"
# If force_rebuild is true, always rebuild
if [ "$FORCE_REBUILD" = "true" ]; then
echo "Force rebuild enabled, skipping existence check"
echo "exists=false" >> $GITHUB_OUTPUT
# Try to pull the image to see if it exists
elif docker manifest inspect "${GHCR_IMAGE}:${VERSION}" > /dev/null 2>&1; then
echo "Image ${GHCR_IMAGE}:${VERSION} already exists"
echo "exists=true" >> $GITHUB_OUTPUT
else
echo "Image ${GHCR_IMAGE}:${VERSION} does not exist, will build"
echo "exists=false" >> $GITHUB_OUTPUT
fi
build-push:
strategy:
matrix:
include:
- arch: amd64
runner: ubuntu-24.04
- arch: arm64
runner: ubuntu-24.04-arm
runs-on: ${{ matrix.runner }}
needs: check-release
if: needs.check-release.outputs.should_build == 'true'
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to ${{ env.GITHUB_REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.GITHUB_REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and Push Image (${{ matrix.arch }})
uses: docker/build-push-action@v6
with:
context: .
platforms: linux/${{ matrix.arch }}
push: true
build-args: |
MINIO_VERSION=${{ needs.check-release.outputs.version }}
tags: |
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.check-release.outputs.version }}-${{ matrix.arch }}
cache-from: type=gha
cache-to: type=gha,mode=max
merge-manifest:
runs-on: ubuntu-latest
needs: [check-release, build-push]
if: needs.check-release.outputs.should_build == 'true'
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- name: Login to ${{ env.GITHUB_REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.GITHUB_REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Create & publish manifest on ${{ env.GITHUB_REGISTRY }}
run: |
TAGS="-t ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.check-release.outputs.version }}"
TAGS="$TAGS -t ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.check-release.outputs.clean_version }}"
# Only add latest tag if skip_latest_tag is false
if [ "${{ github.event.inputs.skip_latest_tag }}" != "true" ]; then
TAGS="$TAGS -t ${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:latest"
fi
docker buildx imagetools create \
$TAGS \
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.check-release.outputs.version }}-amd64 \
${{ env.GITHUB_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.check-release.outputs.version }}-arm64