Files
pikasTech-sub2rank/scripts/ci/build-image.sh
T
2026-07-13 07:51:36 +02:00

49 lines
2.2 KiB
Bash
Executable File

#!/bin/sh
set -eu
source_root=${SOURCE_ROOT:?SOURCE_ROOT is required}
source_commit=${SOURCE_COMMIT:?SOURCE_COMMIT is required}
image_repository=${IMAGE_REPOSITORY:?IMAGE_REPOSITORY is required}
dockerfile=${DOCKERFILE:?DOCKERFILE is required}
build_network=${BUILD_NETWORK:?BUILD_NETWORK is required}
metadata_file=${BUILD_METADATA_FILE:?BUILD_METADATA_FILE is required}
result_file=${BUILD_RESULT_FILE:?BUILD_RESULT_FILE is required}
case "$source_commit" in
*[!0-9a-f]*|'') printf '%s\n' 'SOURCE_COMMIT must be a full lowercase Git SHA' >&2; exit 2 ;;
esac
[ "${#source_commit}" -eq 40 ] || { printf '%s\n' 'SOURCE_COMMIT must be 40 characters' >&2; exit 2; }
[ "$build_network" = host ] || { printf '%s\n' 'BUILD_NETWORK must be host' >&2; exit 2; }
case "$dockerfile" in
/*|*../*|*/..|..) printf '%s\n' 'DOCKERFILE must be a safe relative path' >&2; exit 2 ;;
esac
[ -f "$source_root/$dockerfile" ] || { printf '%s\n' 'Dockerfile is missing' >&2; exit 2; }
image_ref="$image_repository:$(printf '%s' "$source_commit" | cut -c1-12)"
rm -f "$metadata_file" "$result_file"
buildctl-daemonless.sh build \
--allow network.host \
--frontend dockerfile.v0 \
--local context="$source_root" \
--local dockerfile="$source_root" \
--opt "filename=$dockerfile" \
--opt "network=$build_network" \
--opt "build-arg:HTTP_PROXY=${HTTP_PROXY:-}" \
--opt "build-arg:HTTPS_PROXY=${HTTPS_PROXY:-}" \
--opt "build-arg:ALL_PROXY=${ALL_PROXY:-}" \
--opt "build-arg:NO_PROXY=${NO_PROXY:-}" \
--metadata-file "$metadata_file" \
--output "type=image,name=$image_ref,push=true,registry.insecure=true"
[ -s "$metadata_file" ] || { printf '%s\n' 'BuildKit metadata is missing' >&2; exit 2; }
digest=$(tr -d '\n' < "$metadata_file" | sed -n 's/.*"containerimage.digest"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n 1)
case "$digest" in
sha256:????????????????????????????????????????????????????????????????) ;;
*) printf '%s\n' 'BuildKit metadata digest is invalid' >&2; exit 2 ;;
esac
printf '{"ok":true,"phase":"image-build","status":"built","imageStatus":"built","sourceCommit":"%s","imageRef":"%s","digest":"%s","digestRef":"%s@%s","valuesPrinted":false}\n' \
"$source_commit" "$image_ref" "$digest" "$image_repository" "$digest" > "$result_file"
cat "$result_file"