103 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash -eu
 | |
| DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 | |
| 
 | |
| BUILD_OPTS="$*"
 | |
| 
 | |
| DOCKER="docker"
 | |
| 
 | |
| if ! ${DOCKER} ps >/dev/null 2>&1; then
 | |
| 	DOCKER="sudo docker"
 | |
| fi
 | |
| if ! ${DOCKER} ps >/dev/null; then
 | |
| 	echo "error connecting to docker:"
 | |
| 	${DOCKER} ps
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| CONFIG_FILE=""
 | |
| if [ -f "${DIR}/config" ]; then
 | |
| 	CONFIG_FILE="${DIR}/config"
 | |
| fi
 | |
| 
 | |
| while getopts "c:" flag
 | |
| do
 | |
| 	case "${flag}" in
 | |
| 		c)
 | |
| 			CONFIG_FILE="${OPTARG}"
 | |
| 			;;
 | |
| 		*)
 | |
| 			;;
 | |
| 	esac
 | |
| done
 | |
| 
 | |
| # Ensure that the configuration file is an absolute path
 | |
| if test -x /usr/bin/realpath; then
 | |
| 	CONFIG_FILE=$(realpath -s "$CONFIG_FILE" || realpath "$CONFIG_FILE")
 | |
| fi
 | |
| 
 | |
| # Ensure that the confguration file is present
 | |
| if test -z "${CONFIG_FILE}"; then
 | |
| 	echo "Configuration file need to be present in '${DIR}/config' or path passed as parameter"
 | |
| 	exit 1
 | |
| else
 | |
| 	# shellcheck disable=SC1090
 | |
| 	source ${CONFIG_FILE}
 | |
| fi
 | |
| 
 | |
| CONTAINER_NAME=${CONTAINER_NAME:-pigen_work}
 | |
| CONTINUE=${CONTINUE:-0}
 | |
| PRESERVE_CONTAINER=${PRESERVE_CONTAINER:-0}
 | |
| 
 | |
| # Ensure the Git Hash is recorded before entering the docker container
 | |
| GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"}
 | |
| 
 | |
| CONTAINER_EXISTS=$(${DOCKER} ps -a --filter name="${CONTAINER_NAME}" -q)
 | |
| CONTAINER_RUNNING=$(${DOCKER} ps --filter name="${CONTAINER_NAME}" -q)
 | |
| if [ "${CONTAINER_RUNNING}" != "" ]; then
 | |
| 	echo "The build is already running in container ${CONTAINER_NAME}. Aborting."
 | |
| 	exit 1
 | |
| fi
 | |
| if [ "${CONTAINER_EXISTS}" != "" ] && [ "${CONTINUE}" != "1" ]; then
 | |
| 	echo "Container ${CONTAINER_NAME} already exists and you did not specify CONTINUE=1. Aborting."
 | |
| 	echo "You can delete the existing container like this:"
 | |
| 	echo "  ${DOCKER} rm -v ${CONTAINER_NAME}"
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| # Modify original build-options to allow config file to be mounted in the docker container
 | |
| BUILD_OPTS="$(echo "${BUILD_OPTS:-}" | sed -E 's@\-c\s?([^ ]+)@-c /config@')"
 | |
| 
 | |
| ${DOCKER} build -t pi-gen "${DIR}"
 | |
| if [ "${CONTAINER_EXISTS}" != "" ]; then
 | |
| 	trap 'echo "got CTRL+C... please wait 5s" && ${DOCKER} stop -t 5 ${CONTAINER_NAME}_cont' SIGINT SIGTERM
 | |
| 	time ${DOCKER} run --rm --privileged \
 | |
| 		--volume "${CONFIG_FILE}":/config:ro \
 | |
| 		-e "GIT_HASH=${GIT_HASH}" \
 | |
| 		--volumes-from="${CONTAINER_NAME}" --name "${CONTAINER_NAME}_cont" \
 | |
| 		pi-gen \
 | |
| 		bash -e -o pipefail -c "dpkg-reconfigure qemu-user-static &&
 | |
| 	cd /pi-gen; ./build.sh ${BUILD_OPTS} &&
 | |
| 	rsync -av work/*/build.log deploy/" &
 | |
| 	wait "$!"
 | |
| else
 | |
| 	trap 'echo "got CTRL+C... please wait 5s" && ${DOCKER} stop -t 5 ${CONTAINER_NAME}' SIGINT SIGTERM
 | |
| 	time ${DOCKER} run --name "${CONTAINER_NAME}" --privileged \
 | |
| 		--volume "${CONFIG_FILE}":/config:ro \
 | |
| 		-e "GIT_HASH=${GIT_HASH}" \
 | |
| 		pi-gen \
 | |
| 		bash -e -o pipefail -c "dpkg-reconfigure qemu-user-static &&
 | |
| 	cd /pi-gen; ./build.sh ${BUILD_OPTS} &&
 | |
| 	rsync -av work/*/build.log deploy/" &
 | |
| 	wait "$!"
 | |
| fi
 | |
| echo "copying results from deploy/"
 | |
| ${DOCKER} cp "${CONTAINER_NAME}":/pi-gen/deploy .
 | |
| ls -lah deploy
 | |
| 
 | |
| # cleanup
 | |
| if [ "${PRESERVE_CONTAINER}" != "1" ]; then
 | |
| 	${DOCKER} rm -v "${CONTAINER_NAME}"
 | |
| fi
 | |
| 
 | |
| echo "Done! Your image(s) should be in deploy/"
 |