mirror of
https://github.com/kasmtech/workspaces-images.git
synced 2024-11-25 09:33:08 +01:00
90 lines
2.7 KiB
Bash
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
|