#!/usr/bin/env bash
set -euo pipefail
set +x

: "${GITHUB_SHA:?GITHUB_SHA is required}"
: "${IMAGE_NAME:?IMAGE_NAME is required}"
: "${IMAGE_REPOSITORY:?IMAGE_REPOSITORY is required}"
: "${IMAGE_DOCKERFILE:?IMAGE_DOCKERFILE is required}"
: "${PUSH_REGISTRY:?PUSH_REGISTRY is required}"
: "${PULL_REGISTRY:?PULL_REGISTRY is required}"
: "${SPIRE_AGENT_SOCKET:?SPIRE_AGENT_SOCKET is required}"

# Bootstrap the image that first introduces automatic Docker setup. Once that
# runner is deployed, the job-started hook makes this an idempotent no-op.
sudo scripts/setup-job-docker

image_tag="sha-${GITHUB_SHA}"
metadata="${IMAGE_NAME}-metadata.json"
docker_config=$(mktemp -d)
jwt_file=$(mktemp)
cleanup() {
  docker buildx rm ci-builder >/dev/null 2>&1 || true
  rm -rf -- "$docker_config" "$jwt_file"
}
trap cleanup EXIT
export DOCKER_CONFIG="$docker_config"

/opt/spire/bin/spire-agent api fetch jwt \
  -audience zot \
  -socketPath "$SPIRE_AGENT_SOCKET" \
  -output json >"$jwt_file"
# shellcheck disable=SC2016
jq -er '.[0].svids[0].svid' "$jwt_file" | \
  docker login "$PUSH_REGISTRY" --username zot --password-stdin

docker buildx create \
  --name ci-builder \
  --driver docker-container \
  --use

docker buildx build \
  --builder ci-builder \
  --platform linux/amd64 \
  --file "$IMAGE_DOCKERFILE" \
  --tag "${PUSH_REGISTRY}/${IMAGE_REPOSITORY}:${image_tag}" \
  --tag "${PUSH_REGISTRY}/${IMAGE_REPOSITORY}:main" \
  --provenance=mode=max \
  --sbom=true \
  --metadata-file "$metadata" \
  --push \
  .

image_digest=$(
  # shellcheck disable=SC2016
  jq -er '."containerimage.digest"' "$metadata"
)
image_ref="${PULL_REGISTRY}/${IMAGE_REPOSITORY}@${image_digest}"

printf '%s=%s\n' "$IMAGE_NAME" "$image_ref"
if [[ -n "${GITHUB_STEP_SUMMARY:-}" ]]; then
  {
    printf '## Published image\n\n'
    # shellcheck disable=SC2016
    printf -- '- %s: `%s`\n' "$IMAGE_NAME" "$image_ref"
    # shellcheck disable=SC2016
    printf -- '- Source: `%s`\n' "$GITHUB_SHA"
  } >>"$GITHUB_STEP_SUMMARY"
fi
