Files
tidb/br/tests/up.sh

190 lines
5.7 KiB
Bash
Executable File

#!/usr/bin/env bash
set -eo pipefail
IMAGE_TAG="nightly"
while [[ $# -gt 0 ]]
do
key="$1"
case $key in
--pull-images)
PULL_DOCKER_IMAGES=1
shift
;;
--tag)
IMAGE_TAG=$2
shift
shift
;;
--cleanup-docker)
CLEANUP_DOCKER=1
shift
;;
--cleanup-data)
CLEANUP_DATA=1
shift
;;
--cleanup-all)
CLEANUP_ALL=1
shift
;;
--bind-bin)
BIND_BIN=1
shift
;;
--help)
HELP=1
shift
;;
*)
HELP=1
break
;;
esac
done
if [ "$HELP" ]; then
echo "Usage: $0 [OPTIONS]"
echo "OPTIONS:"
echo " --help Display this message"
echo " --pull-images Update docker images used in br tests"
echo " --tag (TAG) Specify images tag used in br tests"
echo " --cleanup-docker Clean up br tests Docker containers"
echo " --cleanup-data Clean up persistent data"
echo " --cleanup-all Clean up all data inlcuding Docker images, containers and persistent data"
echo " --bind-bin Bind br/bin directory"
exit 0
fi
host_tmp=/tmp/br_tests
host_bash_history=$host_tmp/bash_history
# Persist tests data and bash history
mkdir -p $host_tmp
touch $host_bash_history || true
function cleanup_data() {
rm -rf $host_tmp || { echo try "sudo rm -rf $host_tmp"? ; exit 1; }
}
if [ "$CLEANUP_DATA" ]; then
cleanup_data
exit 0
fi
# Clean up docker images and containers.
docker_repo=br_tests
function cleanup_docker_containers() {
containers=$(docker container ps --all --filter="ancestor=$docker_repo:$IMAGE_TAG" -q)
if [ "$containers" ]; then
docker stop $containers
docker rm $containers
fi
}
function cleanup_docker_images() {
images=$(docker images --filter="reference=$docker_repo:$IMAGE_TAG" -q)
if [ "$images" ]; then
docker rmi $images
fi
}
if [ "$CLEANUP_DOCKER" ]; then
cleanup_docker_containers
exit 0
fi
if [ "$CLEANUP_ALL" ]; then
cleanup_data
cleanup_docker_containers
cleanup_docker_images
exit 0
fi
if [ "$PULL_DOCKER_IMAGES" ]; then
for image in "pingcap/tidb" "pingcap/tikv" "pingcap/pd" "pingcap/ticdc" "pingcap/tiflash" "pingcap/tidb-lightning"; do
docker pull $image:$IMAGE_TAG
docker tag $image:$IMAGE_TAG $image:$IMAGE_TAG.$docker_repo
done
fi
docker build -t $docker_repo:$IMAGE_TAG - << EOF
FROM pingcap/tidb:$IMAGE_TAG.$docker_repo AS tidb-builder
FROM pingcap/tikv:$IMAGE_TAG.$docker_repo AS tikv-builder
FROM pingcap/pd:$IMAGE_TAG.$docker_repo AS pd-builder
FROM pingcap/ticdc:$IMAGE_TAG.$docker_repo AS ticdc-builder
FROM pingcap/tiflash:$IMAGE_TAG.$docker_repo AS tiflash-builder
FROM pingcap/tidb-lightning:$IMAGE_TAG.$docker_repo AS lightning-builder
FROM pingcap/br:v4.0.8 AS br408-builder
FROM minio/minio AS minio-builder
FROM minio/mc AS mc-builder
FROM fsouza/fake-gcs-server AS gcs-builder
FROM golang:1.16.4-buster as ycsb-builder
WORKDIR /go/src/github.com/pingcap/
RUN git clone https://github.com/pingcap/go-ycsb.git && \
cd go-ycsb && \
go mod tidy && \
make && \
cp bin/go-ycsb /go-ycsb
FROM golang:1.18.4-buster
RUN apt-get update && apt-get install -y --no-install-recommends \
git \
curl \
wget \
openssl \
lsof \
psmisc \
vim \
less \
jq \
default-mysql-client
RUN mkdir -p /br/bin
COPY --from=tidb-builder /tidb-server /br/bin/tidb-server
COPY --from=tikv-builder /tikv-server /br/bin/tikv-server
COPY --from=pd-builder /pd-server /br/bin/pd-server
COPY --from=pd-builder /pd-ctl /br/bin/pd-ctl
COPY --from=ticdc-builder /cdc /br/bin/cdc
COPY --from=br408-builder /br /br/bin/brv4.0.8
COPY --from=ycsb-builder /go-ycsb /br/bin/go-ycsb
COPY --from=tiflash-builder /tiflash/tiflash /br/bin/tiflash
COPY --from=tiflash-builder /tiflash/libtiflash_proxy.so /br/bin/libtiflash_proxy.so
COPY --from=tiflash-builder /tiflash/flash_cluster_manager /br/bin/flash_cluster_manager
COPY --from=lightning-builder /tikv-importer /br/bin/tikv-importer
COPY --from=minio-builder /opt/bin/minio /br/bin/minio
COPY --from=mc-builder /usr/bin/mc /br/bin/mc
COPY --from=gcs-builder /bin/fake-gcs-server /br/bin/fake-gcs-server
WORKDIR /br
# Required by tiflash
ENV LD_LIBRARY_PATH=/br/bin
ENTRYPOINT ["/bin/bash"]
EOF
# Start an existing container or create and run a new container.
exist_container=$(docker container ps --all -q --filter="ancestor=$docker_repo:$IMAGE_TAG" --filter="status=exited" | head -n 1)
if [ "$exist_container" ]; then
docker start $exist_container
echo "Attach exsiting container: $exist_container"
exec docker attach $exist_container
else
volume_args=
for f in `ls -a`; do
if [ $f = "." ] || [ $f = ".." ]; then
continue
fi
if [ $f = "bin" ] && [ ! "$BIND_BIN" ]; then
continue
fi
volume_args="$volume_args -v `pwd`/$f:/br/$f"
done
echo "Run a new container"
exec docker run -it \
-v $host_tmp:/tmp/br/tests \
-v $host_bash_history:/root/.bash_history \
$volume_args \
$docker_repo:$IMAGE_TAG
fi