workspaces-images/ci-scripts/app-layer.sh
2024-01-09 23:18:31 +00:00

90 lines
2.7 KiB
Bash

#! /bin/bash
# Ingest cli variables
## Parse input ##
NAME=$1
TYPE=$2
BASE=$3
IS_ROLLING=$4
# Determine if this is a private or public build
if [[ "${CI_COMMIT_REF_NAME}" == release/* ]] || [[ "${CI_COMMIT_REF_NAME}" == "develop" ]]; then
ENDPOINT="${NAME}"
APPS="kasm-apps"
else
ENDPOINT="${NAME}-private"
APPS="kasm-apps-private"
fi
# Determine if this is a rolling build
if [[ "${CI_PIPELINE_SOURCE}" == "schedule" ]] || [[ "${IS_ROLLING}" == "true" ]]; then
SANITIZED_BRANCH=${SANITIZED_BRANCH}-rolling
fi
# Create workspace and base dockerfile
mkdir -p applayer
cd applayer
echo "FROM scratch" > Dockerfile
echo "ADD ./layer.tar /" >> Dockerfile
# Clean up layer tar to not include overlay info
clean_tar () {
mkdir cleantar
tar xf layer.tar -C cleantar/ --exclude="**.wh**"
rm layer.tar
cd cleantar
tar -cf layer.tar *
mv layer.tar ../
cd ..
rm -Rf cleantar/
}
# Multi arch
if [ "${TYPE}" == "multi" ]; then
for ARCH in x86_64 aarch64; do
# Create image tarballs
docker save -o $ARCH.tar ${ORG_NAME}/${ENDPOINT}:${ARCH}-${SANITIZED_BRANCH}
# Pull out the layer we are looking for
mkdir $ARCH
mv $ARCH.tar $ARCH
cd $ARCH
tar xf $ARCH.tar
LAYER_FOLDER=$(du -sk * |sort -nr | sed '3q;d' | awk '{print $2}')
mv $LAYER_FOLDER/layer.tar ../
cd ../
rm -Rf $ARCH
clean_tar
# build the image based on this single layer
docker build -t ${ORG_NAME}/${APPS}:${ARCH}-${BASE}-${NAME}-${SANITIZED_BRANCH} .
docker push ${ORG_NAME}/${APPS}:${ARCH}-${BASE}-${NAME}-${SANITIZED_BRANCH}
rm -f layer.tar
done
# Manifest
docker manifest push --purge ${ORG_NAME}/${APPS}:${BASE}-${NAME}-${SANITIZED_BRANCH} || :
docker manifest create ${ORG_NAME}/${APPS}:${BASE}-${NAME}-${SANITIZED_BRANCH} ${ORG_NAME}/${APPS}:x86_64-${BASE}-${NAME}-${SANITIZED_BRANCH} ${ORG_NAME}/${APPS}:aarch64-${BASE}-${NAME}-${SANITIZED_BRANCH}
docker manifest annotate ${ORG_NAME}/${APPS}:${BASE}-${NAME}-${SANITIZED_BRANCH} ${ORG_NAME}/${APPS}:aarch64-${BASE}-${NAME}-${SANITIZED_BRANCH} --os linux --arch arm64 --variant v8
docker manifest push --purge ${ORG_NAME}/${APPS}:${BASE}-${NAME}-${SANITIZED_BRANCH}
# Single arch
else
# Create image tarballs
docker save -o image.tar ${ORG_NAME}/${ENDPOINT}:${SANITIZED_BRANCH}
# Pull out the layer we are looking for
mkdir image
mv image.tar image
cd image
tar xf image.tar
LAYER_FOLDER=$(du -sk * |sort -nr | sed '3q;d' | awk '{print $2}')
mv $LAYER_FOLDER/layer.tar ../
cd ../
rm -Rf image
clean_tar
# build the image based on this single layer
docker build -t ${ORG_NAME}/${APPS}:${BASE}-${NAME}-${SANITIZED_BRANCH} .
docker push ${ORG_NAME}/${APPS}:${BASE}-${NAME}-${SANITIZED_BRANCH}
rm -f layer.tar
fi
# Cleanup
cd ..
rm -Rf applayer