2024-01-10 00:18:31 +01:00
|
|
|
#! /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
|
2024-03-11 20:35:50 +01:00
|
|
|
if [[ "${SCHEDULED}" != "NO" ]]; then
|
|
|
|
if [[ "${SCHEDULE_NAME}" == "NO" ]]; then
|
|
|
|
SANITIZED_BRANCH=${SANITIZED_BRANCH}-rolling
|
|
|
|
else
|
|
|
|
SANITIZED_BRANCH=${SANITIZED_BRANCH}-rolling-${SCHEDULE_NAME}
|
|
|
|
fi
|
2024-01-10 00:18:31 +01:00
|
|
|
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
|