bashbrew-buildkit-env-setup.sh 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #!/usr/bin/env bash
  2. # this file is intended to be sourced before invocations of "bashbrew build" which might invoke "docker buildx" / BuildKit ("Builder: buildkit")
  3. _resolve_external_pins() {
  4. local -
  5. set -Eeuo pipefail
  6. local binDir oiDir
  7. binDir="$(dirname "$BASH_SOURCE")"
  8. oiDir="$(dirname "$binDir")"
  9. local image
  10. for image; do
  11. [ -n "$image" ]
  12. local wc
  13. wc="$(wc -l <<<"$image")"
  14. [ "$wc" -eq 1 ]
  15. local file digest
  16. if [ -n "${BASHBREW_ARCH:-}" ]; then
  17. digest="$("$oiDir/.buildkit-build-contexts.sh" "$image")"
  18. image="${digest#*=docker-image://}"
  19. [ "$image" != "$digest" ]
  20. else
  21. file="$("$oiDir/.external-pins/file.sh" "$image")"
  22. digest="$(< "$file")"
  23. [ -n "$digest" ]
  24. image+="@$digest"
  25. fi
  26. echo "$image"
  27. done
  28. }
  29. _jq_setenv() {
  30. local env="$1"; shift
  31. local val="$1"; shift
  32. jq -c --arg env "$env" --arg val "$val" '.[$env] = $val'
  33. }
  34. _bashbrew_buildkit_env_setup() {
  35. local -
  36. set -Eeuo pipefail
  37. local binDir oiDir
  38. binDir="$(dirname "$BASH_SOURCE")"
  39. oiDir="$(dirname "$binDir")"
  40. local externalPins
  41. externalPins="$("$oiDir/.external-pins/list.sh")"
  42. local vars='{}'
  43. local dockerfileTag
  44. dockerfileTag="$(grep <<<"$externalPins" -m1 '^docker/dockerfile:')"
  45. dockerfileTag="$(_resolve_external_pins "$dockerfileTag")"
  46. vars="$(_jq_setenv <<<"$vars" BASHBREW_BUILDKIT_SYNTAX "$dockerfileTag")"
  47. case "${BASHBREW_ARCH:-}" in
  48. nope) # amd64 | arm64v8) # TODO re-enable this once we figure out how to handle "docker build --tag X" + "FROM X" correctly all-local
  49. BASHBREW_BUILDKIT_IMAGE="$(grep <<<"$externalPins" -m1 '^moby/buildkit:')"
  50. BASHBREW_BUILDKIT_IMAGE="$(_resolve_external_pins "$BASHBREW_BUILDKIT_IMAGE")"
  51. export BASHBREW_BUILDKIT_IMAGE
  52. local buildxBuilder
  53. buildxBuilder="$("$binDir/docker-buildx-ensure.sh")" # reminder: this script *requires* BASHBREW_ARCH (to avoid "accidental amd64" mistakes)
  54. vars="$(_jq_setenv <<<"$vars" BUILDX_BUILDER "$buildxBuilder")"
  55. local sbomTag
  56. sbomTag="$(grep <<<"$externalPins" -m1 '^docker/buildkit-syft-scanner:')"
  57. sbomTag="$(_resolve_external_pins "$sbomTag")"
  58. vars="$(_jq_setenv <<<"$vars" BASHBREW_BUILDKIT_SBOM_GENERATOR "$sbomTag")"
  59. ;;
  60. esac
  61. if [ -t 1 ]; then
  62. jq <<<"$vars"
  63. else
  64. cat <<<"$vars"
  65. fi
  66. }
  67. _bashbrew_buildkit_env_setup