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"