#!/usr/bin/env bash set -eu; CI_PIPELINE_NUMBER=1 CI_REPO_URL=CI_REPO_URL CI_COMMIT_SHA=123 CI_REPO_CLONE_URL=CI_REPO_CLONE_URL PLUGIN_ANNOTATION='{"org.opencontainers.image.description":"A Woodpecker CI plugin for yamllint to lint yaml files.","org.opencontainers.image.documentation":"$CI_REPO_URL/README.md","org.opencontainers.image.licenses":"EUPL-1.2","org.opencontainers.image.ref.name":"kokuwaio/buildctl","org.opencontainers.image.revision":"$CI_COMMIT_SHA","org.opencontainers.image.source":"$CI_REPO_CLONE_URL","org.opencontainers.image.title":"Buildctl Plugin","org.opencontainers.image.url":"$CI_REPO_URL","org.opencontainers.image.vendor":"kokuwa.io","org.opencontainers.image.version":"v0.21.0"}' PLUGIN_NAME=kokuwaio/buildctl PLUGIN_PLATFORM=linux/amd64,linux/arm64 #PLUGIN_AUTH='{"auths":{"registry.kokuwa.io":{"auth":"d29vZHBlY2tlcjo5cVRrVlpXSW1ITndXWXVMZ1pMajVST0FuYmZlOTEyUjlLWFFIVW51MG1iOGx5UWl5Z3hFUEZxVTN0REo5VzdE"},"ghcr.io":{"auth":"c3NjaG5hYmU6Z2hwX0lHVEswWkk0YTBqN2EzTjNIMlBmOEc2UFl1eGpEYjRmUlk0Yw=="},"https://index.docker.io/v1/":{"auth":"c3NjaG5hYmU6ZGNrcl9wYXRfZ3RnZ1k4RFdzUjJmZlRLTU1yWVI2cFR5Y1VF=="}}}' #PLUGIN_AUTH='{"index.docker.io":{"password":"dckr_pat_gtggY8DWsR2ffTKMMrYR6pTycUE","username":"sschnabe"},"ghcr.io":{"password":"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","username":"kokuwaio-bot"},"registry.kokuwa.io":{"password":"6u9ij2qtqJiGbvnsgVuUyHc2OSHmtX6mC1wbmR253GwJN8IpbawyybYHIxu0hbRw","username":"woodpecker"}}' DOCKER_CONFIG=. #echo $PLUGIN_AUTH | base64 -w0 ## ## 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' testet and supported yet." exit 1 fi SOURCE_DATE_EPOCH=${PLUGIN_SOURCE_DATE_EPOCH:-0} if [[ -n "${PLUGIN_AUTH:-}" ]]; then mkdir -p "$HOME/.docker" 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" COMMAND="$COMMAND build" if [[ -n "${PLUGIN_ADDR:-}" ]]; then COMMAND="$COMMAND --addr $PLUGIN_ADDR" fi COMMAND="$COMMAND --frontend $BUILDCTL_FRONTEND" COMMAND="$COMMAND --local context='$BUILDCTL_CONTEXT'" COMMAND="$COMMAND --local dockerfile='$BUILDCTL_DOCKERFILE'" if [[ "${PLUGIN_PLATFORM:-}" == "true" ]]; then COMMAND="$COMMAND --opt platform='$PLUGIN_PLATFORM'" fi # https://github.com/moby/buildkit/blob/master/README.md#output OUTPUT="" if [[ -n "${PLUGIN_NAME:-}" ]]; then OUTPUT="--output type=image,\"name=$PLUGIN_NAME\",push=${PLUGIN_PUSH:-true}" OUTPUT="$OUTPUT,oci-mediatypes=true,oci-artifact=true,compression=estargz,compression-level=9" OUTPUT="$OUTPUT,rewrite-timestamp=true" OUTPUT="$OUTPUT$(echo "$PLUGIN_ANNOTATION" | jq --join-output 'keys[] as $k|",annotation.\($k)=\"\(.[$k])\""')" fi COMMAND="$COMMAND $OUTPUT" # custom args, e.g. docker run --rm --volume=$HOME:HOME:ro --workdir=$PWD kokuwaio/buildkit --opt buildarg=foo=bar if [[ -n "${1:-}" ]]; then COMMAND="$COMMAND $*" fi ## ## execute command ## echo echo Reproduce with docker: echo echo "SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH docker buildx build ${PLUGIN_CONTEXT:-.}" echo " --no-cache" if [[ "${PLUGIN_PLATFORM:-}" == "true" ]]; then echo " --platform='$PLUGIN_PLATFORM'" fi if [[ -n "${OUTPUT:-}" ]]; then echo " $OUTPUT" fi echo echo Running now: echo echo -e "SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH ${COMMAND// --/\\n --}" echo echo "$HOME/.docker/config.json" cat "$HOME/.docker/config.json" | base64 -w0 cat "$HOME/.docker/config.json" | jq eval "$COMMAND"