[WIP] cli shim demo

This commit is contained in:
Michael Bradley, Jr 2018-08-07 19:46:50 -05:00 committed by Pascal Precht
parent fd856f8163
commit 96d7f08d70
No known key found for this signature in database
GPG Key ID: 0EE28D8D6FD85D7D
9 changed files with 706 additions and 0 deletions

434
test/cli_shim/demo.sh Executable file
View File

@ -0,0 +1,434 @@
#!/usr/bin/env bash
# rebase this out prior to PR:
# ------------------------------------------------------------------------------
# don't forget to do an asciicast w/ asciinema, make sure to speed it up 3x;
# provide a short version, just the demos; and long version, full build and
# demos
reset_shim_demo() {
local EMBARK_DOCKER_IMAGE="${EMBARK_DOCKER_IMAGE:-statusim/embark}"
local EMBARK_DOCKER_TAG="${EMBARK_DOCKER_TAG:-latest}"
local EMBARK_DOCKERFILE="${EMBARK_DOCKERFILE}"
local shim_demo_tag
if [[ (! -z "$EMBARK_DOCKERFILE") \
&& "$EMBARK_DOCKER_TAG" = "latest" ]]; then
shim_demo_tag="shim-demo"
else
shim_demo_tag="${EMBARK_DOCKER_TAG}-shim-demo"
fi
local step
if [[ -z "$1" ]]; then
step="step-0"
else
step="$1"
fi
docker rmi "${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}-${step}" &> /dev/null
}
export -f reset_shim_demo
run_shim_demo () {
local EMBARK_BRANCH="${EMBARK_BRANCH:-features/cli-shim}"
# ^ once the PR is ready to merge this should be bumped to :-develop
local EMBARK_DOCKER_IMAGE="${EMBARK_DOCKER_IMAGE:-statusim/embark}"
local EMBARK_DOCKER_RUN
local EMBARK_DOCKER_RUN_INTERACTIVE
local EMBARK_DOCKER_RUN_OPTS_REPLACE
local EMBARK_DOCKER_RUN_RM
local EMBARK_DOCKER_TAG="${EMBARK_DOCKER_TAG:-latest}"
local EMBARK_DOCKERFILE="${EMBARK_DOCKERFILE}"
# ^ can override with a local path:
# /path/to/embark-docker/Dockerfile
# or a url such as:
# https://github.com/embark-framework/embark-docker.git#master
# if EMBARK_DOCKERFILE is not empty, it will trigger `docker build` instead
# of `docker pull` in step-0 below
local url_regex='^(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'
if [[ ! "$EMBARK_DOCKERFILE" =~ $url_regex ]]; then
EMBARK_DOCKERFILE="${EMBARK_DOCKERFILE%/*}"
fi
local EMBARK_SHIM_DEMO_DEV=${EMBARK_SHIM_DEMO_DEV:-false}
local EMBARK_VERSION="${EMBARK_VERSION:latest}"
# ^ only kicks in for `docker build`, not `docker pull`
local REAL="${REAL:-https://gist.githubusercontent.com/michaelsbradleyjr/87b5a99ad551e04cbad9c0c1d3af412b/raw/bfec2e589a91302b30f1d7cac8c2df71e5ebabe0/real.sh}"
local RUNNER="${RUNNER:-https://raw.githubusercontent.com/embark-framework/embark-docker/master/run.sh}"
local shim_demo_tag
if [[ (! -z "$EMBARK_DOCKERFILE") \
&& "$EMBARK_DOCKER_TAG" = "latest" ]]; then
shim_demo_tag="shim-demo"
else
shim_demo_tag="${EMBARK_DOCKER_TAG}-shim-demo"
fi
local __shim_demo_tag="$shim_demo_tag"
local was_reset=false
local work_dir="$PWD"
if [[ "$REAL" =~ $url_regex ]]; then
source <(curl "$REAL" 2> /dev/null)
else
source "$REAL"
fi
local script_dir="$(real_dir "$BASH_SOURCE")"
local embark_dir="$(real_dir "$script_dir/../..")"
local cid_file="$script_dir/.cid"
if [[ "$RUNNER" =~ $url_regex ]]; then
source <(curl "$RUNNER" 2> /dev/null)
else
source "$RUNNER"
fi
check_image () {
local tag
if [[ -z "$1" ]]; then
tag="${__shim_demo_tag}-step-0"
else
tag="${__shim_demo_tag}-$1"
fi
local iid="$(docker images -q ${EMBARK_DOCKER_IMAGE}:${tag} 2> /dev/null)"
if [[ "$iid" = "" ]]; then
return 1
fi
}
cleanup () {
local retval=$?
unset check_image
unset cleanup
rm -f "$cid_file"
cd "$work_dir"
return $retval
}
# -- step 0 ----------------------------------------------------------------
echo '-----------------------------------'
echo 'setup - STEP 0'
echo '-----------------------------------'
shim_demo_tag="${__shim_demo_tag}-step-0"
if ! check_image; then
was_reset=true
if [[ ! -z "$EMBARK_DOCKERFILE" ]]; then
# could expand the --build-arg list (and list of locals at top of
# function) w/ all the build args supported by embark-docker's
# Dockerfile; should probably be the responsibility of a
# build_embark.sh script/function in embark-docker repo that parses
# and dedupes all ARG variables in embark-docker's Dockerfile
docker build \
--build-arg EMBARK_VERSION="$EMBARK_VERSION" \
-t "${EMBARK_DOCKER_IMAGE}:${EMBARK_DOCKER_TAG}" \
"$EMBARK_DOCKERFILE" \
|| cleanup || return
else
docker pull "${EMBARK_DOCKER_IMAGE}:${EMBARK_DOCKER_TAG}" \
|| cleanup || return
fi
docker tag \
"${EMBARK_DOCKER_IMAGE}:${EMBARK_DOCKER_TAG}" \
"${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}" \
|| cleanup || return
else
echo "cached..."
fi
# -- step 1 ----------------------------------------------------------------
echo '-----------------------------------'
echo 'setup - STEP 1'
echo '-----------------------------------'
if (! check_image step-1) || [[ $was_reset = true ]]; then
was_reset=true
rm -f "$cid_file"
EMBARK_DOCKER_TAG="$shim_demo_tag" \
run_embark \
--cidfile "$cid_file" \
-d \
-- bash -c 'trap "exit 0" SIGINT \
&& while true; do sleep 1; done' \
|| cleanup || return
docker exec \
-it \
$(cat "$cid_file") \
bash -c 'apt-get update && apt-get install -y rsync' \
|| cleanup || return
shim_demo_tag="${__shim_demo_tag}-step-1"
docker commit \
--pause \
$(cat "$cid_file") \
"${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}" \
|| cleanup || return
docker stop $(cat "$cid_file") \
|| cleanup || return
rm -f "$cid_file"
else
shim_demo_tag="${__shim_demo_tag}-step-1"
echo "cached..."
fi
# -- step 2 ----------------------------------------------------------------
echo '-----------------------------------'
echo 'setup - STEP 2'
echo '-----------------------------------'
local td_dapp="${HOME}/temp/$(basename $(mktemp -d))"
mkdir -p "$td_dapp"
if (! check_image step-2) || [[ $was_reset = true ]]; then
was_reset=true
rm -f "$cid_file"
# do not alter indentation, tabs in lines below
local step_2=$(cat <<- 'SCRIPT'
#!/bin/bash
simple_nodeenv 8.11.2 pre-8.11.3
simple_nodeenv 4.0.0 4.0.0
simple_nodeenv 8.12.0 lts
npm install -g npm@latest
npm install -g json
nac default
SCRIPT
)
# do not alter indentation, tabs in lines above
cd "$td_dapp"
EMBARK_DOCKER_RUN_RM=false
EMBARK_DOCKER_RUN=<(echo "$step_2") \
EMBARK_DOCKER_TAG="$shim_demo_tag" \
run_embark \
--cidfile "$cid_file" \
-- \
|| cleanup || return
EMBARK_DOCKER_RUN_RM=true
shim_demo_tag="${__shim_demo_tag}-step-2"
docker commit $(cat "$cid_file") "${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}" \
|| cleanup || return
docker rm $(cat "$cid_file") \
|| cleanup || return
rm -f "$cid_file"
cd "$work_dir"
else
shim_demo_tag="${__shim_demo_tag}-step-2"
echo "cached..."
fi
# -- step 3 ----------------------------------------------------------------
echo '-----------------------------------'
echo 'setup - STEP 3'
echo '-----------------------------------'
if (! check_image step-3) || [[ $was_reset = true ]]; then
was_reset=true
rm -f "$cid_file"
# do not alter indentation, tabs in lines below
local step_3=$(cat <<- 'SCRIPT'
#!/bin/bash
dev=$1
embark_branch="$2"
if [[ "$dev" = false ]]; then
mkdir -p ~/repos/embark
git clone https://github.com/embark-framework/embark.git \
~/repos/embark
pushd "$PWD" &> /dev/null
cd ~/repos/embark \
&& git checkout "$embark_branch" \
&& popd &> /dev/null
fi
mkdir -p ~/working/embark
rsync -a \
--exclude=.git \
--exclude=node_modules \
--exclude=test/cli_shim/.cid \
~/repos/embark \
~/working/
pushd "$PWD" &> /dev/null
cd ~/working/embark
git config --global user.email "foo@bar"
git config --global user.name "Foo Bar"
git init
git add -A
git commit -m 'synced!'
nac lts
npm install
npm link
popd &> /dev/null
nac default
SCRIPT
)
# do not alter indentation, tabs in lines above
cd "$td_dapp"
local -a run_opts_step_3=(
"--cidfile"
"$cid_file"
)
if [[ $EMBARK_SHIM_DEMO_DEV = true ]]; then
run_opts_step_3=(
"${run_opts_step_3[@]}"
"-v"
"${embark_dir}:/home/embark/repos/embark"
)
fi
EMBARK_DOCKER_RUN_RM=false
EMBARK_DOCKER_RUN=<(echo "$step_3") \
EMBARK_DOCKER_TAG="$shim_demo_tag" \
run_embark \
"${run_opts_step_3[@]}" \
-- \
$EMBARK_SHIM_DEMO_DEV \
"$EMBARK_BRANCH" \
|| cleanup || return
EMBARK_DOCKER_RUN_RM=true
shim_demo_tag="${__shim_demo_tag}-step-3"
docker commit $(cat "$cid_file") "${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}" \
|| cleanup || return
docker rm $(cat "$cid_file") \
|| cleanup || return
rm -f "$cid_file"
cd "$work_dir"
else
shim_demo_tag="${__shim_demo_tag}-step-3"
echo "cached..."
fi
# -- step 4 ----------------------------------------------------------------
echo '-----------------------------------'
echo 'setup - STEP 4'
echo '-----------------------------------'
if (! check_image step-4) || [[ $was_reset = true ]]; then
was_reset=true
rm -f "$cid_file"
# do not alter indentation, tabs in lines below
local step_4=$(cat <<- 'SCRIPT'
#!/bin/bash
dev=$1
if [[ "$dev" = true ]]; then
rsync -a \
--exclude=.git \
--exclude=node_modules \
--exclude=test/cli_shim/.cid \
~/repos/embark \
~/working/
fi
pushd "$PWD" &> /dev/null
cd ~/working/embark
git add -A
git commit -m 'synced!'
cd ~
nac default
embark demo
cd embark_demo
git init
git add -A
git commit -m 'committed!'
popd &> /dev/null
SCRIPT
)
# do not alter indentation, tabs in lines above
cd "$td_dapp"
local -a run_opts_step_4=(
"--cidfile"
"$cid_file"
)
if [[ $EMBARK_SHIM_DEMO_DEV = true ]]; then
run_opts_step_4=(
"${run_opts_step_4[@]}"
"-v"
"${embark_dir}:/home/embark/repos/embark"
)
fi
EMBARK_DOCKER_RUN_RM=false
EMBARK_DOCKER_RUN=<(echo "$step_4") \
EMBARK_DOCKER_TAG="$shim_demo_tag" \
run_embark \
"${run_opts_step_4[@]}" \
-- \
$EMBARK_SHIM_DEMO_DEV \
|| cleanup || return
EMBARK_DOCKER_RUN_RM=true
shim_demo_tag="${__shim_demo_tag}-step-4"
docker commit $(cat "$cid_file") "${EMBARK_DOCKER_IMAGE}:${shim_demo_tag}" \
|| cleanup || return
docker rm $(cat "$cid_file") \
|| cleanup || return
rm -f "$cid_file"
cd "$work_dir"
else
shim_demo_tag="${__shim_demo_tag}-step-4"
echo "cached..."
fi
# -- DEMO ------------------------------------------------------------------
echo '-----------------------------------'
echo 'DEMO' 🎉
echo '-----------------------------------'
# do not alter indentation, tabs in lines below
local demo=$(cat <<- SCRIPT
#!/bin/bash
dev=\$1
if [[ "\$dev" = true ]]; then
rsync -a \
--exclude=.git \
--exclude=node_modules \
--exclude=test/cli_shim/.cid \
~/repos/embark \
~/working/
fi
pushd "$PWD" &> /dev/null
cd ~/working/embark
git add -A
git commit -m 'synced!'
popd &> /dev/null
txtbld=\$(tput bold)
txtrst=\$(tput sgr0)
bldcyn=\${txtbld}\$(tput setaf 6)
say () {
local msg="\$1"
msg="\$([[ "\$msg" =~ \
[[:space:]]*([^[:space:]]|[^[:space:]].*[^[:space:]])[[:space:]]* ]]; \
echo -n "\${BASH_REMATCH[1]}")"
echo
echo
echo "\${bldcyn}\${msg}\${txtrst}"
}
export -f say
export PROMPT_COMMAND="echo; echo"
# demos
$(< "$script_dir/demos/runtime-pre-8.11.3.sh")
$(< "$script_dir/demos/runtime-4.0.0.sh")
$(< "$script_dir/demos/invoked_missing_json.sh")
$(< "$script_dir/demos/invoked_bad_json.sh")
$(< "$script_dir/demos/invoked_no_version.sh")
$(< "$script_dir/demos/invoked_no_node_engine.sh")
$(< "$script_dir/demos/invoked_bad_node_engine.sh")
$(< "$script_dir/demos/invoked_missing_dep.sh")
trap "exit 0" SIGINT && while true; do sleep 1; done
SCRIPT
)
# do not alter indentation, tabs in lines above
cd "$td_dapp"
local -a run_opts_demo=()
if [[ $EMBARK_SHIM_DEMO_DEV = true ]]; then
run_opts_demo=(
"${run_opts_demo[@]}"
"-v"
"${embark_dir}:/home/embark/repos/embark"
)
fi
EMBARK_DOCKER_RUN=<(echo "$demo") \
EMBARK_DOCKER_TAG="$shim_demo_tag" \
run_embark \
"${run_opts_demo[@]}" \
-- \
$EMBARK_SHIM_DEMO_DEV \
|| cleanup || return
cd "$work_dir"
}
export -f run_shim_demo
if [[ "$0" = "$BASH_SOURCE" ]]; then
run_shim_demo
fi

