Files

75 lines
2.4 KiB
YAML

name: "Setup Buildx (tiny)"
description: "Create & optionally use a docker buildx builder with an optional random name."
inputs:
name:
description: "Builder name. If empty, a random name is generated."
required: false
default: ""
use:
description: "Whether to set the builder as current (default: true)."
required: false
default: "true"
driver:
description: "Buildx driver (default: docker-container)."
required: false
default: "docker-container"
image:
description: "Optional BuildKit image (e.g. moby/buildkit:v0.15.2). If empty, not passed."
required: false
default: ""
outputs:
name:
description: "The effective builder name."
value: ${{ steps.main.outputs.name }}
runs:
using: "composite"
steps:
- id: main
shell: bash
run: |
set -euo pipefail
# Inputs
IN_NAME="${{ inputs.name }}"
IN_USE="${{ inputs.use }}"
IN_DRIVER="${{ inputs.driver }}"
IN_IMAGE="${{ inputs.image }}"
# Generate random name if empty (lowercase, 8 chars)
if [[ -z "${IN_NAME}" ]]; then
if command -v uuidgen >/dev/null 2>&1; then
RAND="$(uuidgen | tr 'A-Z' 'a-z' | tr -cd 'a-z0-9' | cut -c1-8)"
else
RAND="$(head -c 12 /dev/urandom | tr -cd 'a-z0-9' | cut -c1-8)"
fi
BUILDER_NAME="builder-${RAND}"
else
BUILDER_NAME="${IN_NAME}"
fi
# Compose driver-opts if image provided
DRIVER_OPTS=()
if [[ -n "${IN_IMAGE}" ]]; then
DRIVER_OPTS+=(--driver-opt "image=${IN_IMAGE}")
fi
# If builder exists: optionally use it; else create it
if docker buildx inspect "${BUILDER_NAME}" >/dev/null 2>&1; then
echo "ℹ️ Builder '${BUILDER_NAME}' already exists."
if [[ "${IN_USE}" == "true" ]]; then
docker buildx use "${BUILDER_NAME}"
echo "✅ Using existing builder: ${BUILDER_NAME}"
fi
else
CMD=(docker buildx create --name "${BUILDER_NAME}" --driver "${IN_DRIVER}" "${DRIVER_OPTS[@]}")
if [[ "${IN_USE}" == "true" ]]; then
CMD+=("--use")
fi
echo "+ ${CMD[*]}"
"${CMD[@]}"
echo "✅ Created${IN_USE:+ and using} builder: ${BUILDER_NAME}"
fi
# Output for downstream steps
echo "name=${BUILDER_NAME}" >> "$GITHUB_OUTPUT"