From ecabfe3379fdb42d1bdc421c97ea42ef59b607ad Mon Sep 17 00:00:00 2001 From: Vaughn Dice Date: Fri, 19 Jul 2019 15:37:59 -0600 Subject: [PATCH] ci(brigade.js): add e2e job Signed-off-by: Vaughn Dice --- brigade.js | 33 ++++++++++++++++++++++++++++++++- brigade.json | 6 +++--- e2e/run.sh | 36 ++++++++++++++++++++++++------------ 3 files changed, 59 insertions(+), 16 deletions(-) diff --git a/brigade.js b/brigade.js index 16f83b331..7f7df743f 100644 --- a/brigade.js +++ b/brigade.js @@ -3,7 +3,7 @@ // Be careful when editing! // ============================================================================ const { events, Job, Group } = require("brigadier"); -const { Check } = require("@brigadecore/brigade-utils"); +const { Check, KindJob } = require("@brigadecore/brigade-utils"); const projectName = "brigade"; const projectOrg = "brigadecore"; @@ -50,6 +50,26 @@ function jsTest() { return job; } +function e2e() { + // Create a new job to run kind-based e2e tests + // Spec'd image wraps docker:stable-dind + // with make, bash,, git, kubectl, etc. + let kind = new KindJob("test-e2e"); + // Add golang path setup as e2e script invokes the brig cli + // by its main.go filepath + kind.mountPath = localPath; + kind.tasks.push( + "apk add --update --no-cache bash", + `cd ${localPath}`, + "CREATE_KIND=false make e2e" + ); + // TODO: remove this override once brigade-utils is bumped + // Fixed in https://github.com/brigadecore/brigade-utils/pull/30 + kind.timeout = 1800000 + + return kind; +} + function buildAndPublishImages(project, version) { let dockerRegistry = project.secrets.dockerhubRegistry || "docker.io"; let dockerOrg = project.secrets.dockerhubOrg || "brigadecore"; @@ -86,6 +106,7 @@ function runSuite(e, p) { return Promise.all([ runTests(e, p, goTest).catch((err) => { return err }), runTests(e, p, jsTest).catch((err) => { return err }), + runTests(e, p, e2e).catch((err) => { return err }), ]) .then((values) => { values.forEach((value) => { @@ -112,6 +133,8 @@ function runCheck(e, p) { return runTests(e, p, goTest); case "test-javascript": return runTests(e, p, jsTest); + case "test-e2e": + return runTests(e, p, e2e); default: throw new Error(`No check found with name: ${name}`); } @@ -174,6 +197,14 @@ function slackNotify(title, msg, project) { return noopJob; } +//////////////////////////////////////////////////////////////////////////////////////////// +// Event Handlers +//////////////////////////////////////////////////////////////////////////////////////////// + +events.on("e2e", () => { + return e2e().run(); +}) + events.on("exec", (e, p) => { return Group.runAll([ goTest(), diff --git a/brigade.json b/brigade.json index d1f1ace8c..c5b27e47a 100644 --- a/brigade.json +++ b/brigade.json @@ -1,5 +1,5 @@ { - "dependencies": { - "@brigadecore/brigade-utils": "0.2.0" - } + "dependencies": { + "@brigadecore/brigade-utils": "0.3.0" + } } \ No newline at end of file diff --git a/e2e/run.sh b/e2e/run.sh index 8d41a1621..d5abec4d0 100755 --- a/e2e/run.sh +++ b/e2e/run.sh @@ -1,6 +1,6 @@ #!/bin/bash # custom script for e2e testing -# ~/bin must exist and be part of $PATH +# ${BIN_DIR} must exist and be part of $PATH # kudos to https://elder.dev/posts/safer-bash/ set -o errexit # script exits when a command fails == set -e @@ -8,16 +8,24 @@ set -o nounset # script exits when tries to use undeclared variables == set -u #set -o xtrace # trace what's executed == set -x (useful for debugging) set -o pipefail # causes pipelines to retain / set the last non-zero status +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" +BIN_DIR="${BIN_DIR:-"$(mktemp -d)"}" + +# This script may be run in the form of a Brigade KindJob, +# wherein the kind cluster will have already been pre-provisioned, +# hence the need to be able to opt-out +CREATE_KIND="${CREATE_KIND:-true}" + KUBECTL_PLATFORM=linux/amd64 -KUBECTL_VERSION=v1.15.0 +KUBECTL_VERSION=v1.15.3 KUBECTL_EXECUTABLE=kubectl KIND_PLATFORM=kind-linux-amd64 -KIND_VERSION=v0.4.0 +KIND_VERSION=v0.5.1 KIND_EXECUTABLE=kind HELM_PLATFORM=linux-amd64 -HELM_VERSION=helm-v3.0.0-alpha.1 +HELM_VERSION=helm-v3.0.0-beta.4 HELM_EXECUTABLE=helm3 ######################################################################################################################################################## @@ -26,20 +34,22 @@ function prerequisites_check(){ # check if kubectl is installed if ! [ -x "$(command -v kubectl)" ]; then echo 'Error: kubectl is not installed. Installing...' - curl -LO https://storage.googleapis.com/kubernetes-release/release/$KUBECTL_VERSION/bin/$KUBECTL_PLATFORM/kubectl && chmod +x ./kubectl && mv kubectl ~/bin/$KUBECTL_EXECUTABLE + curl -LO https://storage.googleapis.com/kubernetes-release/release/$KUBECTL_VERSION/bin/$KUBECTL_PLATFORM/kubectl && chmod +x ./kubectl && mv kubectl ${BIN_DIR}/$KUBECTL_EXECUTABLE fi # check if kind is installed if ! [ -x "$(command -v $KIND_EXECUTABLE)" ]; then echo 'Error: kind is not installed. Installing...' - wget https://github.com/kubernetes-sigs/kind/releases/download/$KIND_VERSION/$KIND_PLATFORM && mv $KIND_PLATFORM ~/bin/$KIND_EXECUTABLE && chmod +x ~/bin/$KIND_EXECUTABLE + wget https://github.com/kubernetes-sigs/kind/releases/download/$KIND_VERSION/$KIND_PLATFORM && mv $KIND_PLATFORM ${BIN_DIR}/$KIND_EXECUTABLE && chmod +x ${BIN_DIR}/$KIND_EXECUTABLE fi # check if helm is installed if ! [ -x "$(command -v $HELM_EXECUTABLE)" ]; then echo 'Error: Helm is not installed. Installing...' - wget https://get.helm.sh/$HELM_VERSION-$HELM_PLATFORM.tar.gz && tar -xvzf $HELM_VERSION-$HELM_PLATFORM.tar.gz && rm -rf $HELM_VERSION-$HELM_PLATFORM.tar.gz && mv $HELM_PLATFORM/helm ~/bin/$HELM_EXECUTABLE && chmod +x ~/bin/$HELM_EXECUTABLE + wget https://get.helm.sh/$HELM_VERSION-$HELM_PLATFORM.tar.gz && tar -xvzf $HELM_VERSION-$HELM_PLATFORM.tar.gz && rm -rf $HELM_VERSION-$HELM_PLATFORM.tar.gz && mv $HELM_PLATFORM/helm ${BIN_DIR}/$HELM_EXECUTABLE && chmod +x ${BIN_DIR}/$HELM_EXECUTABLE fi + + export PATH="${BIN_DIR}:${PATH}" } @@ -57,13 +67,11 @@ function install_helm_project(){ function wait_for_deployments() { echo "-----Waiting for Brigade components' deployments-----" # https://stackoverflow.com/questions/59895/getting-the-source-directory-of-a-bash-script-from-within - DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" "${DIR}"/wait-for-deployment.sh -n default brigade-server-brigade-api "${DIR}"/wait-for-deployment.sh -n default brigade-server-brigade-cr-gw "${DIR}"/wait-for-deployment.sh -n default brigade-server-brigade-ctrl "${DIR}"/wait-for-deployment.sh -n default brigade-server-brigade-generic-gateway "${DIR}"/wait-for-deployment.sh -n default brigade-server-brigade-github-app - "${DIR}"/wait-for-deployment.sh -n default brigade-server-brigade-github-oauth "${DIR}"/wait-for-deployment.sh -n default brigade-server-kashti } @@ -100,11 +108,15 @@ function run_verify_build(){ prerequisites_check # create kind k8s cluster -$KIND_EXECUTABLE create cluster +if [[ "${CREATE_KIND}" == "true" ]]; then + $KIND_EXECUTABLE create cluster +fi function finish { - echo "-----Cleaning up-----" - $KIND_EXECUTABLE delete cluster + if [[ "${CREATE_KIND}" == "true" ]]; then + echo "-----Cleaning up-----" + $KIND_EXECUTABLE delete cluster + fi } trap finish EXIT