Files
spark/tools/deploy_data_stream_app.sh

217 lines
5.9 KiB
Bash
Executable File

#!/usr/bin/env bash
print_help_and_exit() {
cat <<EOF
Usage: deploy_data_stream_app.sh [OPTIONS] <app> <container_prefix> <release>
Positionals:
app The application to bounce [PubSubServer | DataStreamPublisher | Bts.DataStreamWebApp.Server]
container_prefix The container prefix to use. Existing dockers with this prefix will be terminated.
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]
--container-prefix The container prefix to use. Existing dockers with this prefix will be terminated.
--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.
--config CONFIG The Configuration profile to use, must be defined: 'src/DataStreamSuite/<APP>/Configurations/<CONFIG>.json'
EOF
exit "$1"
}
app_name=""
container_prefix=""
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
;;
--container-prefix)
if [[ -z "$2" ]]; then
echo "Container prefix (--container-prefix) must be non-empty"
print_help_and_exit 1
fi
container_prefix="$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
;;
--config)
if [[ -z "$2" ]]; then
echo "Config profile (--config) must be non-empty"
print_help_and_exit 1
fi
cfg_profile="$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 [ "$app_name" == "" ]; then
echo "App name not defined"
print_help_and_exit 1
fi
if [ "$container_prefix" == "" ]; then
echo "Container prefix not defined"
print_help_and_exit 1
fi
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/..
# Init and validate config profile
if [[ -z "$cfg_profile" ]]; then
cfg_profile="AwsProd"
fi
cfg_profiles_dir="src/DataStreamSuite/$app_name/Configurations"
cfg_profile_json="$cfg_profiles_dir/$cfg_profile.json"
if [ ! -e "$cfg_profile_json" ]; then
echo "Profile '${cfg_profile}' not found. Looked for file '$(realpath "$cfg_profile_json")'"
fi
if [[ -z "$dockerfile" ]]; then
dockerfile="docker/ubuntu-22.04/dotnet-7/Dockerfile"
fi
release_dir=".tmp/$release"
mkdir -p "$release_dir"
release_bin="$release_dir/bin"
publish_sh="$this_dir/publish_data_stream.sh"
# Publish self-contained app(s)
echo "Publishing $release"
"$publish_sh" -o "$release_bin"
status=$?
if [ $status -ne 0 ]; then
echo "Publish exited with code $status. Full command below:"
echo "Command: $publish_sh -o $release_bin"
exit 1
fi
# Copy config profile to release_bin
echo "Copying configuration to $release_bin/appsettings.json"
cp "$cfg_profile_json" "$release_bin/appsettings.json"
status=$?
if [ $status -ne 0 ]; then
echo "Copy configuration exited with code $status. Full command below:"
echo "cp $cfg_profile_json $release_bin/appsettings.json"
exit 1
fi
# Copy Dockerfile to release_dir
echo "Copying Dockerfile to $release_dir"
cp "$dockerfile" "$release_dir/"
status=$?
if [ $status -ne 0 ]; then
echo "Copy Dockerfile exited with code $status. Full command below:"
echo "cp $dockerfile $release_dir/"
exit 1
fi
# Copy DataStream WebApp bundle to release_bin
cp -r "build/Bts.DataStreamWebApp.Client/production/dist" "$release_bin/wwwroot"
status=$?
if [ $status -ne 0 ]; then
echo "Copy DataStream WebApp bundle exited with code $status. Full command below:"
echo "cp build/Bts.DataStreamWebApp.Client/production/dist $release_bin/wwwroot"
exit 1
fi
cat <<EOF >> "$release_dir/Dockerfile"
RUN dotnet dev-certs https --trust
ENV ASPNETCORE_HTTP_PORT=8080
ENV ASPNETCORE_HTTPS_PORT=8443
ENV ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=Microsoft.AspNetCore.SpaProxy
COPY "bin" "$app_name/bin"
WORKDIR /home/bts/$app_name/bin
ENTRYPOINT [ "./$app_name" ]
EOF
# 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=bts-cloud-streams
echo "Uploading $release.tar.gz to $remote"
scp "$release.tar.gz" $remote:~/DataStream/releases/
# Start. Remove the existing release dir first - its named after the commit hash, which does not
# reflect modified files, so someone may "redeploy" a release that actually contains a different
# build due to differences in modified files.
cat <<EOF | ssh $remote /usr/bin/env bash
rm -rf /home/ubuntu/DataStream/releases/$release
/home/ubuntu/DataStream/scripts/bounce_data_stream_app.sh $app_name $container_prefix $release
EOF