View File

@ -0,0 +1,20 @@
say "$(cat << 'MSG'
If invoked embark's package.json cannot be parsed then report error and exit
MSG
)"
cd ~/working/embark
echo '}' >> package.json
cd ~/embark_demo
nac lts
bash -i << 'DEMO'
embark version
DEMO
nac default
cd ~/working/embark
git stash &> /dev/null
cd ~

View File

@ -0,0 +1,38 @@
say "$(cat << 'MSG'
If invoked embark's package.json does not specify a valid node engine and
node < default minimum version, include a message about the fallback in the
"Unsupported runtime" error messages
MSG
)"
cd ~/working/embark
nac lts
json -I -f package.json -e 'this.engines.node=">-8.11.3"' &> /dev/null
cd ~/embark_demo
nac pre-8.11.3
bash -i << 'DEMO'
node ~/working/embark/bin/embark version
DEMO
say "$(cat << 'MSG'
No message about the fallback to testing with the default minimum version is
displayed if the node version is supported
MSG
)"
nac lts
bash -i << 'DEMO'
node ~/working/embark/bin/embark version
DEMO
nac default
cd ~/working/embark
git stash &> /dev/null
cd ~

View File

@ -0,0 +1,102 @@
say "$(cat << 'MSG'
If invoked embark is missing a dependency then report error and exit
MSG
)"
cd ~/working/embark/node_modules
mv opn opn-RENAMED
cd ~
nac lts
bash -i << 'DEMO'
embark version
DEMO
nac default
cd ~/working/embark/node_modules
mv opn-RENAMED opn
cd ~
say "$(cat << 'MSG'
If invoked embark is missing a dev dependency then report error and exit
MSG
)"
cd ~/working/embark/node_modules
mv sinon sinon-RENAMED
cd ~
nac lts
bash -i << 'DEMO'
embark version
DEMO
nac default
cd ~/working/embark/node_modules
mv sinon-RENAMED sinon
cd ~
say "$(cat << 'MSG'
If invoked embark is within a node_modules tree then dependencies are not checked
MSG
)"
cd ~/working/embark/node_modules
mv opn opn-RENAMED
cd ~/working
mkdir node_modules
mv embark node_modules/
cd ~
nac lts
bash -i << 'DEMO'
node ~/working/node_modules/embark/bin/embark version
DEMO
nac default
cd ~/working/node_modules
mv embark ../
cd ../
rmdir node_modules
cd ~/working/embark/node_modules
mv opn-RENAMED opn
cd ~
say "$(cat << 'MSG'
If invoked embark is within a node_modules tree then dev dependencies are not
checked
MSG
)"
cd ~/working/embark/node_modules
mv sinon sinon-RENAMED
cd ~/working
mkdir node_modules
mv embark node_modules/
cd ~
nac lts
bash -i << 'DEMO'
node ~/working/node_modules/embark/bin/embark version
DEMO
nac default
cd ~/working/node_modules
mv embark ../
cd ../
rmdir node_modules
cd ~/working/embark/node_modules
mv sinon-RENAMED sinon
cd ~

