diff --git a/Makefile b/Makefile index 623249e..984b189 100644 --- a/Makefile +++ b/Makefile @@ -7,9 +7,28 @@ latest-versions: ## Checks all the latest versions of the Dockerfile contents. ./latest-versions.sh .PHONY: test -test: ## Runs the tests on the repository. +test: shellcheck dockerfiles ## Runs the tests on the repository. + +.PHONY: dockerfiles +dockerfiles: ## Tests the changes to the Dockefiles build. ./test.sh +# if this session isn't interactive, then we don't want to allocate a +# TTY, which would fail, but if it is interactive, we do want to attach +# so that the user can send e.g. ^C through. +INTERACTIVE := $(shell [ -t 0 ] && echo 1 || echo 0) +ifeq ($(INTERACTIVE), 1) + DOCKER_FLAGS += -t +endif + +.PHONY: shellcheck +shellcheck: ## Runs the shellcheck tests on the scripts. + docker run --rm -i $(DOCKER_FLAGS) \ + --name df-shellcheck \ + -v $(CURDIR):/usr/src:ro \ + --workdir /usr/src \ + r.j3ss.co/shellcheck ./shellcheck.sh + .PHONY: help help: @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' diff --git a/shellcheck.sh b/shellcheck.sh new file mode 100755 index 0000000..aea73fa --- /dev/null +++ b/shellcheck.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -e +set -o pipefail + +ERRORS=() + +# find all executables and run `shellcheck` +for f in $(find . -type f -not -iwholename '*.git*' | sort -u); do + if file "$f" | grep --quiet shell; then + { + shellcheck "$f" && echo "[OK]: sucessfully linted $f" + } || { + # add to errors + ERRORS+=("$f") + } + fi +done + +if [ ${#ERRORS[@]} -eq 0 ]; then + echo "No errors, hooray" +else + echo "These files failed shellcheck: ${ERRORS[*]}" + exit 1 +fi