140 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
PROGRAM_NAME=""$(basename "$0")
 | 
						|
 | 
						|
if [ $1 == "-a" ]; then
 | 
						|
	STACK_NAME=$2
 | 
						|
	shift 2
 | 
						|
fi
 | 
						|
 | 
						|
if [ -z "$STACK_NAME" ]; then
 | 
						|
	echo "$(tput setaf 1)ERROR: \$STACK_NAME must be set (e.g. export STACK_NAME=my_cool_app)$(tput sgr0 )"
 | 
						|
	exit
 | 
						|
fi
 | 
						|
 | 
						|
if type direnv > /dev/null 2>&1 && ! direnv status | grep -q 'Found RC allowed true'; then
 | 
						|
	echo "$(tput setaf 1)ERROR: direnv is blocked, run direnv allow$(tput sgr0)"
 | 
						|
	exit
 | 
						|
fi
 | 
						|
 | 
						|
if [ -f abra-commands.sh ]; then
 | 
						|
	. abra-commands.sh
 | 
						|
fi
 | 
						|
 | 
						|
sub_help() {
 | 
						|
	echo "Usage: $PROGRAM_NAME [-a STACK_NAME] <subcommand> [options]"
 | 
						|
	echo ""
 | 
						|
	echo "Subcommands:"
 | 
						|
	echo "    run SERVICE CMD                       run a command in the specified service's container"
 | 
						|
	echo "    run_args SERVICE ARGS CMD             run, passing extra args to docker exec"
 | 
						|
	echo "    secret_generate SECRET VERSION [CMD]  generate a secret, store it in pass & as a Docker secret"
 | 
						|
	echo "    deploy [COMPOSE_FILE]                 let 'em rip"
 | 
						|
	echo "    logs SERVICE [ARGS]                   tail logs from a deployed service"
 | 
						|
	echo "    ... (custom commands)"
 | 
						|
	echo ""
 | 
						|
	echo "Make sure \$STACK_NAME is set using direnv or -a"
 | 
						|
}
 | 
						|
 | 
						|
sub_secret_generate(){
 | 
						|
	SECRET=$1
 | 
						|
	VERSION=$2
 | 
						|
	PW=${3:-pwqgen}
 | 
						|
 | 
						|
	if [ -z "$SECRET" ] || [ -z "$VERSION" ]; then
 | 
						|
		echo "Usage: $PROGRAM_NAME secret_generate SECRET VERSION"
 | 
						|
		exit
 | 
						|
	fi
 | 
						|
 | 
						|
	$PW | tee \
 | 
						|
		>(docker secret create "${STACK_NAME}_${SECRET}_${VERSION}" -) \
 | 
						|
		>(pass insert "hosts/autonomic-swarm/${STACK_NAME}/${SECRET}" -m)
 | 
						|
}
 | 
						|
 | 
						|
sub_run_args(){
 | 
						|
	SERVICE=$1
 | 
						|
	DOCKER_ARGS=$2
 | 
						|
 | 
						|
	shift 2
 | 
						|
 | 
						|
	if [ -z "$SERVICE" ]; then
 | 
						|
		echo "Usage: $PROGRAM_NAME run SERVICE [CMD]"
 | 
						|
		exit
 | 
						|
	fi
 | 
						|
 | 
						|
	CONTAINER=$(docker container ls --format "table {{.ID}},{{.Names}}" \
 | 
						|
		| grep "${STACK_NAME}_${SERVICE}" | cut -d',' -f1)
 | 
						|
 | 
						|
	if [ -z "$CONTAINER" ]; then
 | 
						|
		echo "Container not found! 🚨"
 | 
						|
		exit
 | 
						|
	fi
 | 
						|
 | 
						|
	docker exec $DOCKER_ARGS -it "$CONTAINER" $@
 | 
						|
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
sub_run(){
 | 
						|
	SERVICE=$1
 | 
						|
 | 
						|
	shift
 | 
						|
 | 
						|
	sub_run_args "$SERVICE" "" "$@"
 | 
						|
}
 | 
						|
 | 
						|
sub_deploy (){
 | 
						|
	COMPOSE=${1:-compose.yml}
 | 
						|
 | 
						|
	echo "About to deploy:"
 | 
						|
	echo "  Compose: $(tput setaf 3)${PWD}/${COMPOSE}$(tput sgr0)"
 | 
						|
	echo "  Domain: $(tput setaf 2)${DOMAIN}$(tput sgr0)"
 | 
						|
	echo "  Stack: $(tput setaf 1)${STACK_NAME}$(tput sgr0)"
 | 
						|
 | 
						|
	read -rp "Continue? (y/[n])? " choice
 | 
						|
 | 
						|
	case "$choice" in
 | 
						|
		y|Y ) ;;
 | 
						|
		n|N ) return;;
 | 
						|
		* ) return;;
 | 
						|
	esac
 | 
						|
 | 
						|
	if docker stack deploy -c "$COMPOSE" "$STACK_NAME"; then
 | 
						|
		echo "$(tput setaf 2)Yay! App should be available at https://${DOMAIN}$(tput sgr0)"
 | 
						|
	else
 | 
						|
		echo "$(tput setaf 1)Oh no! Something went wrong 😕 Check errors above$(tput sgr0)"
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
sub_logs (){
 | 
						|
	SERVICE=$1
 | 
						|
 | 
						|
	shift
 | 
						|
	
 | 
						|
	if [ $# -eq 0 ]; then
 | 
						|
		LOGS_ARGS="\
 | 
						|
		--follow \
 | 
						|
		--no-trunc \
 | 
						|
		--details \
 | 
						|
		--timestamps"
 | 
						|
	else
 | 
						|
		LOGS_ARGS="$@"
 | 
						|
	fi
 | 
						|
 | 
						|
	docker service logs "${STACK_NAME}_${SERVICE}" $LOGS_ARGS
 | 
						|
}
 | 
						|
 | 
						|
subcommand=$1
 | 
						|
case $subcommand in
 | 
						|
	"" | "-h" | "--help")
 | 
						|
		sub_help
 | 
						|
		;;
 | 
						|
	*)
 | 
						|
		shift
 | 
						|
		"sub_${subcommand}" "$@"
 | 
						|
		if [ $? = 127 ]; then
 | 
						|
			echo "Error: '$subcommand' is not a known subcommand." >&2
 | 
						|
			echo "       Run '$PROGRAM_NAME --help' for a list of known subcommands." >&2
 | 
						|
			exit 1
 | 
						|
		fi
 | 
						|
		;;
 | 
						|
esac
 |