Poor-man e2e tests

Signed-off-by: Alvaro Saurin <alvaro.saurin@gmail.com>
This commit is contained in:
Alvaro Saurin 2020-01-17 21:46:23 +01:00
parent d8951c0eb3
commit a3696aa3d4
No known key found for this signature in database
GPG Key ID: 7B38F4A5C322A955
6 changed files with 163 additions and 6 deletions

View File

@ -8,10 +8,9 @@ git:
depth: 1
install: true
before_script:
- curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ${GOPATH}/bin v1.20.0
- go get github.com/mitchellh/gox@v1.0.1
- make ci-setup
script:
- make fmt check build-cross
- make ci-tests ci-dist
deploy:
provider: releases
skip_cleanup: true

View File

@ -4,4 +4,10 @@ COPY . .
RUN make build && bin/k3d --version
FROM docker:19.03-dind
# TODO: we could create a different stage for e2e tests
RUN apk add bash curl sudo
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl && \
chmod +x ./kubectl && \
mv ./kubectl /usr/local/bin/kubectl
COPY --from=builder /app/bin/k3d /bin/k3d

View File

@ -32,10 +32,12 @@ GOFLAGS :=
BINDIR := $(CURDIR)/bin
BINARIES := k3d
K3D_IMAGE_TAG := $(GIT_TAG)
# Go Package required
PKG_GOX := github.com/mitchellh/gox@v1.0.1
PKG_GOLANGCI_LINT_VERSION := 1.22.2
PKG_GOLANGCI_LINT_SCRIPT := https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh
PKG_GOLANGCI_LINT := github.com/golangci/golangci-lint/cmd/golangci-lint@v${PKG_GOLANGCI_LINT_VERSION}
# configuration adjustments for golangci-lint
@ -62,12 +64,16 @@ LINT_DIRS := $(DIRS) $(foreach dir,$(REC_DIRS),$(dir)/...)
all: clean fmt check build
build:
CGO_ENABLED=0 $(GO) build -i $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' -o '$(BINDIR)/$(BINARIES)'
CGO_ENABLED=0 $(GO) build $(GOFLAGS) -tags '$(TAGS)' -ldflags '$(LDFLAGS)' -o '$(BINDIR)/$(BINARIES)'
build-cross: LDFLAGS += -extldflags "-static"
build-cross:
CGO_ENABLED=0 gox -parallel=3 -output="_dist/$(BINARIES)-{{.OS}}-{{.Arch}}" -osarch='$(TARGETS)' $(GOFLAGS) $(if $(TAGS),-tags '$(TAGS)',) -ldflags '$(LDFLAGS)'
build-dockerfile: Dockerfile
@echo "Building Docker image k3d:$(K3D_IMAGE_TAG)"
docker build -t k3d:$(K3D_IMAGE_TAG) .
clean:
@rm -rf $(BINDIR) _dist/
@ -79,6 +85,19 @@ extra-clean: clean
fmt:
@gofmt -s -l -w $(GO_SRC)
e2e: build
EXE='$(BINDIR)/$(BINARIES)' ./tests/runner.sh
e2e-dind: build-dockerfile
@echo "Running e2e tests in k3d:$(K3D_IMAGE_TAG)"
docker run -ti --rm \
-v `pwd`/tests:/tests \
-v /var/run/docker.sock:/var/run/docker.sock \
-e EXE="/bin/k3d" \
-e CI="true" \
k3d:$(K3D_IMAGE_TAG) \
/bin/bash /tests/runner.sh
# check-fmt returns an error code if any source code contains format error.
check-fmt:
@test -z $(shell gofmt -s -l $(GO_SRC) | tee /dev/stderr) || echo "[WARN] Fix formatting issues with 'make fmt'"
@ -98,15 +117,31 @@ ifndef HAS_GOX
($(GO) get $(PKG_GOX))
endif
ifndef HAS_GOLANGCI
(curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b ${GOPATH}/bin v${PKG_GOLANGCI_LINT_VERSION})
(curl -sfL $(PKG_GOLANGCI_LINT_SCRIPT) | sh -s -- -b ${GOPATH}/bin v${PKG_GOLANGCI_LINT_VERSION})
endif
ifdef HAS_GOLANGCI
ifeq ($(HAS_GOLANGCI_VERSION),)
ifdef INTERACTIVE
@echo "Warning: Your installed version of golangci-lint (interactive: ${INTERACTIVE}) differs from what we'd like to use. Switch to v${PKG_GOLANGCI_LINT_VERSION}? [Y/n]"
@read line; if [ $$line == "y" ]; then (curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b ${GOPATH}/bin v${PKG_GOLANGCI_LINT_VERSION}); fi
@read line; if [ $$line == "y" ]; then (curl -sfL $(PKG_GOLANGCI_LINT_SCRIPT) | sh -s -- -b ${GOPATH}/bin v${PKG_GOLANGCI_LINT_VERSION}); fi
else
@echo "Warning: you're not using the same version of golangci-lint as us (v${PKG_GOLANGCI_LINT_VERSION})"
endif
endif
endif
ci-setup:
@echo "Installing Go tools..."
curl -sfL $(PKG_GOLANGCI_LINT_SCRIPT) | sh -s -- -b ${GOPATH}/bin v$(PKG_GOLANGCI_LINT_VERSION)
go get $(PKG_GOX)
@echo "Installing kubectl..."
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
ci-tests: fmt check e2e
ci-dist: build-cross
ci-tests-dind: fmt check e2e-dind

