Poor-man e2e tests
Signed-off-by: Alvaro Saurin <alvaro.saurin@gmail.com>
This commit is contained in:
parent
d8951c0eb3
commit
a3696aa3d4
@ -8,10 +8,9 @@ git:
|
|||||||
depth: 1
|
depth: 1
|
||||||
install: true
|
install: true
|
||||||
before_script:
|
before_script:
|
||||||
- curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ${GOPATH}/bin v1.20.0
|
- make ci-setup
|
||||||
- go get github.com/mitchellh/gox@v1.0.1
|
|
||||||
script:
|
script:
|
||||||
- make fmt check build-cross
|
- make ci-tests ci-dist
|
||||||
deploy:
|
deploy:
|
||||||
provider: releases
|
provider: releases
|
||||||
skip_cleanup: true
|
skip_cleanup: true
|
||||||
|
@ -4,4 +4,10 @@ COPY . .
|
|||||||
RUN make build && bin/k3d --version
|
RUN make build && bin/k3d --version
|
||||||
|
|
||||||
FROM docker:19.03-dind
|
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
|
COPY --from=builder /app/bin/k3d /bin/k3d
|
||||||
|
41
Makefile
41
Makefile
@ -32,10 +32,12 @@ GOFLAGS :=
|
|||||||
BINDIR := $(CURDIR)/bin
|
BINDIR := $(CURDIR)/bin
|
||||||
BINARIES := k3d
|
BINARIES := k3d
|
||||||
|
|
||||||
|
K3D_IMAGE_TAG := $(GIT_TAG)
|
||||||
|
|
||||||
# Go Package required
|
# Go Package required
|
||||||
PKG_GOX := github.com/mitchellh/gox@v1.0.1
|
PKG_GOX := github.com/mitchellh/gox@v1.0.1
|
||||||
PKG_GOLANGCI_LINT_VERSION := 1.22.2
|
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}
|
PKG_GOLANGCI_LINT := github.com/golangci/golangci-lint/cmd/golangci-lint@v${PKG_GOLANGCI_LINT_VERSION}
|
||||||
|
|
||||||
# configuration adjustments for golangci-lint
|
# configuration adjustments for golangci-lint
|
||||||
@ -62,12 +64,16 @@ LINT_DIRS := $(DIRS) $(foreach dir,$(REC_DIRS),$(dir)/...)
|
|||||||
all: clean fmt check build
|
all: clean fmt check build
|
||||||
|
|
||||||
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: LDFLAGS += -extldflags "-static"
|
||||||
build-cross:
|
build-cross:
|
||||||
CGO_ENABLED=0 gox -parallel=3 -output="_dist/$(BINARIES)-{{.OS}}-{{.Arch}}" -osarch='$(TARGETS)' $(GOFLAGS) $(if $(TAGS),-tags '$(TAGS)',) -ldflags '$(LDFLAGS)'
|
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:
|
clean:
|
||||||
@rm -rf $(BINDIR) _dist/
|
@rm -rf $(BINDIR) _dist/
|
||||||
|
|
||||||
@ -79,6 +85,19 @@ extra-clean: clean
|
|||||||
fmt:
|
fmt:
|
||||||
@gofmt -s -l -w $(GO_SRC)
|
@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 returns an error code if any source code contains format error.
|
||||||
check-fmt:
|
check-fmt:
|
||||||
@test -z $(shell gofmt -s -l $(GO_SRC) | tee /dev/stderr) || echo "[WARN] Fix formatting issues with 'make 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))
|
($(GO) get $(PKG_GOX))
|
||||||
endif
|
endif
|
||||||
ifndef HAS_GOLANGCI
|
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
|
endif
|
||||||
ifdef HAS_GOLANGCI
|
ifdef HAS_GOLANGCI
|
||||||
ifeq ($(HAS_GOLANGCI_VERSION),)
|
ifeq ($(HAS_GOLANGCI_VERSION),)
|
||||||
ifdef INTERACTIVE
|
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]"
|
@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
|
else
|
||||||
@echo "Warning: you're not using the same version of golangci-lint as us (v${PKG_GOLANGCI_LINT_VERSION})"
|
@echo "Warning: you're not using the same version of golangci-lint as us (v${PKG_GOLANGCI_LINT_VERSION})"
|
||||||
endif
|
endif
|
||||||
endif
|
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
24
tests/01-basic.sh
Executable 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
71
tests/common.sh
Normal 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
22
tests/runner.sh
Executable 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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user