View File

@ -0,0 +1,20 @@
say "$(cat << 'MSG'
If invoked embark's package.json is missing then report error and exit
MSG
)"
cd ~/working/embark
rm package.json
cd ~/embark_demo
nac lts
bash -i << 'DEMO'
embark version
DEMO
nac default
cd ~/working/embark
git stash &> /dev/null
cd ~

View File

@ -0,0 +1,38 @@
say "$(cat << 'MSG'
If invoked embark's package.json does not specify a node engine and
node < default minimum version, include a message about the fallback in the
"Unsupported runtime" error messages
MSG
)"
cd ~/working/embark
nac lts
json -I -f package.json -e 'delete this.engines.node' &> /dev/null
cd ~/embark_demo
nac pre-8.11.3
bash -i << 'DEMO'
node ~/working/embark/bin/embark version
DEMO
say "$(cat << 'MSG'
No message about the fallback to testing with the default minimum version is
displayed if the node version is supported
MSG
)"
nac lts
bash -i << 'DEMO'
node ~/working/embark/bin/embark version
DEMO
nac default
cd ~/working/embark
git stash &> /dev/null
cd ~

View File

@ -0,0 +1,21 @@
say "$(cat << 'MSG'
If invoked embark's package.json does not specify a version then report warning
and continue
MSG
)"
cd ~/working/embark
nac lts
json -I -f package.json -e 'delete this.version' &> /dev/null
cd ~/embark_demo
bash -i << 'DEMO'
embark version
DEMO
nac default
cd ~/working/embark
git stash &> /dev/null
cd ~

View File

@ -0,0 +1,16 @@
say "$(cat << 'MSG'
Intended "Unsupported runtime" error messages are displayed for node >= 4.0.0
MSG
)"
cd ~/embark_demo
nac 4.0.0
bash -i << 'DEMO'
node ~/working/embark/bin/embark version
DEMO
nac default
cd ~

View File

@ -0,0 +1,17 @@
say "$(cat << 'MSG'
If a node < version specified in invoked embark's `{engines:{node:[semver]}}`
is used to run embark then report error and exit
MSG
)"
cd ~/embark_demo
nac pre-8.11.3
bash -i << 'DEMO'
node ~/working/embark/bin/embark version
DEMO
nac default
cd ~