Skip to content

Commit 3acee8b

Browse files
committed
New CI configuration (#996)
* Removed old files * Updated README * New CI configuration * Updated run-test script
1 parent 60a1f29 commit 3acee8b

File tree

4 files changed

+202
-72
lines changed

4 files changed

+202
-72
lines changed

.ci/run-elasticsearch.sh

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
#!/usr/bin/env bash
2+
#
3+
# Launch one or more Elasticsearch nodes via the Docker image,
4+
# to form a cluster suitable for running the REST API tests.
5+
#
6+
# Export the ELASTICSEARCH_VERSION variable, eg. 'elasticsearch:8.0.0-SNAPSHOT'.
7+
8+
if [[ -z "$ELASTICSEARCH_VERSION" ]]; then
9+
echo -e "\033[31;1mERROR:\033[0m Required environment variable [ELASTICSEARCH_VERSION] not set\033[0m"
10+
exit 1
11+
fi
12+
13+
set -euxo pipefail
14+
15+
moniker=$(echo "$ELASTICSEARCH_VERSION" | tr -C "[:alnum:]" '-')
16+
suffix=rest-test
17+
18+
NODE_NAME=${NODE_NAME-${moniker}node1}
19+
MASTER_NODE_NAME=${MASTER_NODE_NAME-${NODE_NAME}}
20+
CLUSTER_NAME=${CLUSTER_NAME-${moniker}${suffix}}
21+
HTTP_PORT=${HTTP_PORT-9200}
22+
23+
ELASTIC_PASSWORD=${ELASTIC_PASSWORD-changeme}
24+
SSL_CERT=${SSL_CERT-"$PWD/certs/testnode.crt"}
25+
SSL_KEY=${SSL_KEY-"$PWD/certs/testnode.key"}
26+
SSL_CA=${SSL_CA-"$PWD/certs/ca.crt"}
27+
28+
DETACH=${DETACH-false}
29+
CLEANUP=${CLEANUP-false}
30+
31+
volume_name=${NODE_NAME}-${suffix}-data
32+
network_default=${moniker}${suffix}
33+
NETWORK_NAME=${NETWORK_NAME-"$network_default"}
34+
35+
set +x
36+
37+
function cleanup_volume {
38+
if [[ "$(docker volume ls -q -f name=$1)" ]]; then
39+
echo -e "\033[34;1mINFO:\033[0m Removing volume $1\033[0m"
40+
(docker volume rm "$1") || true
41+
fi
42+
}
43+
function cleanup_node {
44+
if [[ "$(docker ps -q -f name=$1)" ]]; then
45+
echo -e "\033[34;1mINFO:\033[0m Removing container $1\033[0m"
46+
(docker container rm --force --volumes "$1") || true
47+
cleanup_volume "$1-${suffix}-data"
48+
fi
49+
}
50+
function cleanup_network {
51+
if [[ "$(docker network ls -q -f name=$1)" ]]; then
52+
echo -e "\033[34;1mINFO:\033[0m Removing network $1\033[0m"
53+
(docker network rm "$1") || true
54+
fi
55+
}
56+
57+
function cleanup {
58+
if [[ "$DETACH" != "true" ]] || [[ "$1" == "1" ]]; then
59+
echo -e "\033[34;1mINFO:\033[0m clean the node and volume on startup (1) OR on exit if not detached\033[0m"
60+
cleanup_node "$NODE_NAME"
61+
fi
62+
if [[ "$DETACH" != "true" ]]; then
63+
echo -e "\033[34;1mINFO:\033[0m clean the network if not detached (start and exit)\033[0m"
64+
cleanup_network "$NETWORK_NAME"
65+
fi
66+
};
67+
trap "cleanup 0" EXIT
68+
69+
if [[ "$CLEANUP" == "true" ]]; then
70+
trap - EXIT
71+
if [[ -z "$(docker network ls -q -f name=${NETWORK_NAME})" ]]; then
72+
echo -e "\033[34;1mINFO:\033[0m $NETWORK_NAME is already deleted\033[0m"
73+
exit 0
74+
fi
75+
containers=$(docker network inspect -f '{{ range $key, $value := .Containers }}{{ printf "%s\n" .Name}}{{ end }}' ${NETWORK_NAME})
76+
while read -r container; do
77+
cleanup_node "$container"
78+
done <<< "$containers"
79+
cleanup_network "$NETWORK_NAME"
80+
echo -e "\033[32;1mSUCCESS:\033[0m Cleaned up and exiting\033[0m"
81+
exit 0
82+
fi
83+
84+
echo -e "\033[34;1mINFO:\033[0m Making sure previous run leftover infrastructure is removed \033[0m"
85+
cleanup 1
86+
87+
echo -e "\033[34;1mINFO:\033[0m Creating network $NETWORK_NAME if it does not exist already \033[0m"
88+
docker network inspect "$NETWORK_NAME" > /dev/null 2>&1 || docker network create "$NETWORK_NAME"
89+
90+
environment=($(cat <<-END
91+
--env node.name=$NODE_NAME
92+
--env cluster.name=$CLUSTER_NAME
93+
--env cluster.initial_master_nodes=$MASTER_NODE_NAME
94+
--env discovery.seed_hosts=$MASTER_NODE_NAME
95+
--env cluster.routing.allocation.disk.threshold_enabled=false
96+
--env bootstrap.memory_lock=true
97+
--env node.attr.testattr=test
98+
--env path.repo=/tmp
99+
--env repositories.url.allowed_urls=http://snapshot.test*
100+
END
101+
))
102+
103+
volumes=($(cat <<-END
104+
--volume $volume_name:/usr/share/elasticsearch/data
105+
END
106+
))
107+
108+
if [[ "$ELASTICSEARCH_VERSION" != *oss* ]]; then
109+
environment+=($(cat <<-END
110+
--env ELASTIC_PASSWORD=$ELASTIC_PASSWORD
111+
--env xpack.license.self_generated.type=trial
112+
--env xpack.security.enabled=true
113+
--env xpack.security.http.ssl.enabled=true
114+
--env xpack.security.http.ssl.verification_mode=certificate
115+
--env xpack.security.http.ssl.key=certs/testnode.key
116+
--env xpack.security.http.ssl.certificate=certs/testnode.crt
117+
--env xpack.security.http.ssl.certificate_authorities=certs/ca.crt
118+
--env xpack.security.transport.ssl.enabled=true
119+
--env xpack.security.transport.ssl.key=certs/testnode.key
120+
--env xpack.security.transport.ssl.certificate=certs/testnode.crt
121+
--env xpack.security.transport.ssl.certificate_authorities=certs/ca.crt
122+
END
123+
))
124+
volumes+=($(cat <<-END
125+
--volume $SSL_CERT:/usr/share/elasticsearch/config/certs/testnode.crt
126+
--volume $SSL_KEY:/usr/share/elasticsearch/config/certs/testnode.key
127+
--volume $SSL_CA:/usr/share/elasticsearch/config/certs/ca.crt
128+
END
129+
))
130+
fi
131+
132+
url="http://$NODE_NAME"
133+
if [[ "$ELASTICSEARCH_VERSION" != *oss* ]]; then
134+
url="https://elastic:$ELASTIC_PASSWORD@$NODE_NAME"
135+
fi
136+
137+
echo -e "\033[34;1mINFO:\033[0m Starting container $NODE_NAME \033[0m"
138+
set -x
139+
docker run \
140+
--name "$NODE_NAME" \
141+
--network "$NETWORK_NAME" \
142+
--env ES_JAVA_OPTS=-"Xms1g -Xmx1g" \
143+
"${environment[@]}" \
144+
"${volumes[@]}" \
145+
--publish "$HTTP_PORT":9200 \
146+
--ulimit nofile=65536:65536 \
147+
--ulimit memlock=-1:-1 \
148+
--detach="$DETACH" \
149+
--health-cmd="curl --silent --insecure --fail $url:9200/_cluster/health || exit 1" \
150+
--health-interval=2s \
151+
--health-retries=20 \
152+
--health-timeout=2s \
153+
--rm \
154+
docker.elastic.co/elasticsearch/"$ELASTICSEARCH_VERSION";
155+
set +x
156+
157+
if [[ "$DETACH" == "true" ]]; then
158+
until [[ "$(docker inspect -f "{{.State.Health.Status}}" ${NODE_NAME})" != "starting" ]]; do
159+
sleep 2;
160+
echo ""
161+
echo -e "\033[34;1mINFO:\033[0m waiting for node $NODE_NAME to be up\033[0m"
162+
done;
163+
# Always show the node getting started logs, this is very useful both on CI as well as while developing
164+
docker logs "$NODE_NAME"
165+
if [[ "$(docker inspect -f "{{.State.Health.Status}}" ${NODE_NAME})" != "healthy" ]]; then
166+
cleanup 1
167+
echo
168+
echo -e "\033[31;1mERROR:\033[0m Failed to start ${ELASTICSEARCH_VERSION} in detached mode beyond health checks\033[0m"
169+
echo -e "\033[31;1mERROR:\033[0m dumped the docker log before shutting the node down\033[0m"
170+
exit 1
171+
else
172+
echo
173+
echo -e "\033[32;1mSUCCESS:\033[0m Detached and healthy: ${NODE_NAME} on docker network: ${NETWORK_NAME}\033[0m"
174+
echo -e "\033[32;1mSUCCESS:\033[0m Running on: ${url/$NODE_NAME/localhost}:${HTTP_PORT}\033[0m"
175+
exit 0
176+
fi
177+
fi

.ci/run-tests

Lines changed: 20 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#
99
# - $ELASTICSEARCH_VERSION
1010
# - $NODE_JS_VERSION
11+
# - $TEST_SUITE
1112
#
1213

1314
set -eo pipefail
@@ -18,93 +19,41 @@ export CODECOV_TOKEN=$(vault read -field=token secret/clients-ci/elasticsearch-j
1819
unset VAULT_ROLE_ID VAULT_SECRET_ID VAULT_TOKEN
1920
set -x
2021

21-
function cleanup {
22-
docker container rm --force --volumes elasticsearch-oss > /dev/null 2>&1 || true
23-
docker container rm --force --volumes elasticsearch-platinum > /dev/null 2>&1 || true
24-
docker container rm --force --volumes elasticsearch-js-oss > /dev/null 2>&1 || true
25-
docker container rm --force --volumes elasticsearch-js-platinum > /dev/null 2>&1 || true
26-
docker network rm esnet-oss > /dev/null
27-
docker network rm esnet-platinum > /dev/null
28-
}
29-
30-
trap cleanup EXIT
31-
32-
# create network and volume
33-
docker network create esnet-oss
34-
docker network create esnet-platinum
35-
36-
# create client image
3722
docker build \
3823
--file .ci/Dockerfile \
3924
--tag elastic/elasticsearch-js \
4025
--build-arg NODE_JS_VERSION=${NODE_JS_VERSION} \
4126
.
4227

43-
# run elasticsearch oss
44-
docker run \
45-
--rm \
46-
--env "node.attr.testattr=test" \
47-
--env "path.repo=/tmp" \
48-
--env "repositories.url.allowed_urls=http://snapshot.*" \
49-
--env "discovery.type=single-node" \
50-
--network=esnet-oss \
51-
--name=elasticsearch-oss \
52-
--detach \
53-
docker.elastic.co/elasticsearch/elasticsearch-oss:${ELASTICSEARCH_VERSION}
54-
55-
# run elasticsearch platinum
28+
NODE_NAME="es1"
5629
repo=$(pwd)
5730
testnodecrt="/.ci/certs/testnode.crt"
5831
testnodekey="/.ci/certs/testnode.key"
5932
cacrt="/.ci/certs/ca.crt"
6033

61-
docker run \
62-
--rm \
63-
--env "node.attr.testattr=test" \
64-
--env "path.repo=/tmp" \
65-
--env "repositories.url.allowed_urls=http://snapshot.*" \
66-
--env "discovery.type=single-node" \
67-
--env "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
68-
--env "ELASTIC_PASSWORD=changeme" \
69-
--env "xpack.security.enabled=true" \
70-
--env "xpack.license.self_generated.type=trial" \
71-
--env "xpack.security.http.ssl.enabled=true" \
72-
--env "xpack.security.http.ssl.verification_mode=certificate" \
73-
--env "xpack.security.http.ssl.key=certs/testnode.key" \
74-
--env "xpack.security.http.ssl.certificate=certs/testnode.crt" \
75-
--env "xpack.security.http.ssl.certificate_authorities=certs/ca.crt" \
76-
--env "xpack.security.transport.ssl.enabled=true" \
77-
--env "xpack.security.transport.ssl.key=certs/testnode.key" \
78-
--env "xpack.security.transport.ssl.certificate=certs/testnode.crt" \
79-
--env "xpack.security.transport.ssl.certificate_authorities=certs/ca.crt" \
80-
--volume "$repo$testnodecrt:/usr/share/elasticsearch/config/certs/testnode.crt" \
81-
--volume "$repo$testnodekey:/usr/share/elasticsearch/config/certs/testnode.key" \
82-
--volume "$repo$cacrt:/usr/share/elasticsearch/config/certs/ca.crt" \
83-
--network=esnet-platinum \
84-
--name=elasticsearch-platinum \
85-
--detach \
86-
docker.elastic.co/elasticsearch/elasticsearch:${ELASTICSEARCH_VERSION}
34+
elasticsearch_image="elasticsearch"
35+
elasticsearch_url="https://elastic:changeme@${NODE_NAME}:9200"
36+
if [[ $TEST_SUITE != "xpack" ]]; then
37+
elasticsearch_image="elasticsearch-oss"
38+
elasticsearch_url="http://${NODE_NAME}:9200"
39+
fi
40+
41+
ELASTICSEARCH_VERSION="${elasticsearch_image}:${ELASTICSEARCH_VERSION}" \
42+
NODE_NAME="${NODE_NAME}" \
43+
NETWORK_NAME="esnet" \
44+
DETACH=true \
45+
SSL_CERT="${repo}${testnodecrt}" \
46+
SSL_KEY="${repo}${testnodekey}" \
47+
SSL_CA="${repo}${cacrt}" \
48+
bash .ci/run-elasticsearch.sh
8749

88-
# run the client unit and oss integration test
8950
docker run \
90-
--network=esnet-oss \
91-
--env "TEST_ES_SERVER=http://elasticsearch-oss:9200" \
51+
--network=esnet \
52+
--env "TEST_ES_SERVER=${elasticsearch_url}" \
9253
--env "CODECOV_TOKEN" \
9354
--volume $repo:/usr/src/app \
9455
--volume /usr/src/app/node_modules \
95-
--name elasticsearch-js-oss \
56+
--name elasticsearch-js \
9657
--rm \
9758
elastic/elasticsearch-js \
9859
npm run ci
99-
100-
# run the client platinium integration test
101-
docker run \
102-
--network=esnet-platinum \
103-
--env "TEST_ES_SERVER=https://elastic:changeme@elasticsearch-platinum:9200" \
104-
--volume $repo:/usr/src/app \
105-
--volume /usr/src/app/node_modules \
106-
--name elasticsearch-js-platinum \
107-
--rm \
108-
elastic/elasticsearch-js \
109-
npm run test:integration
110-

.ci/test-matrix.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,8 @@ NODE_JS_VERSION:
77
- 10
88
- 8
99

10+
TEST_SUITE:
11+
- oss
12+
- xpack
13+
1014
exclude: ~

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# Elasticsearch Node.js client
44

5-
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/) [![Build Status](https://clients-ci.elastic.co/job/elastic+elasticsearch-js+master/badge/icon)](https://clients-ci.elastic.co/job/elastic+elasticsearch-js+master/) [![codecov](https://codecov.io/gh/elastic/elasticsearch-js/branch/master/graph/badge.svg)](https://codecov.io/gh/elastic/elasticsearch-js) [![NPM downloads](https://img.shields.io/npm/dm/@elastic/elasticsearch.svg?style=flat)](https://www.npmjs.com/package/@elastic/elasticsearch)
5+
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](http://standardjs.com/) [![Build Status](https://clients-ci.elastic.co/buildStatus/icon?job=elastic%2Belasticsearch-js%2Bmaster)](https://clients-ci.elastic.co/view/Javascript/job/elastic+elasticsearch-js+master/) [![codecov](https://codecov.io/gh/elastic/elasticsearch-js/branch/master/graph/badge.svg)](https://codecov.io/gh/elastic/elasticsearch-js) [![NPM downloads](https://img.shields.io/npm/dm/@elastic/elasticsearch.svg?style=flat)](https://www.npmjs.com/package/@elastic/elasticsearch)
66

77
The official Node.js client for Elasticsearch.
88

0 commit comments

Comments
 (0)