Files
spark/tools/deploy-docker-compose.sh
T
John Colvin 146a52f0ab Configure datastream deployment with docker-compose
To deploy to aws, connect to our aws vpn then run:
tools/deploy-docker-compose.sh

The deploy script does the following:
* builds sparkd
* builds datastream apps (pubsub, md-publisher, and webapp)
* uploads the build to aws
* bounces all services (sparkd, pubsub, md-publisher, and webapp)

Note: the name 'md-publisher' refers to DataStreamPublisher w/ MarketData
configuration
2024-10-21 13:29:59 +00:00

197 lines
5.3 KiB
Bash
Executable File

#!/usr/bin/env bash
print_help_and_exit() {
cat <<EOF
Usage: deploy-docker-compose.sh [OPTIONS] <app> <container_prefix> <release>
Positionals:
app The application to bounce [PubSubServer | DataStreamPublisher | Bts.DataStreamWebApp.Server]
release The release id. This will be appended to the container prefix to form the new container name.
Options:
--app APP The application to bounce [PubSubServer | DataStreamPublisher | Bts.DataStreamWebApp.Server]
--release The release id. This will be appended to the container prefix to form the new container name.
--dockerfile PATH The Dockerfile used to build the image.
EOF
exit "$1"
}
app_name=""
release=""
cfg_profile=""
dockerfile=""
while [[ $# -gt 0 ]]; do
case "$1" in
--app)
if [[ -z "$2" ]]; then
echo "App (--app) must be non-empty"
print_help_and_exit 1
fi
app_name="$2"
shift 2
;;
--release)
if [[ -z "$2" ]]; then
echo "Release (--release) must be non-empty"
print_help_and_exit 1
fi
release="$2"
shift 2
;;
--dockerfile)
if [[ -z "$2" ]]; then
echo "Dockerfile (--dockerfile) must be non-empty"
print_help_and_exit 1
fi
dockerfile="$(realpath "$2")"
shift 2
;;
-h)
;&
--help)
print_help_and_exit 0
;;
-*)
echo "Unexpected option '$1'"
print_help_and_exit 1
;;
*)
# Positionals
if [[ -z "$1" ]]; then
echo "Invalid position argument '$1'"
print_help_and_exit 1
elif [[ -z "$app_name" ]]; then
app_name="$1"
elif [[ -z "$container_prefix" ]]; then
container_prefix="$1"
elif [[ -z "$release" ]]; then
release="$1"
fi
shift 1
;;
esac
done
# Validate args
if [ "$release" == "" ]; then
# Use commit sha
release="$(git rev-parse --short HEAD)"
fi
if [ "$release" == "" ]; then
echo "Release not defined"
print_help_and_exit 1
fi
this_dir="$(realpath "$(dirname "${BASH_SOURCE[0]}")")"
cd $this_dir/..
if [[ -z "$composefile" ]]; then
composefile="compose.production.yaml"
fi
release_dir=".tmp/$release"
rm -rf "$release_dir"
rm -f ".tmp/$release.tar.gz"
mkdir -p "$release_dir"
# Build sparkd
build_sparkd_sh="$this_dir/build_sparkd.sh"
"$build_sparkd_sh" --build-type Release
status=$?
if [ $status -ne 0 ]; then
echo "Build sparkd exited with code $status. Full command below:"
echo "Command: $build_sparkd_sh --build-type Release"
exit 1
fi
# Copy sparkd
sparkd_release_dir="$release_dir/sparkd"
mkdir -p "$sparkd_release_dir"
sparkd_release_bin="$sparkd_release_dir/bin"
cp -r "install/Release/bin" "$sparkd_release_bin"
cp src/server/sparkd/production.Dockerfile "$sparkd_release_dir/Dockerfile"
cp src/server/sparkd/production.spark.conf "$sparkd_release_dir/spark.conf"
# Publish DataStream apps
publish_sh="$this_dir/publish_data_stream.sh"
ds_release_dir="$release_dir/DataStream"
mkdir -p "$ds_release_dir"
ds_release_bin="$ds_release_dir/bin"
echo "Publishing $release"
"$publish_sh" -o "$ds_release_bin"
status=$?
if [ $status -ne 0 ]; then
echo "Publish exited with code $status. Full command below:"
echo "Command: $publish_sh -o $ds_release_bin"
exit 1
fi
# Copy DataStream app Dockerfiles and spark.confs
cp src/DataStreamSuite/Bts.DataStreamWebApp.Server/production.Dockerfile "$ds_release_dir/webapp.Dockerfile"
cp src/DataStreamSuite/Bts.DataStreamWebApp.Server/spark.conf "$ds_release_dir/webapp.spark.conf"
cp src/DataStreamSuite/PubSubServer/production.Dockerfile "$ds_release_dir/pubsub.Dockerfile"
cp src/DataStreamSuite/PubSubServer/spark.conf "$ds_release_dir/pubsub.spark.conf"
cp src/DataStreamSuite/DataStreamPublisher/production.Dockerfile "$ds_release_dir/md-publisher.Dockerfile"
cp src/DataStreamSuite/DataStreamPublisher/spark.conf "$ds_release_dir/md-publisher.spark.conf"
# Copy webapp front end
echo "Copying webapp front end to $ds_release_bin/wwwroot"
cp -r "build/Bts.DataStreamWebApp.Client/production/dist" "$ds_release_bin/wwwroot"
status=$?
if [ $status -ne 0 ]; then
echo "Copy webapp front end exited with code $status. Full command below:"
echo "Command: cp -r build/Bts.DataStreamWebApp.Client/production/dist $ds_release_bin/wwwroot"
exit 1
fi
# Copy composefile
echo "Copying Docker Compose file to $release_dir"
cp "$composefile" "$release_dir/compose.yaml"
status=$?
if [ $status -ne 0 ]; then
echo "Copy Docker Compose file exited with code $status. Full command below:"
echo "cp $composefile $release_dir/"
exit 1
fi
# Compress
echo "Compressing $release"
cd .tmp
tar -czf "$release.tar.gz" "$release"
status=$?
if [ $status -ne 0 ]; then
echo "Compress exited with code $status. Full command below:"
echo "tar -czf $release.tar.gz $release"
exit 1
fi
# Clean
echo "Removing $release (uncompressed dir)"
rm -r "$release"
# Upload
remote=cloud-streams-prod
echo "Uploading $release.tar.gz to $remote"
scp "$release.tar.gz" $remote:/home/ubuntu/releases/$release.tar.gz
# Start services
cat <<EOF | ssh $remote /usr/bin/env bash
cd releases
if [ -e current ]; then
if [ -f current/compose.yaml ]; then
echo "Stopping existing containers"
docker compose -f current/compose.yaml down
fi
rm current
fi
rm -rf $release
tar -xf "$release.tar.gz"
ln -s $release current
cd current
docker compose up --build
docker compose logs --follow
EOF