From b62ca0b62534b59c894bfe26f399edb33cfafd89 Mon Sep 17 00:00:00 2001 From: bohendo Date: Mon, 19 Oct 2020 12:15:22 +0530 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A8=20shellcheck=20most=20ops=20script?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + ops/build-report.sh | 4 +- ops/db.sh | 15 ++--- ops/lint.sh | 15 ++--- ops/logs.sh | 18 +++--- ops/npm-publish.sh | 97 +++++++++++++++---------------- ops/pull-images.sh | 23 ++++---- ops/push-images.sh | 19 +++--- ops/replace.sh | 2 +- ops/save-secret.sh | 11 ++-- ops/server-setup.sh | 22 ++++--- ops/start-browser-node-test-ui.sh | 12 ++-- ops/stop.sh | 20 ++++--- ops/test-integration.sh | 22 +++---- ops/test-load.sh | 34 ++++++----- ops/test-server-node.sh | 29 ++++----- ops/test-unit.sh | 35 +++++------ ops/upgrade-package.sh | 6 +- ops/version-check.sh | 22 +++---- 19 files changed, 211 insertions(+), 196 deletions(-) diff --git a/.gitignore b/.gitignore index b39502bf8..5e39fa5de 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ config-prod.json **/.test-store **/.tmp **/cache/** +**/*.backup # Data Storage **/.bot-store/ diff --git a/ops/build-report.sh b/ops/build-report.sh index 3ca80feb8..db899041c 100644 --- a/ops/build-report.sh +++ b/ops/build-report.sh @@ -9,6 +9,6 @@ fi echo echo " seconds | module" echo "---------+----------------" -for step in `ls $flags` -do echo "`cat $flags/$step` $step" +for step in $flags/* +do echo "$(cat "$step") $step" | sed 's/.flags\///' done | sort -nr | awk '{printf(" %7s | %s\n", $1, $2)}' diff --git a/ops/db.sh b/ops/db.sh index 1c7e8494e..028b71cd4 100644 --- a/ops/db.sh +++ b/ops/db.sh @@ -2,27 +2,28 @@ set -e root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" +project="$(grep '"name":' "$root/package.json" | head -n 1 | cut -d '"' -f 4)" username=$project database=$project service=${project}_database -service_id="`docker service ps -q $service | head -n 1`" +service_id="$(docker service ps -q "$service" | head -n 1)" if [[ -n "$service_id" ]] then - container_id="`docker inspect --format '{{.Status.ContainerStatus.ContainerID}}' $service_id`" + container_id="$(docker inspect --format '{{.Status.ContainerStatus.ContainerID}}' "$service_id")" else - container_id="`docker container ls --filter 'status=running' --format '{{.ID}} {{.Names}}' |\ + container_id="$( + docker container ls --filter 'status=running' --format '{{.ID}} {{.Names}}' |\ cut -d "." -f 1 |\ grep "_database" |\ sort |\ head -n 1 |\ cut -d " " -f 1 - `" + )" fi if [[ -z "$1" ]] -then docker exec -it $container_id bash -c "psql $database --username=$username" -else docker exec -it $container_id bash -c "psql $database --username=$username --command=\"$1\"" +then docker exec -it "$container_id" bash -c "psql $database --username=$username" +else docker exec -it "$container_id" bash -c "psql $database --username=$username --command=\"$1\"" fi diff --git a/ops/lint.sh b/ops/lint.sh index d393ce282..6465af75b 100644 --- a/ops/lint.sh +++ b/ops/lint.sh @@ -4,21 +4,22 @@ root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" eslint="$root/node_modules/.bin/eslint -c $root/.eslintrc.js" solhint="$root/node_modules/.bin/solhint -c $root/.solhint.json" -for package in `ls modules` +for packagePath in modules/* do + package=$(basename "$packagePath") echo "Linting ${package}" - cd "${root}/modules/${package}" + cd "${root}/modules/${package}" || exit 1 if [[ -d "src" ]] then - eval "$eslint 'src' $@" + eval "$eslint 'src' $*" elif [[ -d "src.ts" && -d "src.sol" ]] then - eval "$eslint 'src.ts' $@" - eval "$solhint 'src.sol/**/*.sol' $@" + eval "$eslint 'src.ts' $*" + eval "$solhint 'src.sol/**/*.sol' $*" fi - cd "${root}" + cd "${root}" || exit 1 done -if [[ -z "$@" ]] +if [[ -z "$*" ]] then echo "Protip: run 'bash ops/lint.sh --fix' to auto-fix simple formatting inconsistencies" fi diff --git a/ops/logs.sh b/ops/logs.sh index d1497877f..9f46d3e4e 100644 --- a/ops/logs.sh +++ b/ops/logs.sh @@ -1,34 +1,34 @@ #!/bin/bash set -e -root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" +#root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" +#project="$(grep '"name":' "$root/package.json" | head -n 1 | cut -d '"' -f 4)" target=$1 shift -service_id="`docker service ls --format '{{.ID}} {{.Name}}' |\ +service_id=$(docker service ls --format '{{.ID}} {{.Name}}' |\ grep "_$target" |\ head -n 1 |\ cut -d " " -f 1 -`" +) if [[ -n "$service_id" ]] then - docker service ps --no-trunc $service_id + docker service ps --no-trunc "$service_id" sleep 0.5 - exec docker service logs --follow --raw --tail 100 $service_id $@ + exec docker service logs --follow --raw --tail 100 "$service_id" "$@" fi -container_id="`docker container ls --filter 'status=running' --format '{{.ID}} {{.Names}}' |\ +container_id=$(docker container ls --filter 'status=running' --format '{{.ID}} {{.Names}}' |\ cut -d "." -f 1 |\ grep "_$target" |\ sort |\ head -n 1 |\ cut -d " " -f 1 -`" +) if [[ -n "$container_id" ]] -then exec docker container logs --tail 100 --follow $container_id $@ +then exec docker container logs --tail 100 --follow "$container_id" "$@" else echo "No service or running container names match: $target" fi diff --git a/ops/npm-publish.sh b/ops/npm-publish.sh index 98cbee50b..4a7a49e38 100644 --- a/ops/npm-publish.sh +++ b/ops/npm-publish.sh @@ -8,7 +8,7 @@ default_packages="types,utils,contracts,protocol,engine,browser-node" packages="${1:-$default_packages}" root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep '"name":' "$root/package.json" | head -n 1 | cut -d '"' -f 4) ######################################## ## Helper functions @@ -20,7 +20,7 @@ function get_latest_version { ######################################## ## Run some sanity checks to make sure we're really ready to npm publish -if [[ ! "`pwd | sed 's|.*/\(.*\)|\1|'`" =~ "$project" ]] +if [[ ! "$(pwd | sed 's|.*/\(.*\)|\1|')" =~ $project ]] then echo "Aborting: Make sure you're in the $project project root" && exit 1 fi @@ -30,17 +30,17 @@ package_names="" package_versions="" echo -for package in `echo $packages | tr ',' ' '` +for package in $(echo "$packages" | tr ',' ' ') do - package_name="`cat modules/$package/package.json | grep '"name":' | awk -F '"' '{print $4}'`" - package_version="`npm view $package_name version 2> /dev/null || echo "0.0.0"`" + package_name="$(grep '"name":' "modules/$package/package.json" | awk -F '"' '{print $4}')" + package_version="$(npm view "$package_name" version 2> /dev/null || echo "0.0.0")" package_versions="$package_versions $package_version" package_names="$package_names $package_name@$package_version" echo "Found previously published npm package: $package_name@$package_version" done echo -highest_version="`get_latest_version $package_versions`" +highest_version=$(get_latest_version "$package_versions") echo "What version of @connext/{$packages} packages are we publishing?" echo "Currently, latest version: $highest_version" @@ -52,13 +52,13 @@ if [[ -z "$target_version" ]] then echo "Aborting: A new, unique version is required" && exit 1 # elif [[ "$package_versions" =~ "$target_version" ]] # then echo "Aborting: A new, unique version is required" && exit 1 -elif [[ "`get_latest_version $package_versions $target_version`" != "$target_version" ]] +elif [[ "$(get_latest_version "$package_versions" "$target_version")" != "$target_version" ]] then - for package in `echo $packages | tr ',' ' '` + for package in $(echo "$packages" | tr ',' ' ') do - package_name="`cat modules/$package/package.json | grep '"name":' | awk -F '"' '{print $4}'`" + package_name="$(grep '"name":' "modules/$package/package.json" | awk -F '"' '{print $4}')" # make sure this is still a unique version number, even though its old - version_exists="`npm view $package_name@$target_version version 2> /dev/null || echo "0.0.0"`" + version_exists="$(npm view "$package_name@$target_version" version 2> /dev/null || echo "0.0.0")" if [[ -z "$version_exists" ]] then echo "Safe to publish $package_name@$target_version" else echo "Aborting: version $package_name@$target_version already exists" && exit 1 @@ -80,49 +80,48 @@ if [[ ! "$REPLY" =~ ^[Yy]$ ]] then echo "Aborting by user request" && exit 1 # abort! fi -echo "Let's go" -cd modules +( # () designates a subshell so we don't have to cd back to where we started afterwards + echo "Let's go" + cd modules -for package in $package_names -do - echo - echo "Dealing w package: $package" - fullname="${package%@*}" # i.e. '@connext/vector-types' - nickname="${fullname#*/}" # i.e. 'vector-types' - path="${nickname#*-}" # i.e. 'types' - version="$target_version" - echo "Updating $nickname package version to $version" - cd $path - mv package.json .package.json - cat .package.json | sed 's/"version": ".*"/"version": "'$version'"/' > package.json - rm .package.json - echo "Publishing $fullname" - - # If the version has a release-candidate suffix like "-rc.2" then tag it as "next" - if [[ "$version" == *-rc* ]] - then npm publish --tag next --access=public - else npm publish --access=public - fi + for package in $package_names + do + echo + echo "Dealing w package: $package" + fullname="${package%@*}" # i.e. '@connext/vector-types' + nickname="${fullname#*/}" # i.e. 'vector-types' + path="${nickname#*-}" # i.e. 'types' + version="$target_version" + echo "Updating $nickname package version to $version" + cd "$path" || exit 1 + mv package.json .package.json + sed 's/"version": ".*"/"version": "'"$version"'"/' < .package.json > package.json + rm .package.json + echo "Publishing $fullname" - echo "Updating $fullname references in root" - mv package.json .package.json - cat .package.json | sed 's|"'"$fullname"'": ".*"|"'"$fullname"'": "'$version'"|' > package.json - rm .package.json + # If the version has a release-candidate suffix like "-rc.2" then tag it as "next" + if [[ "$version" == *-rc* ]] + then npm publish --tag next --access=public + else npm publish --access=public + fi - echo - cd .. - for module in `ls */package.json` - do - echo "Updating $fullname references in $module" - cd ${module%/*} + echo "Updating $fullname references in root" mv package.json .package.json - cat .package.json | sed 's|"'"$fullname"'": ".*"|"'"$fullname"'": "'$version'"|' > package.json + sed 's|"'"$fullname"'": ".*"|"'"$fullname"'": "'"$version"'"|' < .package.json > package.json rm .package.json + + echo cd .. + for module in */package.json + do ( + echo "Updating $fullname references in $module" + cd "${module%/*}" + mv package.json .package.json + sed 's|"'"$fullname"'": ".*"|"'"$fullname"'": "'"$version"'"|' < .package.json > package.json + rm .package.json + ) done done -done - -cd .. +) echo echo "Commiting & tagging our changes" @@ -133,7 +132,7 @@ tag="npm-publish-${1:-"all"}-$target_version" git add . git commit --allow-empty -m "npm publish @connext/{$packages}@$target_version" -git tag $tag +git tag "$tag" git push origin HEAD --no-verify -git push origin $tag --no-verify - \ No newline at end of file +git push origin "$tag" --no-verify + diff --git a/ops/pull-images.sh b/ops/pull-images.sh index 2cbc5f3d1..fc7c871a6 100644 --- a/ops/pull-images.sh +++ b/ops/pull-images.sh @@ -2,17 +2,17 @@ set -e root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" -registry="`cat $root/package.json | grep '"registry":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep '"name":' "$root/package.json" | head -n 1 | cut -d '"' -f 4) +registry=$(grep '"registry":' "$root/package.json" | head -n 1 | cut -d '"' -f 4) -commit="`git rev-parse HEAD | head -c 8`" -semver="`cat package.json | grep '"version":' | head -n 1 | cut -d '"' -f 4`" +commit=$(git rev-parse HEAD | head -c 8) +semver=$(grep '"version":' package.json | head -n 1 | cut -d '"' -f 4) -default_images="` +default_images=$( echo 'auth builder database ethprovider global_proxy nats node node_proxy router router_proxy test_runner' |\ sed "s/^/${project}_/g" |\ sed "s/ / ${project}_/g" -`" +) # If given an arg like "image_name:version", then try to pull that version of image_name if [[ -n "$1" && "$1" == *:* ]] @@ -31,23 +31,22 @@ do for version in $versions do name="$image:$version" - if [[ -n "`docker image ls | grep "$image" | grep "$version"`" ]] - then - echo "Image $name already exists locally" + if grep -q "$version" <<<"$(docker image ls | grep "$image")" + then echo "Image $name already exists locally" else - if [[ -n "`echo $name | grep "${project}_"`" ]] + if grep -q "${project}_" <<<"$name" then full_name="${registry%/}/$name" else full_name="$name" fi echo "Pulling image: $full_name" - docker pull $full_name || true + docker pull "$full_name" || true if [[ "$name" != "$full_name" ]] then echo "Tagging image $full_name as $name" - docker tag $full_name $name || true + docker tag "$full_name" "$name" || true fi fi diff --git a/ops/push-images.sh b/ops/push-images.sh index e6abd0f59..052ddd033 100644 --- a/ops/push-images.sh +++ b/ops/push-images.sh @@ -2,24 +2,23 @@ set -e root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" -registry="`cat $root/package.json | grep '"registry":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) +registry=$(grep -m 1 '"registry":' "$root/package.json" | cut -d '"' -f 4) -registry_url="https://index.docker.io/v1/repositories/${registry#*/}" images="auth builder database ethprovider global_proxy nats node node_proxy router router_proxy test_runner" -commit="`git rev-parse HEAD | head -c 8`" -git_tag="`git tag --points-at HEAD | grep "vector-" | head -n 1`" +commit="$(git rev-parse HEAD | head -c 8)" +git_tag="$(git tag --points-at HEAD | grep "vector-" | head -n 1)" # Try to get the semver from git tag or commit message if [[ -z "$git_tag" ]] then - message="`git log --format=%B -n 1 HEAD`" + message="$(git log --format=%B -n 1 HEAD)" if [[ "$message" == "Deploy vector-"* ]] then semver="${message#Deploy vector-}" else semver="" fi -else semver="`echo $git_tag | sed 's/vector-//'`" +else semver="${git_tag#vector-}" fi for image in $images @@ -27,13 +26,13 @@ do if [[ -n "$semver" ]] then echo "Tagging image ${project}_$image:$commit as ${project}_$image:$semver" - docker tag ${project}_$image:$commit ${project}_$image:$semver || true + docker tag "${project}_$image:$commit" "${project}_$image:$semver" || true fi for version in latest $commit $semver do echo "Tagging image ${project}_$image:$version as $registry/${project}_$image:$version" - docker tag ${project}_$image:$version $registry/${project}_$image:$version || true + docker tag "${project}_$image:$version" "$registry/${project}_$image:$version" || true echo "Pushing image: $registry/${project}_$image:$version" - docker push $registry/${project}_$image:$version || true + docker push "$registry/${project}_$image:$version" || true done done diff --git a/ops/replace.sh b/ops/replace.sh index 6fe1821fa..6c6fa0c88 100644 --- a/ops/replace.sh +++ b/ops/replace.sh @@ -15,7 +15,7 @@ bash ops/search.sh "$old" | sed "s|$old|$new|g" | grep --color=always "$new" echo echo "Does the above replacement look good? (y/n)" echo -n "> " -read response +read -r response echo if [[ "$response" == "y" ]] diff --git a/ops/save-secret.sh b/ops/save-secret.sh index 2f6e86e65..c247a6c56 100644 --- a/ops/save-secret.sh +++ b/ops/save-secret.sh @@ -2,7 +2,7 @@ set -e root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) docker swarm init 2> /dev/null || true @@ -11,7 +11,7 @@ secret_value="$2" # NOTE: any newlines or carriage returns will be stripped out of the secret value -if [[ -n "`docker secret ls | grep "$secret_name\>"`" ]] +if grep -q "$secret_name\>" <<<"$(docker secret ls)" then echo "A secret called $secret_name already exists, skipping secret setup." echo "To overwrite this secret, remove the existing one first: 'docker secret rm $secret_name'" @@ -22,16 +22,15 @@ else # Prepare to load the node's private key into the server's secret store echo "Copy the $secret_name secret to your clipboard then paste it below & hit enter (no echo)" echo -n "> " - read -s secret_value + read -rs secret_value echo if [[ -z "$secret_value" ]] then echo "No secret_value provided, skipping secret creation" && exit 0; fi fi - id="`echo $secret_value | tr -d '\n\r' | docker secret create $secret_name -`" - if [[ "$?" == "0" ]] - then echo "Successfully saved secret $secret_name w id $id" + if echo "$secret_value" | tr -d '\n\r' | docker secret create "$secret_name" - + then echo "Successfully saved secret $secret_name" else echo "Something went wrong creating a secret called $secret_name" fi diff --git a/ops/server-setup.sh b/ops/server-setup.sh index 82fbb78e3..c57953bd8 100644 --- a/ops/server-setup.sh +++ b/ops/server-setup.sh @@ -1,7 +1,7 @@ #!/bin/bash root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) hostname="$1" prvkey="${SSH_KEY:-$HOME/.ssh/id_rsa}" @@ -22,20 +22,22 @@ fi # Prepare to load the node's signing key into the server's secret store echo "Optional: Copy the $secret_name secret to your clipboard then paste it below & hit enter (no echo)" echo -n "> " -read -s mnemonic +read -rs mnemonic echo # If we can login as ubuntu, then the user is already setup echo "Attempting to login as $user to $hostname" -if ssh -q -i $prvkey $user@$hostname exit 2> /dev/null +if ssh -q -i "$prvkey" "$user@$hostname" exit 2> /dev/null then echo "Login success, skipping user setup" # If we can login as root then setup a sudo user & turn off root login -elif ssh -q -i $prvkey root@$hostname exit 2> /dev/null +elif ssh -q -i "$prvkey" "root@$hostname" exit 2> /dev/null then echo "Failed to login, configuring a new $user user." - ssh -i $prvkey root@$hostname "bash -s" <<-EOF + # We need values from both the client & server side, so we aren't quoting "EOF" + # shellcheck disable=SC2087 + ssh -i "$prvkey" "root@$hostname" "bash -s" <<-EOF set -e function createuser { adduser --gecos "" \$1 <<-EOIF @@ -69,12 +71,12 @@ then EOF echo "Waiting for server to wake up again ($?)" - while ! ssh -q -i $prvkey $user@$hostname exit 2> /dev/null + while ! ssh -q -i "$prvkey" "$user@$hostname" exit 2> /dev/null do echo -n "." && sleep 3 done echo " Good morning!" else - ssh -i $prvkey $user@$hostname exit + ssh -i "$prvkey" "$user@$hostname" exit echo echo "Aborting: Can't login as $user or root, idk how to setup this server." exit 1 @@ -84,11 +86,13 @@ if [[ -f "$pubkey" ]] then echo "Copying $pubkey to remote server..." echo "scp -i $prvkey $pubkey $user@$hostname:/home/$user/.ssh/another_authorized_key" - scp -i $prvkey $pubkey $user@$hostname:/home/$user/.ssh/another_authorized_key + scp -i "$prvkey" "$pubkey" "$user@$hostname:/home/$user/.ssh/another_authorized_key" fi echo "Setting up dependencies for $user@$hostname" -ssh -i $prvkey $user@$hostname "sudo -S bash -s" </dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) # make sure a network for this project has been created docker swarm init 2> /dev/null || true -docker network create --attachable --driver overlay $project 2> /dev/null || true +docker network create --attachable --driver overlay "$project" 2> /dev/null || true # If file descriptors 0-2 exist, then we're prob running via interactive shell instead of on CD/CI if [[ -t 0 && -t 1 && -t 2 ]] @@ -14,14 +14,14 @@ then interactive="--interactive --tty" else echo "Running in non-interactive mode" fi -node_config="`cat $root/modules/browser-node-test-ui/config-node.json`" +node_config="$(cat "$root/modules/browser-node-test-ui/config-node.json")" function getConfig { echo "$node_config" | jq ".$1" | tr -d '"'; } -public_port="`getConfig port`" +public_port="$(getConfig port)" docker run \ - $interactive \ + "$interactive" \ --entrypoint="bash" \ --env="REACT_APP_VECTOR_CONFIG=$node_config" \ --env="SKIP_PREFLIGHT_CHECK=true" \ @@ -31,4 +31,4 @@ docker run \ --rm \ --tmpfs="/tmp" \ --volume="$root:/root" \ - ${project}_builder -c "cd ./modules/browser-node-test-ui && npm start" + "${project}_builder" -c "cd ./modules/browser-node-test-ui && npm start" diff --git a/ops/stop.sh b/ops/stop.sh index b10c968bf..e011e3f66 100644 --- a/ops/stop.sh +++ b/ops/stop.sh @@ -1,26 +1,28 @@ #!/usr/bin/env bash +root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" +project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) + # turn on swarm mode if it's not already on docker swarm init 2> /dev/null || true - # make sure a network for this project has been created -docker network create --attachable --driver overlay $project 2> /dev/null || true +docker network create --attachable --driver overlay "$project" 2> /dev/null || true target=$1 shift # If a stack matches, stop it & wait for child servies to all exit -stack_name="`docker stack ls --format '{{.Name}}' | grep "$target"`" +stack_name="$(docker stack ls --format '{{.Name}}' | grep "$target")" if [[ -n "$stack_name" ]] then echo echo "Stopping stack $stack_name" - docker stack rm $stack_name + docker stack rm "$stack_name" echo "Waiting for the $stack_name stack to completely shutdown.." - while [[ -n "`docker container ls -q --filter label=com.docker.stack.namespace=$stack_name`" ]] + while [[ -n $(docker container ls -q --filter "label=com.docker.stack.namespace=$stack_name") ]] do sleep 2 # wait until there are no more containers in this stack done - while [[ -n "`docker network ls -q --filter label=com.docker.stack.namespace=$stack_name`" ]] + while [[ -n $(docker network ls -q --filter "label=com.docker.stack.namespace=$stack_name") ]] do sleep 2 # wait until the stack's network has been removed done echo "Goodnight $stack_name!" @@ -28,18 +30,18 @@ then fi # If any container names match, stop all of them -container_ids="`docker container ls --filter 'status=running' --format '{{.ID}} {{.Names}}' |\ +container_ids=$(docker container ls --filter 'status=running' --format '{{.ID}} {{.Names}}' |\ cut -d "." -f 1 |\ grep "$target" |\ sort |\ cut -d " " -f 1 -`" +) if [[ -n "$container_ids" ]] then for container_id in $container_ids do echo "Stopping container $container_id" - docker container stop $container_id > /dev/null + docker container stop "$container_id" > /dev/null done exit fi diff --git a/ops/test-integration.sh b/ops/test-integration.sh index 08c989653..a0896e36e 100644 --- a/ops/test-integration.sh +++ b/ops/test-integration.sh @@ -2,16 +2,16 @@ set -e root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) # make sure a network for this project has been created docker swarm init 2> /dev/null || true -docker network create --attachable --driver overlay $project 2> /dev/null || true +docker network create --attachable --driver overlay "$project" 2> /dev/null || true stack="${1:-node}" cmd="${2:-test}" -bash $root/ops/start-$stack.sh +bash "$root/ops/start-$stack.sh" # If file descriptors 0-2 exist, then we're prob running via interactive shell instead of on CD/CI if [[ -t 0 && -t 1 && -t 2 ]] @@ -29,8 +29,8 @@ common="$interactive \ --env=VECTOR_MESSAGING_URL=http://messaging \ --env=VECTOR_BOB_URL=http://bob:8000 \ --env=VECTOR_CAROL_URL=http://carol:8000 \ - --env=VECTOR_CHAIN_PROVIDERS=`cat $root/.chaindata/chain-providers.json | tr -d ' \n'` \ - --env=VECTOR_CHAIN_ADDRESSES=`cat $root/.chaindata/chain-addresses.json | tr -d ' \n'` \ + --env=VECTOR_CHAIN_PROVIDERS=$(tr -d ' \n' < "$root/.chaindata/chain-providers.json") \ + --env=VECTOR_CHAIN_ADDRESSES=$(tr -d ' \n' < "$root/.chaindata/chain-addresses.json") \ --env=VECTOR_DAVE_URL=http://dave:8000 \ --env=VECTOR_PROD=${VECTOR_PROD} \ --env=VECTOR_LOG_LEVEL=${LOG_LEVEL:-error} \ @@ -46,23 +46,23 @@ common="$interactive \ # prod version: if we're on a tagged commit then use the tagged semvar, otherwise use the hash if [[ "$VECTOR_PROD" == "true" ]] then - git_tag="`git tag --points-at HEAD | grep "vector-" | head -n 1`" + git_tag="$(git tag --points-at HEAD | grep "vector-" | head -n 1)" if [[ -z "$version" ]] then if [[ -n "$git_tag" ]] - then version="`echo $git_tag | sed 's/vector-//'`" - else version="`git rev-parse HEAD | head -c 8`" + then version="${git_tag#vector-}" + else version="$(git rev-parse HEAD | head -c 8)" fi fi image=${project}_test_runner:$version echo "Executing $cmd w image $image" - docker run $common $image $cmd $stack + docker run "$common" "$image" "$cmd" "$stack" else echo "Executing $cmd w image ${project}_builder" docker run \ - $common \ + "$common" \ --entrypoint=bash \ --volume="$root:/root" \ - ${project}_builder -c "bash modules/test-runner/ops/entry.sh $cmd $stack" + "${project}_builder" -c "bash modules/test-runner/ops/entry.sh $cmd $stack" fi diff --git a/ops/test-load.sh b/ops/test-load.sh index 44d7bfbbe..800f863d0 100644 --- a/ops/test-load.sh +++ b/ops/test-load.sh @@ -2,11 +2,11 @@ set -e root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) # make sure a network for this project has been created docker swarm init 2> /dev/null || true -docker network create --attachable --driver overlay $project 2> /dev/null || true +docker network create --attachable --driver overlay "$project" 2> /dev/null || true test_type="${1:-cyclical}" num_agents="${2:-5}" @@ -23,18 +23,22 @@ else fi echo "Running $test_type test with $num_agents agents" -sugar_daddy="candy maple cake sugar pudding cream honey rich smooth crumble sweet treat" +# If file descriptors 0-2 exist, then we're prob running via interactive shell instead of on CD/CI +if [[ -t 0 && -t 1 && -t 2 ]] +then interactive="--interactive --tty" +else echo "Running in non-interactive mode" +fi ######################################## ## Launch test runner -common="$interactive $stack_env \ +common="$interactive \ --env=NODE_TLS_REJECT_UNAUTHORIZED=0 \ --env=VECTOR_ADMIN_TOKEN=$VECTOR_ADMIN_TOKEN \ --env=VECTOR_AUTH_URL=http://auth:5040 \ --env=VECTOR_CAROL_URL=http://carol:8000 \ - --env=VECTOR_CHAIN_PROVIDERS=`cat $root/.chaindata/chain-providers.json | tr -d ' \n'` \ - --env=VECTOR_CHAIN_ADDRESSES=`cat $root/.chaindata/chain-addresses.json | tr -d ' \n'` \ + --env=VECTOR_CHAIN_PROVIDERS=$(tr -d ' \n' < "$root/.chaindata/chain-providers.json") \ + --env=VECTOR_CHAIN_ADDRESSES=$(tr -d ' \n' < "$root/.chaindata/chain-addresses.json") \ --env=VECTOR_DAVE_URL=http://dave:8000 \ --env=VECTOR_PROD=${VECTOR_PROD} \ --env=VECTOR_LOG_LEVEL=${LOG_LEVEL:-error} \ @@ -42,7 +46,7 @@ common="$interactive $stack_env \ --env=VECTOR_NUM_AGENTS=${num_agents} --env=VECTOR_ROGER_URL=http://roger:8000 \ --env=VECTOR_ROUTER_URL=http://router:8009 \ - --name=${project}${stack}_test_runner \ + --name=${project}_load_test_runner \ --network=$project \ --rm \ --tmpfs /tmp" @@ -50,23 +54,23 @@ common="$interactive $stack_env \ # prod version: if we're on a tagged commit then use the tagged semvar, otherwise use the hash if [[ "$VECTOR_PROD" == "true" ]] then - git_tag="`git tag --points-at HEAD | grep "vector-" | head -n 1`" + git_tag="$(git tag --points-at HEAD | grep "vector-" | head -n 1)" if [[ -z "$version" ]] then if [[ -n "$git_tag" ]] - then version="`echo $git_tag | sed 's/vector-//'`" - else version="`git rev-parse HEAD | head -c 8`" + then version="${git_tag#vector-}" + else version="$(git rev-parse HEAD | head -c 8)" fi fi image=${project}_test_runner:$version - echo "Executing $cmd w image $image" - docker run $common $image $cmd $stack + echo "Executing $test_cmd w image $image" + docker run "$common" "$image" "$test_cmd" else - echo "Executing $cmd w image ${project}_builder" + echo "Executing $test_cmd w image ${project}_builder" docker run \ - $common \ + "$common" \ --entrypoint=bash \ --volume="$root:/root" \ - ${project}_builder -c "cd modules/test-runner && $test_cmd" + "${project}_builder" -c "cd modules/test-runner && $test_cmd" fi diff --git a/ops/test-server-node.sh b/ops/test-server-node.sh index dec34e90d..0a7311b7d 100644 --- a/ops/test-server-node.sh +++ b/ops/test-server-node.sh @@ -4,23 +4,22 @@ set -e unit="server_node" root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" -registry="`cat $root/package.json | grep '"registry":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) # make sure a network for this project has been created docker swarm init 2> /dev/null || true -docker network create --attachable --driver overlay $project 2> /dev/null || true +docker network create --attachable --driver overlay "$project" 2> /dev/null || true cmd="${1:-test}" #################### # Load Config -config="`cat $root/config-node.json`" +config="$(cat "$root/config-node.json")" # Override logLevel if env var is provided if [[ -n "$LOG_LEVEL" ]] -then config="`echo "$config" '{"logLevel":'$LOG_LEVEL'}' | jq -s '.[0] + .[1]'`" +then config="$(echo "$config" '{"logLevel":'"$LOG_LEVEL"'}' | jq -s '.[0] + .[1]')" fi #################### @@ -32,20 +31,24 @@ version="latest" # Global services / chain provider config alice_mnemonic="avoid post vessel voyage trigger real side ribbon pattern neither essence shine" -bob_mnemonic="negative stamp rule dizzy embark worth ill popular hip ready truth abandon" -sugardaddy_mnemonic="candy maple cake sugar pudding cream honey rich smooth crumble sweet treat" -bash $root/ops/start-global.sh +bash "$root/ops/start-global.sh" -chain_addresses="`cat $root/.chaindata/chain-addresses.json`" -config="`echo "$config" '{"chainAddresses":'$chain_addresses'}' | jq -s '.[0] + .[1]'`" +chain_addresses=$(cat "$root/.chaindata/chain-addresses.json") +config=$(echo "$config" '{"chainAddresses":'"$chain_addresses"'}' | jq -s '.[0] + .[1]') + +# If file descriptors 0-2 exist, then we're prob running via interactive shell instead of on CD/CI +if [[ -t 0 && -t 1 && -t 2 ]] +then interactive="--interactive --tty" +else echo "Running in non-interactive mode" +fi ######################################## # Launch stack function cleanup { echo "Tests finished, stopping database.." - docker container stop $postgres_host 2> /dev/null || true + docker container stop "$postgres_host" 2> /dev/null || true } trap cleanup EXIT SIGINT SIGTERM @@ -64,7 +67,7 @@ echo "Starting $postgres_host.." echo "postgresql://$project:$project@${project}_database:5432/$project" docker run \ - $interactive \ + "$interactive" \ --entrypoint="bash" \ --env="VECTOR_CONFIG=$config" \ --env="VECTOR_DATABASE_URL=postgresql://$project:$project@$postgres_host:5432/$project" \ @@ -74,4 +77,4 @@ docker run \ --rm \ --tmpfs="/tmp" \ --volume="$root:/root" \ - ${project}_builder "/test.sh" "server-node" "$cmd" + "${project}_builder:$version" "/test.sh" "server-node" "$cmd" diff --git a/ops/test-unit.sh b/ops/test-unit.sh index c047072d3..2727c4715 100644 --- a/ops/test-unit.sh +++ b/ops/test-unit.sh @@ -2,11 +2,11 @@ set -e root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) # make sure a network for this project has been created docker swarm init 2> /dev/null || true -docker network create --attachable --driver overlay $project 2> /dev/null || true +docker network create --attachable --driver overlay "$project" 2> /dev/null || true unit=$1 cmd=$2 @@ -18,9 +18,9 @@ then interactive="--interactive --tty" else echo "Running in non-interactive mode" fi -node_config="`cat $root/config-node.json`" -router_config="`cat $root/config-router.json`" -config="`echo $node_config $router_config | jq -s '.[0] + .[1]'`" +node_config=$(cat "$root/config-node.json") +router_config=$(cat "$root/config-router.json") +config=$(echo "$node_config" "$router_config" | jq -s '.[0] + .[1]') ######################################## # If we need a chain for these tests, start the evm & stop it when we're done @@ -29,18 +29,18 @@ eth_mnemonic="candy maple cake sugar pudding cream honey rich smooth crumble swe if [[ -n "$chain_id" ]] then - port="${VECTOR_CHAIN_PORT:-`expr 8545 - 1337 + $chain_id`}" + port="${VECTOR_CHAIN_PORT:-$(( 8545 - 1337 + chain_id ))}" ethprovider_host="evm_$chain_id" chain_data="$root/.chaindata/$chain_id" - mkdir -p $chain_data + mkdir -p "$chain_data" function cleanup { echo "Tests finished, stopping evm.." - docker container stop $ethprovider_host 2> /dev/null || true + docker container stop "$ethprovider_host" 2> /dev/null || true } trap cleanup EXIT SIGINT SIGTERM - docker run $opts \ + docker run \ --detach \ --entrypoint bash \ --env "CHAIN_ID=$chain_id" \ @@ -53,27 +53,28 @@ then --publish "$port:8545" \ --rm \ --tmpfs "/tmp" \ - ${project}_builder modules/contracts/ops/entry.sh + "${project}_builder" modules/contracts/ops/entry.sh chain_addresses="$chain_data/chain-addresses.json" - while [[ ! -f "$chain_addresses" || -z `cat $chain_addresses | grep "transferRegistryAddress"` ]] + # TODO: this change to appease shellcheck might be wrong & should be revisited + while ! grep -q "transferRegistryAddress" "$chain_addresses" do - if [[ -z `docker container ls -f name=$ethprovider_host -q` ]] + if [[ -z $(docker container ls -f "name=$ethprovider_host" -q) ]] then echo "$ethprovider_host was not able to start up successfully" && exit 1 else sleep 1 fi done echo "Provider for chain ${chain_id} is awake & ready to go on port ${port}!" - CHAIN_ADDRESSES="`cat "$chain_addresses"`" + CHAIN_ADDRESSES="$(cat "$chain_addresses")" CHAIN_PROVIDERS="{\"$chain_id\":\"http://$ethprovider_host:8545\"}" echo "CHAIN_PROVIDERS=${CHAIN_PROVIDERS}" echo "CHAIN_ADDRESSES=${CHAIN_ADDRESSES}" - config="`echo "$config" '{"chainProviders":'$CHAIN_PROVIDERS'}' | jq -s '.[0] + .[1]'`" - config="`echo "$config" '{"chainAddresses":'$CHAIN_ADDRESSES'}' | jq -s '.[0] + .[1]'`" + config="$(echo "$config" '{"chainProviders":'"$CHAIN_PROVIDERS"'}' | jq -s '.[0] + .[1]')" + config="$(echo "$config" '{"chainAddresses":'"$CHAIN_ADDRESSES"'}' | jq -s '.[0] + .[1]')" else CHAIN_PROVIDERS="{}" @@ -81,7 +82,7 @@ else fi docker run \ - $interactive \ + "$interactive" \ --entrypoint="bash" \ --env="VECTOR_CONFIG=$config" \ --env="CHAIN_PROVIDERS=$CHAIN_PROVIDERS" \ @@ -93,4 +94,4 @@ docker run \ --rm \ --tmpfs="/tmp" \ --volume="$root:/root" \ - ${project}_builder "/test.sh" "$unit" "$cmd" + "${project}_builder" "/test.sh" "$unit" "$cmd" diff --git a/ops/upgrade-package.sh b/ops/upgrade-package.sh index 516b0aa71..122255055 100644 --- a/ops/upgrade-package.sh +++ b/ops/upgrade-package.sh @@ -5,7 +5,7 @@ package="$1" version="$2" if [[ -z "$version" ]] -then version="`npm info $package version`" +then version="$(npm info "$package" version)" fi if [[ -z "$package" || -z "$version" || -n "$3" ]] @@ -15,7 +15,7 @@ fi echo echo "Before:" -grep -r '"'$package'": "' modules/*/package.json modules/*/ops/package.json package.json +grep -r '"'"$package"'": "' modules/*/package.json modules/*/ops/package.json package.json echo find modules/*/package.json modules/contracts/ops/package.json package.json \ @@ -25,5 +25,5 @@ find modules/*/package.json modules/contracts/ops/package.json package.json \ -exec sed -i -E 's|"'"$package"'": "[a-z0-9.^-]+"|"'"$package"'": "'"$version"'"|g' {} \; echo "After:" -grep -r '"'$package'": "' modules/*/package.json modules/*/ops/package.json package.json +grep -r '"'"$package"'": "' modules/*/package.json modules/*/ops/package.json package.json echo diff --git a/ops/version-check.sh b/ops/version-check.sh index dc1fb00fb..9455939d3 100644 --- a/ops/version-check.sh +++ b/ops/version-check.sh @@ -2,7 +2,7 @@ set -e root="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." >/dev/null 2>&1 && pwd )" -project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4`" +project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) # Packages that we should never report as being out-of-date: # - We don't want contract addresses to change so no more solidity-related upgrades @@ -10,7 +10,9 @@ project="`cat $root/package.json | grep '"name":' | head -n 1 | cut -d '"' -f 4` do_not_upgrade='@connext/' # Format string describing how each line looks -format='{printf("| %-32s|%8s -> %-8s|\n", $1, $3, $4)}' +function format { + awk '{printf("| %-32s|%8s -> %-8s|\n", $1, $3, $4)}' +} # Create the sed command to remove any ignored rows. # the first non-default delimiter needs to be \escaped if it's the first char @@ -20,20 +22,20 @@ do filter_cmd="$filter_cmd\| $ignored|d;" done echo "===== Package: $project/package.json" -npm outdated -D | tail -n +2 | awk '$3 != $4' | awk "$format" | sed "$filter_cmd" +npm outdated -D | tail -n +2 | awk '$3 != $4' | format | sed "$filter_cmd" echo -for package in `find modules ops -type f -name "package.json" -not -path "*/node_modules/*" -not -path "*/dist/*"` +for package in package.json modules/*/package.json modules/*/ops/package.json do - cd `dirname $package` - echo "===== Package: $project/`dirname $package`/package.json" + cd "$(dirname "$package")" || exit 1 + echo "===== Package: $project/$(dirname "$package")/package.json" mv package.json package.json.backup - cat package.json.backup | sed /@connext/d > package.json - npm outdated | tail -n +2 | awk '$3 != $4' | awk "$format" + sed /@connext/d < package.json.backup > package.json + npm outdated | tail -n +2 | awk '$3 != $4' | format echo "-----" - npm outdated -D | tail -n +2 | awk '$3 != $4' | awk "$format" + npm outdated -D | tail -n +2 | awk '$3 != $4' | format rm package.json mv package.json.backup package.json - cd $root + cd "$root" || exit 1 echo done