| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | 
							- #!/usr/bin/env bash
 
- CONTAINER_OS=ubuntu
 
- CONTAINER_VERSION=18.04
 
- CONTAINER_NAME=$(basename `git rev-parse --show-toplevel`)
 
- if [ "${CONTAINER_NAME}" != "$(basename $(pwd))" ]; then
 
- 	cprint "err" "Run script from root folder of project"
 
- 	exit 1
 
- fi
 
- function cprint {
 
- 	ERR='\033[0;31m'
 
- 	OK='\033[0;32m'
 
- 	INFO='\033[0;33m'
 
- 	END='\033[0m'
 
- 	while IFS= read -r L; do
 
- 	case "${1}" in 
 
- 		err) echo -e "LXDBuild ${ERR}Error: ${L}${END}";;
 
- 		ok) echo -e "LXDBuild ${OK}${L}${END}";;
 
- 		info) echo -e "LXDBuild ${INFO}${L}${END}";;
 
- 	esac
 
- 	done < <(printf "%s\n" "${2}")
 
- }
 
- function container_sh {
 
- 	if [ $# -eq 1 ]; then
 
- 		cprint "info" "${1}"
 
- 	fi
 
- 	OUT=$(lxc exec ${CONTAINER_NAME} -- sh -c "${1}")
 
- 	RET=$?
 
- 	if [ $# -eq 1 ]; then
 
- 		[ ${RET} -eq 0 ] && cprint "ok" "${OUT}" || cprint "inf" "${OUT}"
 
- 	fi
 
- 	return ${RET}
 
- }
 
- function container_home {
 
- 	container_sh "echo $(echo '${HOME}')" 1
 
- 	return $?
 
- }
 
- function container_snap_sh {
 
- 	container_sh "cd $(container_home)/${CONTAINER_NAME} && ${1}"
 
- 	return $?
 
- }
 
- function check_installed {
 
- 	cprint "ok" "Checks if ${1} '${2}' is installed"
 
- 	case ${1} in
 
- 		dpkg) CHECK="$(dpkg-query -W --showformat='${Status}\n' ${2})";;
 
- 		snap) CHECK="$(snap list ${2})";;
 
- 	esac
 
- 	if [ $? -ne 0 ]; then 
 
- 		if [ $# -eq 3  ]; then
 
- 			cprint "err" "Missing ${2}: Exiting.";
 
- 			exit 1
 
- 		fi
 
- 		cprint "err" "Missing ${2}."
 
- 		while true; do
 
- 			read -p "Install? Y/N: " A
 
- 			case ${A} in
 
- 				[Yy]* ) 
 
- 					if [ "${1}" == "dpkg" ]; then
 
- 						sudo apt install "${2}"
 
- 					elif [ "${1}" == "snap" ]; then
 
- 						sudo snap install "${2}"
 
- 					fi
 
- 					break;;
 
- 				[Nn]* ) echo "no"; break;;
 
- 				* ) echo "Unknown";;
 
- 			esac
 
- 		done
 
- 		check_installed "${1}" "${2}" "test"
 
- 		return $?
 
- 	else
 
- 		cprint "ok" "${CHECK}"
 
- 		return 0
 
- 	fi
 
- }
 
- function init_container {
 
- 	RETRY=$( [ $# -eq 2 ] && echo 1 || echo "0" )
 
- 	if [ $(lxc list "${CONTAINER_NAME}" | grep "${CONTAINER_NAME}" | wc -l) -eq 0 ]; then 
 
- 		lxc launch "${CONTAINER_OS}:${CONTIANER_VERSION}" "${CONTAINER_NAME}"
 
- 		RET=$?
 
- 		if [ ${RET} -ne 0 ] && [ "${RETRY}" -eq 0 ]; then
 
- 			cprint "err" "${RET}|${RETRY}Must init LXD"
 
- 			lxd init
 
- 			init_container "false" 
 
- 		elif [ ${RET} -ne 0 ]; then
 
- 			cprint "err" "${RET} Can not init LDX. Exiting."
 
- 			exit 1
 
- 		fi
 
- 	else
 
- 		if [ $(lxc info "${CONTAINER_NAME}" | grep "Running" | wc -l) -eq 0 ]; then
 
- 			lxc start "${CONTAINER_NAME}"
 
- 		fi
 
- 	fi 
 
- 	container_sh "echo '* Container initialized'"
 
- 	if [ $? -ne 0 ]; then
 
- 		cprint "err" "Can not init container ${CONTAINER_NAME}. Exiting."
 
- 		exit 1
 
- 	fi
 
- 	return 0;
 
- }
 
- check_installed "dpkg" "snapd"
 
- check_installed "snap" "lxd"
 
- init_container
 
- while true; do
 
- 	container_sh "ping -c 1 google.no 2> /dev/null"
 
- 	[ $? -eq 0 ] && break || cprint "info" "Waiting for network"
 
- done
 
- cprint "info" "Updating container"
 
- container_sh "apt update && apt upgrade -y && apt dist-upgrade -y"
 
- cprint "info" "Looking for snapcraft"
 
- container_sh "snap list snapcraft"
 
- if [ $? -ne 0 ]; then
 
- 	cprint "ok" " - Installing snapcraft"
 
- 	container_sh "snap install snapcraft --classic"
 
- fi
 
- container_snap_sh 'ls'
 
- if [ $? -ne 0 ]; then
 
- 	cprint "info" "Pushing $(pwd) to ${CONTAINER_NAME}:$(container_home)"
 
- 	lxc file push "$(pwd)" "${CONTAINER_NAME}/$(container_home)" -rq
 
- else
 
- 	cprint "Pulling repo"
 
- 	git pull
 
- fi
 
- TAG=$(git tag | tail -n 1)
 
- while true; do 
 
- 	read -p "Check out latest tag ${TAG}? Y=yes, M=master, Enter=no change: " A
 
- 	case ${A} in 
 
- 		[Yy]* ) container_snap_sh "git checkout ${TAG}"; break;;
 
- 		[Mm]* ) container_snap_sh "git checkout master"; break;;
 
- 		* ) cprint "info" "Not checking out anything"; break;;
 
- 	esac
 
- done
 
- cprint "info" "Building snap"
 
- RET=-1
 
- if [ "$(container_sh "ls $(container_home)/${CONTAINER_NAME} | grep prime | wc -l")" == "1" ]; then
 
- 	container_snap_sh "snapcraft prime --destructive-mode"
 
- 	if [ $? -ne 0 ]; then
 
- 		container_snap_sh "snapcraft clean --destructive-mode"
 
- 		container_snap_sh "snapcraft --destructive-mode"
 
- 		RET=$?
 
- 	fi
 
- else
 
- 	container_snap_sh "snapcraft --destructive-mode"
 
- 	RET=$?
 
- fi
 
- if [ ${RET} -eq 0 ]; then
 
- 	FILE=$(container_snap_sh "ls | grep .snap --max-count=1")
 
- 	lxc file pull "${CONTAINER_NAME}/$(container_home)/${CONTAINER_NAME}/${FILE}" "$(pwd)"
 
- else
 
- 	cprint "err" "Failed to build snap"
 
- fi
 
 
  |