diff --git a/.circleci/config.yml b/.circleci/config.yml index 60167586..b896d053 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -150,6 +150,17 @@ jobs: - run: test/e2e-linkerd.sh - run: test/e2e-linkerd-tests.sh + e2e-contour-testing: + machine: true + steps: + - checkout + - attach_workspace: + at: /tmp/bin + - run: test/container-build.sh + - run: test/e2e-kind.sh + - run: test/e2e-contour.sh + - run: test/e2e-contour-tests.sh + push-helm-charts: docker: - image: circleci/golang:1.13 @@ -215,6 +226,9 @@ workflows: - e2e-linkerd-testing: requires: - build-binary + - e2e-contour-testing: + requires: + - build-binary - push-container: requires: - build-binary diff --git a/test/container-build.sh b/test/container-build.sh index 4ee2ccc8..205d27e7 100755 --- a/test/container-build.sh +++ b/test/container-build.sh @@ -9,4 +9,3 @@ cp /tmp/bin/flagger ${REPO_ROOT}/bin && chmod +x ${REPO_ROOT}/bin/flagger cp /tmp/bin/loadtester ${REPO_ROOT}/bin && chmod +x ${REPO_ROOT}/bin/loadtester docker build -t test/flagger:latest . -f ${REPO_ROOT}/Dockerfile -docker build -t test/flagger-loadtester:latest . -f ${REPO_ROOT}/Dockerfile.loadtester \ No newline at end of file diff --git a/test/e2e-contour-tests.sh b/test/e2e-contour-tests.sh new file mode 100755 index 00000000..2f97dd3e --- /dev/null +++ b/test/e2e-contour-tests.sh @@ -0,0 +1,130 @@ +#!/usr/bin/env bash + +# This script runs e2e tests for Canary initialization, analysis and promotion +# Prerequisites: Kubernetes Kind and Contour ingress controller + +set -o errexit + +REPO_ROOT=$(git rev-parse --show-toplevel) +export KUBECONFIG="$(kind get kubeconfig-path --name="kind")" + +echo '>>> Creating test namespace' +kubectl create namespace test + +echo '>>> Installing load tester' +kubectl -n test apply -f ${REPO_ROOT}/artifacts/loadtester/ +kubectl -n test rollout status deployment/flagger-loadtester + +echo '>>> Initialising canary' +kubectl apply -f ${REPO_ROOT}/test/e2e-workload.yaml + +cat <>> Waiting for primary to be ready' +retries=50 +count=0 +ok=false +until ${ok}; do + kubectl -n test get canary/podinfo | grep 'Initialized' && ok=true || ok=false + sleep 5 + count=$(($count + 1)) + if [[ ${count} -eq ${retries} ]]; then + kubectl -n projectcontour logs deployment/flagger + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary initialization test passed' + +echo '>>> Triggering canary deployment' +kubectl -n test set image deployment/podinfo podinfod=stefanprodan/podinfo:3.1.1 + +echo '>>> Waiting for canary promotion' +retries=50 +count=0 +ok=false +until ${ok}; do + kubectl -n test describe deployment/podinfo-primary | grep '3.1.1' && ok=true || ok=false + sleep 10 + kubectl -n projectcontour logs deployment/flagger --tail 1 + count=$(($count + 1)) + if [[ ${count} -eq ${retries} ]]; then + kubectl -n test describe deployment/podinfo + kubectl -n test describe deployment/podinfo-primary + kubectl -n test logs deployment/flagger-loadtester + kubectl -n projectcontour logs deployment/flagger + kubectl -n projectcontour get all + kubectl -n test get httpproxy podinfo -oyaml + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary promotion test passed' diff --git a/test/e2e-contour.sh b/test/e2e-contour.sh new file mode 100755 index 00000000..e0230c32 --- /dev/null +++ b/test/e2e-contour.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +set -o errexit + +REPO_ROOT=$(git rev-parse --show-toplevel) +export KUBECONFIG="$(kind get kubeconfig-path --name="kind")" + +echo '>>> Installing Contour' +kubectl apply -f https://projectcontour.io/quickstart/contour.yaml + +kubectl -n projectcontour rollout status deployment/contour +kubectl -n projectcontour get all + +echo '>>> Installing Flagger' +kind load docker-image test/flagger:latest + +echo '>>> Installing Flagger' +helm upgrade -i flagger ${REPO_ROOT}/charts/flagger \ +--namespace projectcontour \ +--set prometheus.install=true \ +--set meshProvider=contour + +kubectl -n projectcontour set image deployment/flagger flagger=test/flagger:latest + +kubectl -n projectcontour rollout status deployment/flagger +kubectl -n projectcontour rollout status deployment/flagger-prometheus