buildctl/entrypoint.sh
Stephan Schnabel 3f33dcc8e0
All checks were successful
ci/woodpecker/push/dockerhub Pipeline was successful
ci/woodpecker/push/lint Pipeline was successful
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/push/test/1 Pipeline was successful
ci/woodpecker/push/test/2 Pipeline was successful
Initial draft of plugin.
2025-06-13 15:07:16 +02:00

83 lines
2.3 KiB
Bash
Executable file

#!/usr/bin/env bash
set -eu;
##
## check input
##
BUILDCTL_CONTEXT=${PLUGIN_CONTEXT:-$(pwd)}
BUILDCTL_DOCKERFILE=$(dirname "${PLUGIN_DOCKERFILE:-$BUILDCTL_CONTEXT/Dockerfile}")
if [[ ! -f $BUILDCTL_DOCKERFILE/Dockerfile ]]; then
echo "Dockerfile $BUILDCTL_DOCKERFILE/Dockerfile not found!"
exit 1
fi
BUILDCTL_FRONTEND=${PLUGIN_FRONTEND:-dockerfile.v0}
if [[ "$BUILDCTL_FRONTEND" != "dockerfile.v0" ]]; then
echo "Only frontend 'dockerfile.v0' tested and supported yet."
exit 1
fi
SOURCE_DATE_EPOCH=${PLUGIN_SOURCE_DATE_EPOCH:-0}
if [[ -n "${PLUGIN_AUTH:-}" ]]; then
echo "$PLUGIN_AUTH" | jq -r 'to_entries|map({(.key):{"auth":(.value.username+":"+.value.password)|@base64}})|add|{"auths":.}' > "$HOME/.docker/config.json"
echo "Stored credentials at $HOME/.docker/config.json"
echo
fi
##
## build command
##
COMMAND="buildctl build"
if [[ -n "${PLUGIN_ADDR:-}" ]]; then
COMMAND+=" --addr=$PLUGIN_ADDR"
fi
COMMAND+=" --frontend=$BUILDCTL_FRONTEND"
COMMAND+=" --local=context=$BUILDCTL_CONTEXT"
COMMAND+=" --local=dockerfile=$BUILDCTL_DOCKERFILE"
if [[ -n "${PLUGIN_PLATFORM:-}" ]]; then
COMMAND+=" --opt=platform=$PLUGIN_PLATFORM"
fi
COMMAND+=" --opt=build-arg:SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH"
# https://github.com/moby/buildkit/blob/master/README.md#output
if [[ -n "${PLUGIN_NAME:-}" ]]; then
OUTPUT="type=image"
if [[ "$PLUGIN_NAME" =~ .*,.* ]]; then
# https://github.com/moby/buildkit/issues/797#issuecomment-1561601104
OUTPUT+=",\"name=$PLUGIN_NAME\""
else
OUTPUT+=",name=$PLUGIN_NAME"
fi
if [[ -n "${PLUGIN_ANNOTATION:-}" ]]; then
OUTPUT+="$(eval "echo \"${PLUGIN_ANNOTATION//\"/\\\"}\"" | jq --join-output 'keys[] as $k|",annotation.\($k)=\(.[$k])"')"
fi
OUTPUT+=",push=${PLUGIN_PUSH:-true},oci-mediatypes=true,compression=estargz,compression-level=9,rewrite-timestamp=true"
COMMAND+=" --output='$OUTPUT'"
fi
##
## execute command
##
echo
echo Reproduce with docker:
echo
echo " docker buildx build ${PLUGIN_CONTEXT:-.} \\"
echo " --no-cache \\"
echo " --provenance=false \\"
echo " --build-arg=SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH \\"
if [[ -n "${PLUGIN_PLATFORM:-}" ]]; then
echo " --platform='$PLUGIN_PLATFORM' \\"
fi
if [[ -n "${OUTPUT:-}" ]]; then
echo " --output='${OUTPUT//push=true/push=false}'"
fi
echo
echo Running now:
echo
echo -e " ${COMMAND// --/ \\n --}"
echo
eval "$COMMAND"