Packaging improvements

- compress images with xz by default (and decompress on install)
- add help menu and command line argument parsing to package.sh
- display packaging status if `pv` command available
This commit is contained in:
2024-03-11 16:29:59 -07:00
parent a424394109
commit 50cb23a4c7
3 changed files with 95 additions and 42 deletions
+1 -14
View File
@@ -7,20 +7,7 @@ Packaging and installation tools for Streamline's "Streamline EMR" application.
2. run `package.sh` to generate a new application package 2. run `package.sh` to generate a new application package
3. package will be stored to `build-packages/` 3. package will be stored to `build-packages/`
### Alternative Builds Several defaults can be overridden with command line options or by setting appropriate environment variables. A help prompt can be accessed using `package.sh -h`. For example, `package.sh -t latest -p linux/arm64` will build only the `linux/arm64` platform and use the `latest` tag instead of the current repo version.
Some variables can be overridden to support alternative builds. For example, an option exists to package the application WITHOUT docker images. This can be done by setting the appropriate environment variables (e.g. `VAR=VALUE ./package.sh`).
Options that can be overridden are:
- `PACKAGE_NAME`: base name of the output package. (default: `streamline-emr`)
- `OUTPUT_DIR`: directory where packages will be stored. (default: `$PROJECT_ROOT/build-packages`)
- `PACKAGE_IMAGES`: if set to a value other than 1, do NOT package images. (default: `1`)
- `IMAGE_TAG`: if set, used to specify a source image tag. (default: uses git-based version name)
- `IMAGES_LIST`: if set, specifies an alternate image list file. (default: `$PROJECT_ROOT/images.csv`)
For example, to build using the absolute latest images available:
```bash
IMAGE_TAG=latest package.sh
```
## Installing ## Installing
1. extract the generated archive file in a temporary folder on the target system 1. extract the generated archive file in a temporary folder on the target system
+4
View File
@@ -41,6 +41,10 @@ for f in $(find $LOCATION/images -name "*.img" 2>/dev/null);do
echo "importing docker image: $f" echo "importing docker image: $f"
docker load -i $f docker load -i $f
done done
for f in $(find $LOCATION/images -name "*.img.xz" 2>/dev/null);do
echo "importing docker image: $f"
xz -d -c $f | docker load
done
# install systemd service unless running in a docker environment # install systemd service unless running in a docker environment
if [ ! -f /.dockerenv ]; then if [ ! -f /.dockerenv ]; then
+88 -26
View File
@@ -31,13 +31,80 @@ fi
PACKAGE_NAME=${PACKAGE_NAME-"streamline-emr"} PACKAGE_NAME=${PACKAGE_NAME-"streamline-emr"}
OUTPUT_DIR=${OUTPUT_DIR-"$PROJECT_ROOT/build-packages"} OUTPUT_DIR=${OUTPUT_DIR-"$PROJECT_ROOT/build-packages"}
PACKAGE_IMAGES=${PACKAGE_IMAGES:-1} PACKAGE_IMAGES=${PACKAGE_IMAGES:-1}
COMPRESS_IMAGES=${COMPRESS_IMAGES:-1}
IMAGE_TAG=${IMAGE_TAG:-${VERSION_NAME}} IMAGE_TAG=${IMAGE_TAG:-${VERSION_NAME}}
IMAGES_LIST=${IMAGES_LIST:-${PROJECT_ROOT}/images.csv} IMAGES_LIST=${IMAGES_LIST:-${PROJECT_ROOT}/images.csv}
function print_usage {
echo "Kenya 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 "packaging $PACKAGE_NAME"
echo " output dir: $OUTPUT_DIR" echo " output dir: $OUTPUT_DIR"
echo " package images: $PACKAGE_IMAGES" echo " package images: $PACKAGE_IMAGES"
echo " compress images: $COMPRESS_IMAGES"
echo " image tag: $IMAGE_TAG" echo " image tag: $IMAGE_TAG"
echo " image list: $IMAGES_LIST"
echo " platforms: ${PLATFORMS[@]}"
# work from the project root # work from the project root
pushd $PROJECT_ROOT > /dev/null pushd $PROJECT_ROOT > /dev/null
@@ -46,28 +113,8 @@ pushd $PROJECT_ROOT > /dev/null
set -e set -e
trap 'echo "Error: Last command failed with exit code $?."' ERR trap 'echo "Error: Last command failed with exit code $?."' ERR
# generate version name
# 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
# Note: commit count is harder to get to from CI - can't reproduce the git
# describe functionality as easily
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="unknown"
fi
# build for each relevant platform # build for each relevant platform
for platform in "linux/amd64" "linux/arm64"; do for platform in ${PLATFORMS[@]}; do
echo "preparing package for platform $platform" echo "preparing package for platform $platform"
if [ "$platform" == "linux/amd64" ];then if [ "$platform" == "linux/amd64" ];then
pkg_arch="x86_64" pkg_arch="x86_64"
@@ -101,9 +148,8 @@ for platform in "linux/amd64" "linux/arm64"; do
cp -a ${PROJECT_ROOT}/root ${PACKAGE_ROOT}/ cp -a ${PROJECT_ROOT}/root ${PACKAGE_ROOT}/
echo "${VERSION_NAME}" > ${PACKAGE_ROOT}/root/var/signalytic/clientapps/streamline/streamline-emr/version echo "${VERSION_NAME}" > ${PACKAGE_ROOT}/root/var/signalytic/clientapps/streamline/streamline-emr/version
if [ "${PACKAGE_IMAGES}" = "1" ]; then if [ "${PACKAGE_IMAGES}" = 1 ]; then
# add images # add images
i=0
# read image list from file (e.g. 'images-aarch64') # read image list from file (e.g. 'images-aarch64')
# images are listed as SAVED_TAG=SOURCE_IMAGE # images are listed as SAVED_TAG=SOURCE_IMAGE
for image in $(cat ${IMAGES_LIST});do for image in $(cat ${IMAGES_LIST});do
@@ -112,14 +158,30 @@ for platform in "linux/amd64" "linux/arm64"; do
if [ "${img_platform}" = "${platform}" ]; then if [ "${img_platform}" = "${platform}" ]; then
echo "pulling image '${source}' (${platform})" echo "pulling image '${source}' (${platform})"
docker pull --platform ${platform} ${source}:${IMAGE_TAG} docker pull --platform ${platform} ${source}:${IMAGE_TAG}
# re-tag the image with a more generic name
echo "tagging image as '${dest}:latest'" echo "tagging image as '${dest}:latest'"
docker tag ${source}:${IMAGE_TAG} ${dest}:latest docker tag ${source}:${IMAGE_TAG} ${dest}:latest
i=$((i+1)) # save the image to file
name="image${i}.img" if [ "${COMPRESS_IMAGES}" = 1 ]; then
path="${IMAGES_DIR}/${name}" path="${IMAGES_DIR}/${dest}.img.xz"
echo "saving to '${path}'" 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 docker save -o ${path} ${dest}:latest
fi fi
fi
fi
done done
else else
echo "skipping image packaging as requested" echo "skipping image packaging as requested"