24
tests/01-basic.sh Executable file
View File

@ -0,0 +1,24 @@
#!/bin/bash
CURR_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
[ -d "$CURR_DIR" ] || { echo "FATAL: no current dir (maybe running in zsh?)"; exit 1; }
# shellcheck source=./common.sh
source "$CURR_DIR/common.sh"
#########################################################################################
info "Creating two clusters..."
$EXE create --wait 60 --name "c1" --api-port 6443 || failed "could not create cluster c1"
$EXE create --wait 60 --name "c2" --api-port 6444 || failed "could not create cluster c2"
info "Checking we have access to both clusters..."
check_k3d_clusters "c1" "c2" || failed "error checking cluster"
info "Deleting clusters..."
$EXE delete --name "c1" || failed "could not delete the cluster c1"
$EXE delete --name "c2" || failed "could not delete the cluster c2"
exit 0

71
tests/common.sh Normal file
View File

@ -0,0 +1,71 @@
#!/bin/bash
RED='\033[1;31m'
GRN='\033[1;32m'
YEL='\033[1;33m'
BLU='\033[1;34m'
WHT='\033[1;37m'
MGT='\033[1;95m'
CYA='\033[1;96m'
END='\033[0m'
BLOCK='\033[1;37m'
PATH=/usr/local/bin:$PATH
export PATH
log() { >&2 printf "${BLOCK}>>>${END} $1\n"; }
info() { log "${BLU}$1${END}"; }
highlight() { log "${MGT}$1${END}"; }
bye() {
log "${BLU}$1... exiting${END}"
exit 0
}
warn() { log "${RED}!!! WARNING !!! $1 ${END}"; }
abort() {
log "${RED}FATAL: $1${END}"
exit 1
}
command_exists() {
command -v $1 >/dev/null 2>&1
}
failed() {
if [ -z "$1" ] ; then
log "${RED}failed!!!${END}"
else
log "${RED}$1${END}"
fi
abort "test failed"
}
passed() {
if [ -z "$1" ] ; then
log "${GRN}done!${END}"
else
log "${GRN}$1${END}"
fi
}
# checks that a URL is available, with an optional error message
check_url() {
command_exists curl || abort "curl is not installed"
curl -L --silent -k --output /dev/null --fail "$1"
}
check_k3d_clusters() {
for c in "c1" "c2" ; do
kc=$($EXE get-kubeconfig --name "$c")
if kubectl --kubeconfig=$kc cluster-info ; then
passed "cluster $c is reachable"
else
warn "could not obtain cluster info for $c with kubeconfig=$kc. Contents:\n$(cat $kc)"
return 1
fi
done
return 0
}

22
tests/runner.sh Executable file
View File

@ -0,0 +1,22 @@
#!/bin/bash
CURR_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
[ -d "$CURR_DIR" ] || { echo "FATAL: no current dir (maybe running in zsh?)"; exit 1; }
# shellcheck source=./common.sh
source "$CURR_DIR/common.sh"
#########################################################################################
[ -n "$EXE" ] || abort "no EXE provided"
info "Starting e2e tests..."
for i in $CURR_DIR/[0-9]*.sh ; do
base=$(basename $i .sh)
highlight "***** Running $base *****"
$i || abort "test $base failed"
done
exit 0