SHELL := /bin/bash .SHELLFLAGS += -e -u -o pipefail export REPOSITORY_ROOT := $(CURDIR) export IMAGE_NAME ?= mailserver-testing:ci export NAME ?= $(IMAGE_NAME) MAKEFLAGS += --no-print-directory BATS_FLAGS ?= --timing BATS_PARALLEL_JOBS ?= 2 .PHONY: ALWAYS_RUN # ----------------------------------------------- # --- Generic Targets --------------------------- # ----------------------------------------------- all: lint build generate-accounts tests clean build: ALWAYS_RUN @ docker build --tag $(IMAGE_NAME) . generate-accounts: ALWAYS_RUN @ cp test/config/templates/postfix-accounts.cf test/config/postfix-accounts.cf @ cp test/config/templates/dovecot-masters.cf test/config/dovecot-masters.cf # `docker ps`: Remove any lingering test containers # `.gitignore`: Remove `test/duplicate_configs` and files copied via `make generate-accounts` clean: ALWAYS_RUN -@ while read -r LINE; do CONTAINERS+=("$${LINE}"); done < <(docker ps -qaf name='^(dms-test|mail)_.*') ; \ for CONTAINER in "$${CONTAINERS[@]}"; do docker rm -f "$${CONTAINER}"; done -@ while read -r LINE; do [[ $${LINE} =~ test/.+ ]] && FILES+=("/mnt$${LINE#test}"); done < .gitignore ; \ docker run --rm -v "$(REPOSITORY_ROOT)/test/:/mnt" alpine ash -c "rm -rf $${FILES[@]}" run-local-instance: ALWAYS_RUN bash -c 'sleep 8 ; ./setup.sh email add postmaster@example.test 123' & docker run --rm --interactive --tty --name dms-test_example \ --env OVERRIDE_HOSTNAME=mail.example.test \ --env POSTFIX_INET_PROTOCOLS=ipv4 \ --env DOVECOT_INET_PROTOCOLS=ipv4 \ --env ENABLE_CLAMAV=0 \ --env ENABLE_AMAVIS=0 \ --env ENABLE_RSPAMD=0 \ --env ENABLE_OPENDKIM=0 \ --env ENABLE_OPENDMARC=0 \ --env ENABLE_POLICYD_SPF=0 \ --env ENABLE_SPAMASSASSIN=0 \ --env LOG_LEVEL=trace \ $(IMAGE_NAME) # ----------------------------------------------- # --- Tests ------------------------------------ # ----------------------------------------------- tests: ALWAYS_RUN # See https://github.com/docker-mailserver/docker-mailserver/pull/2857#issuecomment-1312724303 # on why `generate-accounts` is run before each set (TODO/FIXME) @ for DIR in tests/{serial,parallel/set{1,2,3}} ; do $(MAKE) generate-accounts "$${DIR}" ; done tests/serial: ALWAYS_RUN @ shopt -s globstar ; ./test/bats/bin/bats $(BATS_FLAGS) test/$@/*.bats tests/parallel/set%: ALWAYS_RUN @ shopt -s globstar ; $(REPOSITORY_ROOT)/test/bats/bin/bats $(BATS_FLAGS) \ --no-parallelize-within-files \ --jobs $(BATS_PARALLEL_JOBS) \ test/$@/**/*.bats test/%: ALWAYS_RUN @ shopt -s globstar nullglob ; ./test/bats/bin/bats $(BATS_FLAGS) test/tests/**/{$*,}.bats # ----------------------------------------------- # --- Lints ------------------------------------- # ----------------------------------------------- lint: ALWAYS_RUN eclint hadolint bashcheck shellcheck hadolint: ALWAYS_RUN @ ./test/linting/lint.sh hadolint bashcheck: ALWAYS_RUN @ ./test/linting/lint.sh bashcheck shellcheck: ALWAYS_RUN @ ./test/linting/lint.sh shellcheck eclint: ALWAYS_RUN @ ./test/linting/lint.sh eclint