Files
buildkit/hack/test
Alex Couture-Beil 6695ae0932 dockerfile: arg for controlling go build flags
This introduces new `BUILDFLAGS`, `VERIFYFLAGS`, and `CGO_ENABLED` build-args,
which can be used to change how buildkitd is compiled.

This, for example, can be used to enable the go data race detector during
integration testing:

    CGO_ENABLED=1 BUILDFLAGS="-race" TESTFLAGS="-v -test.run=TestClientGatewayIntegration/TestClientGatewaySolve" TESTPKGS=./client ./hack/test integration

This additionally introduces a new `make test-race` target, which
simplifies how to run all tests with the race detector.

Signed-off-by: Alex Couture-Beil <alex@earthly.dev>
2023-07-06 16:34:44 -07:00

149 lines
5.3 KiB
Bash
Executable File

#!/usr/bin/env bash
. $(dirname $0)/util
set -eu -o pipefail
: ${HTTP_PROXY=}
: ${HTTPS_PROXY=}
: ${NO_PROXY=}
: ${TEST_INTEGRATION=}
: ${TEST_GATEWAY=}
: ${TEST_DOCKERFILE=}
: ${TEST_DOCKERD=}
: ${TEST_DOCKERD_BINARY=$(which dockerd)}
: ${TEST_REPORT_SUFFIX=}
: ${TEST_KEEP_CACHE=}
: ${BUILDFLAGS=}
: ${VERIFYFLAGS=}
: ${CGO_ENABLED=}
: ${DOCKERFILE_RELEASES=}
: ${BUILDKIT_WORKER_RANDOM=}
: ${BUILDKITD_TAGS=}
if [ "$TEST_DOCKERD" == "1" ]; then
if [ ! -f "$TEST_DOCKERD_BINARY" ]; then
echo "dockerd binary not found"
exit 1
fi
if [ ! -x "$TEST_DOCKERD_BINARY" ]; then
chmod +x "$TEST_DOCKERD_BINARY"
fi
if ! file "$TEST_DOCKERD_BINARY" | grep "statically linked" >/dev/null; then
echo "dockerd binary needs to be statically linked"
exit 1
fi
fi
if [ "$#" == 0 ]; then TEST_INTEGRATION=1; fi
while test $# -gt 0; do
case "$1" in
gateway)
TEST_GATEWAY=1
;;
dockerfile)
TEST_DOCKERFILE=1
;;
integration)
TEST_INTEGRATION=1
;;
*)
echo "unknown arg $1"
;;
esac
shift
done
iid="buildkit-tests"
iidfile=$(mktemp -t docker-iidfile.XXXXXXXXXX)
testReportsDir="$(pwd)/bin/testreports"
mkdir -p "$testReportsDir"
testReportsVol="-v $testReportsDir:/testreports"
gotestsumArgs="--format=standard-verbose --jsonfile=/testreports/go-test-report$TEST_REPORT_SUFFIX.json --junitfile=/testreports/junit-report$TEST_REPORT_SUFFIX.xml"
gotestArgs="-mod=vendor -coverprofile=/testreports/coverage-report$TEST_REPORT_SUFFIX.txt -covermode=atomic"
if [[ "$BUILDFLAGS" == *"-race"* ]]; then
if [ "$CGO_ENABLED" != "1" ]; then
echo>&2 "go race detector requires CGO_ENABLED=1"
exit 1
fi
# force buildkitd to halt on detected race conditions, which will cause the tests to fail
export GORACE="halt_on_error=1"
export VERIFYFLAGS="" # prevent -static verification
fi
buildxCmd build $cacheFromFlags \
--build-arg BUILDKITD_TAGS \
--build-arg HTTP_PROXY \
--build-arg HTTPS_PROXY \
--build-arg NO_PROXY \
--build-arg BUILDFLAGS \
--build-arg VERIFYFLAGS \
--build-arg CGO_ENABLED \
--target "integration-tests" \
--output "type=docker,name=$iid" \
$currentcontext
cacheVolume="buildkit-test-cache"
if ! docker container inspect "$cacheVolume" >/dev/null 2>/dev/null; then
docker create -v /root/.cache -v /root/.cache/registry -v /go/pkg/mod --name "$cacheVolume" alpine
fi
if [ "$TEST_INTEGRATION" == 1 ]; then
cid=$(docker create --rm -v /tmp $testReportsVol --volumes-from=$cacheVolume -e GITHUB_REF -e ACTIONS_RUNTIME_TOKEN -e ACTIONS_CACHE_URL -e TEST_DOCKERD -e SKIP_INTEGRATION_TESTS -e BUILDKIT_TEST_ENABLE_FEATURES -e GOTESTSUM_FORMAT ${BUILDKIT_INTEGRATION_SNAPSHOTTER:+"-eBUILDKIT_INTEGRATION_SNAPSHOTTER"} -e BUILDKIT_REGISTRY_MIRROR_DIR=/root/.cache/registry -e BUILDKIT_INTEGRATION_DOCKERD_FLAGS -e GORACE --privileged $iid gotestsum $gotestsumArgs --packages="${TESTPKGS:-./...}" -- $gotestArgs ${TESTFLAGS:--v})
if [ "$TEST_DOCKERD" = "1" ]; then
docker cp "$TEST_DOCKERD_BINARY" $cid:/usr/bin/dockerd
fi
docker start -a $cid
fi
if [ "$TEST_GATEWAY" == 1 ]; then
# Build-test "github.com/moby/buildkit/frontend/gateway/client", which isn't otherwise built by CI
# It really only needs buildkit-base. We have integration-tests in $iid, which is a direct child of buildkit-base.
cid=$(docker create --rm --volumes-from=$cacheVolume --entrypoint="" $iid go build -v ./frontend/gateway/client)
docker start -a $cid
fi
DOCKERFILE_RELEASES_CUSTOM=""
if [ "$TEST_DOCKERFILE" == 1 ]; then
if [ -z $DOCKERFILE_RELEASES ]; then
DOCKERFILE_RELEASES="mainline labs"
else
DOCKERFILE_RELEASES_CUSTOM=1
fi
# These tests run only on single random worker by default because the test matrix is big.
# If flags are set then this is disabled and you need to use the flags to set specific worker.
if [ -z "$BUILDKIT_WORKER_RANDOM" ] && [ -z "$TESTFLAGS" ]; then
export BUILDKIT_WORKER_RANDOM=1
fi
for release in $DOCKERFILE_RELEASES; do
buildtags=$(cat ./frontend/dockerfile/release/$release/tags)
tarout=$(mktemp -t dockerfile-frontend.XXXXXXXXXX)
buildxCmd build $cacheFromFlags \
--build-arg "BUILDTAGS=$buildtags" \
--file "./frontend/dockerfile/cmd/dockerfile-frontend/Dockerfile" \
--output "type=oci,dest=$tarout" \
$currentcontext
if [ -s $tarout ]; then
if [ "$release" = "mainline" ] || [ "$release" = "labs" ] || [ -n "$DOCKERFILE_RELEASES_CUSTOM" ] || [ "$GITHUB_ACTIONS" = "true" ]; then
cid=$(docker create -v /tmp $testReportsVol --rm --privileged --volumes-from=$cacheVolume -e GITHUB_REF -e ACTIONS_RUNTIME_TOKEN -e ACTIONS_CACHE_URL -e TEST_DOCKERD -e BUILDKIT_TEST_ENABLE_FEATURES -e GOTESTSUM_FORMAT -e BUILDKIT_REGISTRY_MIRROR_DIR=/root/.cache/registry -e BUILDKIT_WORKER_RANDOM -e BUILDKIT_INTEGRATION_DOCKERD_FLAGS -e FRONTEND_GATEWAY_ONLY=local:/$release.tar -e EXTERNAL_DF_FRONTEND=/dockerfile-frontend -e GORACE $iid gotestsum $gotestsumArgs --packages=./frontend/dockerfile -- $gotestArgs --count=1 -tags "$buildtags" ${TESTFLAGS:--v})
docker cp $tarout $cid:/$release.tar
if [ "$TEST_DOCKERD" = "1" ]; then
docker cp "$TEST_DOCKERD_BINARY" $cid:/usr/bin/dockerd
fi
docker start -a $cid
fi
fi
rm $tarout
done
fi
if [ "$TEST_KEEP_CACHE" != "1" ]; then
docker rm -v $cacheVolume
fi