github.com/docker/buildx@v0.14.1-0.20240514123050-afcb609966dc/hack/test-driver (about)

     1  #!/usr/bin/env bash
     2  
     3  set -eu -o pipefail
     4  
     5  : "${BUILDX_CMD=docker buildx}"
     6  : "${BUILDKIT_IMAGE=moby/buildkit:buildx-stable-1}"
     7  : "${BUILDKIT_CFG=}"
     8  : "${DRIVER=docker-container}"
     9  : "${DRIVER_OPT=}"
    10  : "${ENDPOINT=}"
    11  : "${MULTI_NODE=0}"
    12  : "${PLATFORMS=linux/amd64,linux/arm64}"
    13  
    14  function buildxCmd {
    15    (set -x ; $BUILDX_CMD "$@")
    16  }
    17  
    18  function clean {
    19    rm -rf "$context"
    20    if [ "$builderName" != "default" ]; then
    21      buildxCmd rm "$builderName"
    22    fi
    23  }
    24  
    25  context=$(mktemp -d -t buildx-output.XXXXXXXXXX)
    26  dockerfile=${context}/Dockerfile
    27  bakedef=${context}/docker-bake.hcl
    28  trap clean EXIT
    29  
    30  builderName=buildx-test-$(openssl rand -hex 16)
    31  buildPlatformFlag=
    32  if [ "$DRIVER" = "docker" ]; then
    33    builderName=default
    34  else
    35    buildPlatformFlag=--platform="${PLATFORMS}"
    36  fi
    37  
    38  if [ "$DRIVER" != "remote" ]; then
    39    driverOpt=${driverOpt:+"${driverOpt},"}image=${BUILDKIT_IMAGE}
    40  fi
    41  if [ -n "$DRIVER_OPT" ]; then
    42    driverOpt=${driverOpt:+"${driverOpt},"}$DRIVER_OPT
    43  fi
    44  
    45  # create builder except for docker driver
    46  if [ "$DRIVER" != "docker" ]; then
    47    if [ "${MULTI_NODE}" = "1" ]; then
    48      firstNode=1
    49      for platform in ${PLATFORMS//,/ }; do
    50        createFlags=""
    51        if [ -f "$BUILDKIT_CFG" ]; then
    52          createFlags="$createFlags --buildkitd-config=${BUILDKIT_CFG}"
    53        fi
    54        if [ "$firstNode" = "0" ]; then
    55          createFlags="$createFlags --append"
    56        fi
    57        nodeName=""
    58        if [ "$DRIVER" != "kubernetes" ]; then
    59          nodeName="${builderName}-${platform/\//-}"
    60        fi
    61        buildxCmd create ${createFlags} \
    62          --bootstrap \
    63          --name="${builderName}" \
    64          --node="${nodeName}" \
    65          --platform="${platform}" \
    66          --driver="${DRIVER}" \
    67          ${driverOpt:+"--driver-opt=${driverOpt}"} \
    68          ${ENDPOINT}
    69        firstNode=0
    70      done
    71    else
    72      createFlags=""
    73      if [ -f "$BUILDKIT_CFG" ]; then
    74        createFlags="$createFlags --buildkitd-config=${BUILDKIT_CFG}"
    75      fi
    76      buildxCmd create ${createFlags} \
    77        --bootstrap \
    78        --name="${builderName}" \
    79        --platform="${PLATFORMS}" \
    80        --driver="${DRIVER}" \
    81        ${driverOpt:+"--driver-opt=${driverOpt}"} \
    82        ${ENDPOINT}
    83    fi
    84  fi
    85  
    86  function buildOutput {
    87    local name=$1
    88    if [ "$DRIVER" != "docker" ]; then
    89      if [ "${MULTI_NODE}" = "1" ]; then
    90        echo "type=cacheonly"
    91      else
    92        echo "type=oci,dest=${context}/${name}.tar"
    93      fi
    94    else
    95      echo "type=docker,name=${name}"
    96    fi
    97  }
    98  
    99  # multi-platform not supported by docker driver
   100  buildPlatformFlag=
   101  bakePlatformFlag=
   102  if [ "$DRIVER" != "docker" ]; then
   103    buildPlatformFlag=--platform="${PLATFORMS}"
   104    bakePlatformFlag=--set="*.platform=${PLATFORMS}"
   105  fi
   106  
   107  # inspect and bootstrap
   108  buildxCmd inspect --bootstrap --builder="${builderName}"
   109  
   110  # create dockerfile
   111  cat > "${dockerfile}" <<EOL
   112  FROM busybox as build
   113  ARG TARGETPLATFORM
   114  ARG BUILDPLATFORM
   115  RUN echo "I am running on \$BUILDPLATFORM, building for \$TARGETPLATFORM" > /log
   116  
   117  FROM busybox AS log
   118  COPY --from=build /log /log
   119  RUN cat /log
   120  RUN uname -a
   121  
   122  FROM busybox AS hello
   123  RUN echo hello > /hello
   124  
   125  FROM scratch
   126  COPY --from=log /log /log
   127  COPY --from=hello /hello /hello
   128  EOL
   129  
   130  # build
   131  buildxCmd build ${buildPlatformFlag} \
   132    --output="$(buildOutput buildx-test-build)" \
   133    --builder="${builderName}" \
   134    --metadata-file="${context}/metadata-build.json" \
   135    "${context}"
   136  cat "${context}/metadata-build.json"
   137  
   138  # load to docker store
   139  if [ "$DRIVER" != "docker" ]; then
   140    buildxCmd build \
   141      --output="type=docker,name=buildx-test-load" \
   142      --builder="${builderName}" \
   143      "${context}"
   144  fi
   145  
   146  # create bake def
   147  cat > "${bakedef}" <<EOL
   148  group "default" {
   149    targets = ["release"]
   150  }
   151  group "all" {
   152    targets = ["log", "hello"]
   153  }
   154  target "release" {
   155    output = ["$(buildOutput buildx-test-bake-release)"]
   156  }
   157  target "log" {
   158    output = ["$(buildOutput buildx-test-bake-log)"]
   159  }
   160  target "hello" {
   161    output = ["$(buildOutput buildx-test-bake-hello)"]
   162  }
   163  EOL
   164  
   165  # bake default target
   166  buildxCmd bake ${bakePlatformFlag} \
   167    --file="${bakedef}" \
   168    --builder="${builderName}" \
   169    --set "*.context=${context}" \
   170    --metadata-file="${context}/metadata-bake-def.json"
   171  cat "${context}/metadata-bake-def.json"
   172  
   173  # bake all target
   174  buildxCmd bake ${bakePlatformFlag} \
   175    --file="${bakedef}" \
   176    --builder="${builderName}" \
   177    --set "*.context=${context}" \
   178    --metadata-file="${context}/metadata-bake-all.json" \
   179    all
   180  cat "${context}/metadata-bake-all.json"