Files
streamline-emr/package.sh
T
alec.turner 9cbefc841f Simplify application management and align with other docker applications
The notion of application "instances" is dropped in favor of a simpler,
single-instance approach. Default values are provided for all configuration
variables so allow the app to run without additional manual configuration.

A health check and auto-heal script are added to automatically restart the
application in case it becomes unavailable during operation.
2024-03-25 09:34:34 -07:00

207 lines
5.9 KiB
Bash
Executable File

#!/bin/bash
#
# Copyright (C) Wendepunkt Medical Innovations, Inc - All Rights Reserved.
# Unauthorized copying of this file, via any medium is strictly prohibited.
# Proprietary and confidential
#
# For information: dev@signalytic.ca
#
# basic path info
LOCATION="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
PROJECT_ROOT="$(realpath $LOCATION)"
# determine version name from git
# use ci tag name if available (e.g. "v1.2")
if [ $CI_COMMIT_TAG ]; then
VERSION_NAME="$CI_COMMIT_TAG"
# otherwise if ci, use BRANCH-COMMIT
elif [ $CI_COMMIT_BRANCH ]; then
VERSION_NAME="$CI_COMMIT_REF_SLUG-$CI_COMMIT_SHORT_SHA"
# if not ci, try to use git
elif command -v git &> /dev/null; then
VERSION_NAME=$(git describe --always --tags --dirty)
# fallback
else
VERSION_NAME="latest"
fi
# configurable options (override with env vars as needed)
PACKAGE_NAME=${PACKAGE_NAME-"streamline-emr"}
OUTPUT_DIR=${OUTPUT_DIR-"$PROJECT_ROOT/build-packages"}
PACKAGE_IMAGES=${PACKAGE_IMAGES:-1}
COMPRESS_IMAGES=${COMPRESS_IMAGES:-1}
IMAGE_TAG=${IMAGE_TAG:-${VERSION_NAME}}
IMAGES_LIST=${IMAGES_LIST:-${PROJECT_ROOT}/images.csv}
function print_usage {
echo "Streamline EMR packaging utility"
echo
echo "Usage: package.sh [ OPTIONS ]"
echo
echo "Options:"
echo " -h Print this help prompt and exit"
echo " -p PLATFORM Specify a docker platform to target, may be passed multiple"
echo " times. If none specified, all platforms built. Supported"
echo " platforms: 'linux/amd64', 'linux/arm64'"
echo " -t IMAGE_TAG Specify an image tag. It not specified, the tag will be"
echo " inferred from the current git version ('${IMAGE_TAG}')"
echo " -n PACKAGE_NAME Specify the package base name. Default: ${PACKAGE_NAME}"
echo " -o OUTPUT_DIR Specify a directory to save packages. Default: ${OUTPUT_DIR}"
echo " -l IMAGES_LIST Specify a file containing a list of images. Default: ${IMAGES_LIST}"
echo " -I Do not package images"
echo " -C Do not compress images"
echo
}
# collect user args
PLATFORMS=()
while getopts ":p:t:n:o:l:ICh" options; do
case "${options}" in
p)
PLATFORMS+=(${OPTARG})
;;
t)
IMAGE_TAG=${OPTARG}
;;
n)
PACKAGE_NAME=${OPTARG}
;;
o)
OUTPUT_DIR=${OPTARG}
;;
l)
IMAGES_LIST=${OPTARG}
;;
I)
PACKAGE_IMAGES=0
;;
C)
COMPRESS_IMAGES=0
;;
h)
print_usage
exit 0
;;
*)
print_usage
exit 1
;;
esac
done
shift $((OPTIND -1))
# set defaults
if [ ${#PLATFORMS} -eq 0 ]; then
PLATFORMS=("linux/amd64" "linux/arm64")
fi
echo "packaging $PACKAGE_NAME"
echo " output dir: $OUTPUT_DIR"
echo " package images: $PACKAGE_IMAGES"
echo " compress images: $COMPRESS_IMAGES"
echo " image tag: $IMAGE_TAG"
echo " image list: $IMAGES_LIST"
echo " platforms: ${PLATFORMS[@]}"
# work from the project root
pushd $PROJECT_ROOT > /dev/null
# Exit on error:
set -e
trap 'echo "Error: Last command failed with exit code $?."' ERR
# build for each relevant platform
for platform in ${PLATFORMS[@]}; do
echo "preparing package for platform $platform"
if [ "$platform" == "linux/amd64" ];then
pkg_arch="x86_64"
elif [ "$platform" == "linux/arm64" ];then
pkg_arch="aarch64"
else
echo "unexpected platform '$platform'"
exit 1
fi
OUTPUT_NAME="$PACKAGE_NAME-$VERSION_NAME-${pkg_arch}"
OUTPUT_FILE="$OUTPUT_NAME.tar.bz2"
OUTPUT_PATH="$OUTPUT_DIR/$OUTPUT_FILE"
# create a new temp directory to stage files
for i in {1..9999};do
STAGING_DIR="tmp-staging-$i"
if [ ! -d $STAGING_DIR ]; then
break
fi
done
if [ -d $STAGING_DIR ]; then
echo "Failed to generate temp staging dir"
exit 1
fi
# add files
PACKAGE_ROOT=${STAGING_DIR}/${OUTPUT_NAME}
IMAGES_DIR=${PACKAGE_ROOT}/images
mkdir -p ${IMAGES_DIR}
cp ${PROJECT_ROOT}/install.sh ${PACKAGE_ROOT}/
cp -a ${PROJECT_ROOT}/root ${PACKAGE_ROOT}/
echo "${VERSION_NAME}" > ${PACKAGE_ROOT}/root/var/signalytic/clientapps/streamline/streamline-emr/version
if [ "${PACKAGE_IMAGES}" = 1 ]; then
# add images
# read image list from file (e.g. 'images-aarch64')
# images are listed as SAVED_TAG=SOURCE_IMAGE
for image in $(cat ${IMAGES_LIST});do
IFS=, read -r img_platform dest source <<< "${image}"
# package only if the platforms match
if [ "${img_platform}" = "${platform}" ]; then
echo "pulling image '${source}' (${platform})"
docker pull --platform ${platform} ${source}:${IMAGE_TAG}
# re-tag the image with a more generic name
echo "tagging image as '${dest}:latest'"
docker tag ${source}:${IMAGE_TAG} ${dest}:latest
# save the image to file
if [ "${COMPRESS_IMAGES}" = 1 ]; then
path="${IMAGES_DIR}/${dest}.img.xz"
echo "saving to '${path}'"
# if installed, use pv to show progress
if command -v pv &> /dev/null; then
docker save ${dest}:latest | xz -9 - -c | pv -t -r -b -N "saving compressed image..." > ${path}
else
docker save ${dest}:latest | xz -9 - -c > ${path}
fi
else
path="${IMAGES_DIR}/${dest}.img"
echo "saving to '${path}'"
# if installed, use pv to show progress
if command -v pv &> /dev/null; then
docker save ${dest}:latest | pv -t -r -b -N "saving raw image..." > ${path}
else
docker save -o ${path} ${dest}:latest
fi
fi
fi
done
else
echo "skipping image packaging as requested"
fi
# setup output directory and cleanup old files if necessary
mkdir -p $OUTPUT_DIR
rm -rf $OUTPUT_PATH
pushd $STAGING_DIR > /dev/null
tar -cjf $OUTPUT_PATH ${OUTPUT_NAME}
popd > /dev/null
# cleanup staging files
rm -r $STAGING_DIR
echo "output: $OUTPUT_PATH"
done
popd > /dev/null
exit 0