diff --git a/.ci/run-elasticsearch.sh b/.ci/run-elasticsearch.sh index fabc7b549..72c7ec096 100644 --- a/.ci/run-elasticsearch.sh +++ b/.ci/run-elasticsearch.sh @@ -5,6 +5,10 @@ # # Export the ELASTICSEARCH_VERSION variable, eg. 'elasticsearch:8.0.0-SNAPSHOT'. +# Version 1.0 +# - Initial version of the run-elasticsearch.sh script + + if [[ -z "$ELASTICSEARCH_VERSION" ]]; then echo -e "\033[31;1mERROR:\033[0m Required environment variable [ELASTICSEARCH_VERSION] not set\033[0m" exit 1 @@ -12,6 +16,8 @@ fi set -euxo pipefail +SCRIPT_PATH=$(dirname $(realpath -s $0)) + moniker=$(echo "$ELASTICSEARCH_VERSION" | tr -C "[:alnum:]" '-') suffix=rest-test @@ -21,9 +27,10 @@ CLUSTER_NAME=${CLUSTER_NAME-${moniker}${suffix}} HTTP_PORT=${HTTP_PORT-9200} ELASTIC_PASSWORD=${ELASTIC_PASSWORD-changeme} -SSL_CERT=${SSL_CERT-"$PWD/certs/testnode.crt"} -SSL_KEY=${SSL_KEY-"$PWD/certs/testnode.key"} -SSL_CA=${SSL_CA-"$PWD/certs/ca.crt"} +SSL_CERT=${SSL_CERT-"${SCRIPT_PATH}/certs/testnode.crt"} +SSL_KEY=${SSL_KEY-"${SCRIPT_PATH}/certs/testnode.key"} +SSL_CA=${SSL_CA-"${SCRIPT_PATH}/certs/ca.crt"} +SSL_CA_PEM=${SSL_CA-"${SCRIPT_PATH}/certs/ca.pem"} DETACH=${DETACH-false} CLEANUP=${CLEANUP-false} @@ -40,8 +47,14 @@ function cleanup_volume { (docker volume rm "$1") || true fi } +function container_running { + if [[ "$(docker ps -q -f name=$1)" ]]; then + return 0; + else return 1; + fi +} function cleanup_node { - if [[ "$(docker ps -q -f name=$1)" ]]; then + if container_running "$1"; then echo -e "\033[34;1mINFO:\033[0m Removing container $1\033[0m" (docker container rm --force --volumes "$1") || true cleanup_volume "$1-${suffix}-data" @@ -125,6 +138,7 @@ END --volume $SSL_CERT:/usr/share/elasticsearch/config/certs/testnode.crt --volume $SSL_KEY:/usr/share/elasticsearch/config/certs/testnode.key --volume $SSL_CA:/usr/share/elasticsearch/config/certs/ca.crt + --volume $SSL_CA_PEM:/usr/share/elasticsearch/config/certs/ca.pem END )) fi @@ -134,6 +148,11 @@ if [[ "$ELASTICSEARCH_VERSION" != *oss* ]]; then url="https://elastic:$ELASTIC_PASSWORD@$NODE_NAME" fi +cert_validation_flags="--insecure" +if [[ "$NODE_NAME" == "instance" ]]; then + cert_validation_flags="--cacert /usr/share/elasticsearch/config/certs/ca.pem --resolve ${NODE_NAME}:443:127.0.0.1" +fi + echo -e "\033[34;1mINFO:\033[0m Starting container $NODE_NAME \033[0m" set -x docker run \ @@ -146,7 +165,7 @@ docker run \ --ulimit nofile=65536:65536 \ --ulimit memlock=-1:-1 \ --detach="$DETACH" \ - --health-cmd="curl --silent --insecure --fail $url:9200/_cluster/health || exit 1" \ + --health-cmd="curl $cert_validation_flags --fail $url:9200/_cluster/health || exit 1" \ --health-interval=2s \ --health-retries=20 \ --health-timeout=2s \ @@ -155,14 +174,19 @@ docker run \ set +x if [[ "$DETACH" == "true" ]]; then - until [[ "$(docker inspect -f "{{.State.Health.Status}}" ${NODE_NAME})" != "starting" ]]; do - sleep 2; + until ! container_running "$NODE_NAME" || (container_running "$NODE_NAME" && [[ "$(docker inspect -f "{{.State.Health.Status}}" ${NODE_NAME})" != "starting" ]]); do echo "" + docker inspect -f "{{range .State.Health.Log}}{{.Output}}{{end}}" ${NODE_NAME} echo -e "\033[34;1mINFO:\033[0m waiting for node $NODE_NAME to be up\033[0m" + sleep 2; done; - # Always show the node getting started logs, this is very useful both on CI as well as while developing - docker logs "$NODE_NAME" - if [[ "$(docker inspect -f "{{.State.Health.Status}}" ${NODE_NAME})" != "healthy" ]]; then + + # Always show logs if the container is running, this is very useful both on CI as well as while developing + if container_running $NODE_NAME; then + docker logs $NODE_NAME + fi + + if ! container_running $NODE_NAME || [[ "$(docker inspect -f "{{.State.Health.Status}}" ${NODE_NAME})" != "healthy" ]]; then cleanup 1 echo echo -e "\033[31;1mERROR:\033[0m Failed to start ${ELASTICSEARCH_VERSION} in detached mode beyond health checks\033[0m" diff --git a/.ci/run-repository.sh b/.ci/run-repository.sh new file mode 100755 index 000000000..a053411fb --- /dev/null +++ b/.ci/run-repository.sh @@ -0,0 +1,48 @@ +#!/usr/bin/env bash +# parameters are available to this script + +# ELASTICSEARCH_VERSION -- version e.g Major.Minor.Patch(-Prelease) +# ELASTICSEARCH_CONTAINER -- the docker moniker as a reference to know which docker image distribution is used +# ELASTICSEARCH_URL -- The url at which elasticsearch is reachable +# NETWORK_NAME -- The docker network name +# NODE_NAME -- The docker container name also used as Elasticsearch node name +# NODE_JS_VERSION -- node js version (defined in test-matrix.yml, a default is hardcoded here) + +NODE_JS_VERSION=${NODE_JS_VERSION-12} + +echo -e "\033[34;1mINFO:\033[0m URL ${ELASTICSEARCH_URL}\033[0m" +echo -e "\033[34;1mINFO:\033[0m VERSION ${ELASTICSEARCH_VERSION}\033[0m" +echo -e "\033[34;1mINFO:\033[0m CONTAINER ${ELASTICSEARCH_CONTAINER}\033[0m" +echo -e "\033[34;1mINFO:\033[0m TEST_SUITE ${TEST_SUITE}\033[0m" +echo -e "\033[34;1mINFO:\033[0m NODE_JS_VERSION ${NODE_JS_VERSION}\033[0m" + +echo -e "\033[1m>>>>> Build docker container >>>>>>>>>>>>>>>>>>>>>>>>>>>>>\033[0m" + +set -eo pipefail + +set +x +export VAULT_TOKEN=$(vault write -field=token auth/approle/login role_id="$VAULT_ROLE_ID" secret_id="$VAULT_SECRET_ID") +export CODECOV_TOKEN=$(vault read -field=token secret/clients-ci/elasticsearch-js/codecov) +unset VAULT_ROLE_ID VAULT_SECRET_ID VAULT_TOKEN +set -x + +docker build \ + --file .ci/Dockerfile \ + --tag elastic/elasticsearch-js \ + --build-arg NODE_JS_VERSION=${NODE_JS_VERSION} \ + . + +echo -e "\033[1m>>>>> NPM run ci >>>>>>>>>>>>>>>>>>>>>>>>>>>>>\033[0m" + +repo=$(realpath $(dirname $(realpath -s $0))/../) + +docker run \ + --network=${NETWORK_NAME} \ + --env "TEST_ES_SERVER=${ELASTICSEARCH_URL}" \ + --env "CODECOV_TOKEN" \ + --volume $repo:/usr/src/app \ + --volume /usr/src/app/node_modules \ + --name elasticsearch-js \ + --rm \ + elastic/elasticsearch-js \ + npm run ci diff --git a/.ci/run-tests b/.ci/run-tests index 62d2a56e9..7086a0400 100755 --- a/.ci/run-tests +++ b/.ci/run-tests @@ -1,59 +1,58 @@ #!/usr/bin/env bash - -# -# Runs the client tests via Docker with the expectation that the required -# environment variables have already been exported before running this script. -# -# The required environment variables include: -# -# - $ELASTICSEARCH_VERSION -# - $NODE_JS_VERSION -# - $TEST_SUITE # +# Version 1.0 +# - Moved to .ci folder and seperated out `run-repository.sh` -set -eo pipefail +if [[ -z $ELASTICSEARCH_VERSION ]]; then + echo -e "\033[31;1mERROR:\033[0m Required environment variable [ELASTICSEARCH_VERSION] not set\033[0m" + exit 1 +fi +set -euxo pipefail -set +x -export VAULT_TOKEN=$(vault write -field=token auth/approle/login role_id="$VAULT_ROLE_ID" secret_id="$VAULT_SECRET_ID") -export CODECOV_TOKEN=$(vault read -field=token secret/clients-ci/elasticsearch-js/codecov) -unset VAULT_ROLE_ID VAULT_SECRET_ID VAULT_TOKEN -set -x -docker build \ - --file .ci/Dockerfile \ - --tag elastic/elasticsearch-js \ - --build-arg NODE_JS_VERSION=${NODE_JS_VERSION} \ - . +TEST_SUITE=${TEST_SUITE-oss} +NODE_NAME=instance -NODE_NAME="es1" -repo=$(pwd) -testnodecrt="/.ci/certs/testnode.crt" -testnodekey="/.ci/certs/testnode.key" -cacrt="/.ci/certs/ca.crt" -elasticsearch_image="elasticsearch" -elasticsearch_url="https://elastic:changeme@${NODE_NAME}:9200" +elasticsearch_image=elasticsearch +elasticsearch_url=https://elastic:changeme@${NODE_NAME}:9200 if [[ $TEST_SUITE != "xpack" ]]; then - elasticsearch_image="elasticsearch-oss" - elasticsearch_url="http://${NODE_NAME}:9200" + elasticsearch_image=elasticsearch-${TEST_SUITE} + elasticsearch_url=http://${NODE_NAME}:9200 fi -ELASTICSEARCH_VERSION="${elasticsearch_image}:${ELASTICSEARCH_VERSION}" \ - NODE_NAME="${NODE_NAME}" \ - NETWORK_NAME="esnet" \ +function cleanup { + status=$? + set +x + ELASTICSEARCH_VERSION=${elasticsearch_image}:${ELASTICSEARCH_VERSION} \ + NODE_NAME=${NODE_NAME} \ + NETWORK_NAME=elasticsearch \ + CLEANUP=true \ + bash ./.ci/run-elasticsearch.sh + # Report status and exit + if [[ "$status" == "0" ]]; then + echo -e "\n\033[32;1mSUCCESS run-tests\033[0m" + exit 0 + else + echo -e "\n\033[31;1mFAILURE during run-tests\033[0m" + exit ${status} + fi +} +trap cleanup EXIT + +echo -e "\033[1m>>>>> Start [$ELASTICSEARCH_VERSION container] >>>>>>>>>>>>>>>>>>>>>>>>>>>>>\033[0m" + +ELASTICSEARCH_VERSION=${elasticsearch_image}:${ELASTICSEARCH_VERSION} \ + NODE_NAME=${NODE_NAME} \ + NETWORK_NAME=elasticsearch \ DETACH=true \ - SSL_CERT="${repo}${testnodecrt}" \ - SSL_KEY="${repo}${testnodekey}" \ - SSL_CA="${repo}${cacrt}" \ bash .ci/run-elasticsearch.sh -docker run \ - --network=esnet \ - --env "TEST_ES_SERVER=${elasticsearch_url}" \ - --env "CODECOV_TOKEN" \ - --volume $repo:/usr/src/app \ - --volume /usr/src/app/node_modules \ - --name elasticsearch-js \ - --rm \ - elastic/elasticsearch-js \ - npm run ci +echo -e "\033[1m>>>>> Repository specific tests >>>>>>>>>>>>>>>>>>>>>>>>>>>>>\033[0m" + +ELASTICSEARCH_CONTAINER=${elasticsearch_image}:${ELASTICSEARCH_VERSION} \ + NETWORK_NAME=elasticsearch \ + NODE_NAME=${NODE_NAME} \ + ELASTICSEARCH_URL=${elasticsearch_url} \ + bash .ci/run-repository.sh + diff --git a/.gitignore b/.gitignore index 85b6dce46..c610926ce 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,9 @@ jspm_packages # vim swap files *.swp +#Jetbrains editor folder +.idea + package-lock.json # elasticsearch repo or binary files