From caf6ba01a8b94f743b4fd14ad6bd766034e32877 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Fri, 3 Jan 2025 10:22:12 +0000 Subject: [PATCH 01/20] [CI] Run Serverless tests --- .buildkite/pipeline.yml | 21 +++++++++++++++++ .buildkite/run-client.sh | 50 +++++++++++++++++++++++++++------------- 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index ba30184799..7bf8cbf506 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -41,3 +41,24 @@ steps: continue_on_failure: true - label: "Log Results" command: ./.buildkite/log-results.sh + - label: ":elasticsearch: Serverless :rspec: API Tests :ruby:" + agents: + provider: "gcp" + env: + RUBY_VERSION: "{{ matrix.ruby }}" + TEST_SUITE: 'api' + RUBY_SOURCE: "{{ matrix.ruby_source }}" + QUIET: false + EC_PROJECT_PREFIX: 'sl_ruby' + CLOUD_CREDENTIALS_PATH: 'secret/ci/elastic-elasticsearch-serverless-ruby/cloud-access' + matrix: + setup: + ruby: + - "3.4" + ruby_source: + - 'ruby' + adjustments: + - with: + ruby_source: 'jruby' + ruby: '9.4' + command: './.buildkite/run-serverless-tests.sh' diff --git a/.buildkite/run-client.sh b/.buildkite/run-client.sh index 01287fe78b..2d2cdb2c2e 100755 --- a/.buildkite/run-client.sh +++ b/.buildkite/run-client.sh @@ -20,20 +20,38 @@ docker build \ mkdir -p elasticsearch-api/tmp +# TODO: Use TEST_SUITE for serverless/stack + echo "--- :ruby: Running $TEST_SUITE tests" -docker run \ - -u "$(id -u)" \ - --network="${network_name}" \ - --env "TEST_ES_SERVER=${elasticsearch_url}" \ - --env "ELASTIC_PASSWORD=${elastic_password}" \ - --env "TEST_SUITE=${TEST_SUITE}" \ - --env "ELASTIC_USER=elastic" \ - --env "BUILDKITE=true" \ - --env "QUIET=${QUIET}" \ - --env "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ - --env "STACK_VERSION=${STACK_VERSION}" \ - --volume $repo:/usr/src/app \ - --name elasticsearch-ruby \ - --rm \ - elastic/elasticsearch-ruby \ - bundle exec rake es:download_artifacts test:platinum:integration test:rest_api + +if [[ "$TEST_SUITE" == "serverless" ]]; then + docker run \ + -e "ELASTIC_USER=elastic" \ + -e "BUILDKITE=true" \ + -e "QUIET=${QUIET}" \ + -e "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ + -e "ELASTICSEARCH_URL=${ELASTICSEARCH_URL}" \ + -e "API_KEY=${ES_API_SECRET_KEY}" \ + --volume $repo:/usr/src/app \ + --name elasticsearch-ruby \ + --rm \ + elastic/elasticsearch-ruby \ + bundle exec rake info +else + docker run \ + -u "$(id -u)" \ + --network="${network_name}" \ + --env "TEST_ES_SERVER=${elasticsearch_url}" \ + --env "ELASTIC_PASSWORD=${elastic_password}" \ + --env "TEST_SUITE=${TEST_SUITE}" \ + --env "ELASTIC_USER=elastic" \ + --env "BUILDKITE=true" \ + --env "QUIET=${QUIET}" \ + --env "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ + --env "STACK_VERSION=${STACK_VERSION}" \ + --volume $repo:/usr/src/app \ + --name elasticsearch-ruby \ + --rm \ + elastic/elasticsearch-ruby \ + bundle exec rake es:download_artifacts test:platinum:integration test:rest_api +fi From 28b59c88d64d543d3ee2825fb5960bd2c2a8b17d Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Fri, 3 Jan 2025 10:23:59 +0000 Subject: [PATCH 02/20] [CI] Create Serverless project --- .buildkite/create-serverless.sh | 47 +++++++++++++++++++++++++++++++++ .buildkite/pipeline.yml | 2 +- .buildkite/run-client.sh | 13 +++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 .buildkite/create-serverless.sh diff --git a/.buildkite/create-serverless.sh b/.buildkite/create-serverless.sh new file mode 100644 index 0000000000..3975748a63 --- /dev/null +++ b/.buildkite/create-serverless.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +set -euo pipefail + +export EC_REGISTER_BACKEND=appex-qa-team-cluster +export EC_ENV=qa +export EC_REGION=aws-eu-west-1 +# Using BUILDKITE_JOB_ID for the name to make it unique: +export EC_PROJECT_NAME="$EC_PROJECT_PREFIX-$BUILDKITE_JOB_ID" + +# fetch cloud creds used by qaf +CLOUD_ACCESS_KEY=$(vault read -field="$EC_ENV" $CLOUD_CREDENTIALS_PATH) +echo "{\"api_key\":{\"$EC_ENV\":\"$CLOUD_ACCESS_KEY\"}}" > "$(pwd)/cloud.json" + +run_qaf() { + cmd=$1 + docker run --rm \ + -e EC_REGISTER_BACKEND \ + -e EC_ENV \ + -e EC_REGION \ + -e EC_PROJECT_NAME \ + -e VAULT_TOKEN \ + -e BUILDKITE \ + -v "$(pwd)/cloud.json:/root/.elastic/cloud.json" \ + docker.elastic.co/appex-qa/qaf:latest \ + bash -c "$cmd" +} + +# ensure serverless instance is deleted even if script errors +cleanup() { + echo -e "--- :elasticsearch: :broom::sparkles: Tear down serverless instance $EC_PROJECT_NAME" + run_qaf 'qaf elastic-cloud projects delete' + rm -rf "$(pwd)/cloud.json" +} +trap cleanup EXIT + +echo -e "--- :elasticsearch: Start serverless instance $EC_PROJECT_NAME" + +run_qaf "qaf elastic-cloud projects create --project-type elasticsearch" +deployment=$(run_qaf "qaf elastic-cloud projects describe $EC_PROJECT_NAME --as-json --show-credentials") + +# Set ELASTICSEARCH_URL and API_KEY variables +export ES_API_SECRET_KEY=$(echo "$deployment" | jq -r '.credentials.api_key') +export ELASTICSEARCH_URL=$(echo "$deployment" | jq -r '.elasticsearch.url') + +echo -e "--- :computer: Environment variables" +echo -e "ELASTICSEARCH_URL $ELASTICSEARCH_URL" diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 7bf8cbf506..dbe8a57ca4 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -46,7 +46,7 @@ steps: provider: "gcp" env: RUBY_VERSION: "{{ matrix.ruby }}" - TEST_SUITE: 'api' + TEST_SUITE: 'serverless' RUBY_SOURCE: "{{ matrix.ruby_source }}" QUIET: false EC_PROJECT_PREFIX: 'sl_ruby' diff --git a/.buildkite/run-client.sh b/.buildkite/run-client.sh index 2d2cdb2c2e..1c9040037c 100755 --- a/.buildkite/run-client.sh +++ b/.buildkite/run-client.sh @@ -9,6 +9,19 @@ repo=`pwd` export RUBY_VERSION=${RUBY_VERSION:-3.1} export TRANSPORT_VERSION=${TRANSPORT_VERSION:-8} +if [[ "$TEST_SUITE" == "serverless" ]]; then + if [[ -z $EC_PROJECT_PREFIX ]]; then + echo -e "\033[31;1mERROR:\033[0m Required environment variable [EC_PROJECT_PREFIX] not set\033[0m" + exit 1 + fi + + # Create a serverless project: + source $script_path/create-serverless.sh + + # Make sure we remove projects: + trap cleanup EXIT +fi + echo "--- :ruby: Building Docker image" docker build \ --file $script_path/Dockerfile \ From 816c7aae48b09e8c5ed37416d7fe9f808fb2db28 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Fri, 3 Jan 2025 10:27:40 +0000 Subject: [PATCH 03/20] [CI] Updates pipeline, adds info task --- .buildkite/pipeline.yml | 12 ++--- .buildkite/run-client.sh | 70 ------------------------------ .buildkite/run-serverless-tests.sh | 43 ++++++++++++++++++ rake_tasks/serverless.rake | 24 ++++++++++ 4 files changed, 73 insertions(+), 76 deletions(-) delete mode 100755 .buildkite/run-client.sh create mode 100755 .buildkite/run-serverless-tests.sh create mode 100644 rake_tasks/serverless.rake diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index dbe8a57ca4..14c869df09 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -37,11 +37,7 @@ steps: DEBUG: true command: ./.buildkite/run-yaml-tests.sh artifact_paths: "elasticsearch-api/tmp/*" - - wait: ~ - continue_on_failure: true - - label: "Log Results" - command: ./.buildkite/log-results.sh - - label: ":elasticsearch: Serverless :rspec: API Tests :ruby:" + - label: ":elasticsearch: Serverless :rspec: API Tests :ruby: {{ matrix.ruby_source }} - {{ matrix.ruby }}" agents: provider: "gcp" env: @@ -61,4 +57,8 @@ steps: - with: ruby_source: 'jruby' ruby: '9.4' - command: './.buildkite/run-serverless-tests.sh' + command: ./.buildkite/run-serverless-tests.sh + - wait: ~ + continue_on_failure: true + - label: "Log Results" + command: ./.buildkite/log-results.sh diff --git a/.buildkite/run-client.sh b/.buildkite/run-client.sh deleted file mode 100755 index 1c9040037c..0000000000 --- a/.buildkite/run-client.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env bash -# -# Once called Elasticsearch should be up and running -# -script_path=$(dirname $(realpath -s $0)) -set -euo pipefail -repo=`pwd` - -export RUBY_VERSION=${RUBY_VERSION:-3.1} -export TRANSPORT_VERSION=${TRANSPORT_VERSION:-8} - -if [[ "$TEST_SUITE" == "serverless" ]]; then - if [[ -z $EC_PROJECT_PREFIX ]]; then - echo -e "\033[31;1mERROR:\033[0m Required environment variable [EC_PROJECT_PREFIX] not set\033[0m" - exit 1 - fi - - # Create a serverless project: - source $script_path/create-serverless.sh - - # Make sure we remove projects: - trap cleanup EXIT -fi - -echo "--- :ruby: Building Docker image" -docker build \ - --file $script_path/Dockerfile \ - --tag elastic/elasticsearch-ruby \ - --build-arg RUBY_VERSION=$RUBY_VERSION \ - --build-arg TRANSPORT_VERSION=$TRANSPORT_VERSION \ - --build-arg RUBY_SOURCE=$RUBY_SOURCE \ - . - -mkdir -p elasticsearch-api/tmp - -# TODO: Use TEST_SUITE for serverless/stack - -echo "--- :ruby: Running $TEST_SUITE tests" - -if [[ "$TEST_SUITE" == "serverless" ]]; then - docker run \ - -e "ELASTIC_USER=elastic" \ - -e "BUILDKITE=true" \ - -e "QUIET=${QUIET}" \ - -e "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ - -e "ELASTICSEARCH_URL=${ELASTICSEARCH_URL}" \ - -e "API_KEY=${ES_API_SECRET_KEY}" \ - --volume $repo:/usr/src/app \ - --name elasticsearch-ruby \ - --rm \ - elastic/elasticsearch-ruby \ - bundle exec rake info -else - docker run \ - -u "$(id -u)" \ - --network="${network_name}" \ - --env "TEST_ES_SERVER=${elasticsearch_url}" \ - --env "ELASTIC_PASSWORD=${elastic_password}" \ - --env "TEST_SUITE=${TEST_SUITE}" \ - --env "ELASTIC_USER=elastic" \ - --env "BUILDKITE=true" \ - --env "QUIET=${QUIET}" \ - --env "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ - --env "STACK_VERSION=${STACK_VERSION}" \ - --volume $repo:/usr/src/app \ - --name elasticsearch-ruby \ - --rm \ - elastic/elasticsearch-ruby \ - bundle exec rake es:download_artifacts test:platinum:integration test:rest_api -fi diff --git a/.buildkite/run-serverless-tests.sh b/.buildkite/run-serverless-tests.sh new file mode 100755 index 0000000000..c85b8bcd4a --- /dev/null +++ b/.buildkite/run-serverless-tests.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# +# Once called Elasticsearch should be up and running +# +script_path=$(dirname $(realpath -s $0)) +set -euo pipefail +repo=`pwd` + +export RUBY_VERSION=${RUBY_VERSION:-3.4} +export TRANSPORT_VERSION=${TRANSPORT_VERSION:-8} + +if [[ -z $EC_PROJECT_PREFIX ]]; then + echo -e "\033[31;1mERROR:\033[0m Required environment variable [EC_PROJECT_PREFIX] not set\033[0m" + exit 1 +fi + +# Create a serverless project: +source $script_path/create-serverless.sh +# Make sure we remove projects: +trap cleanup EXIT + +echo "--- :ruby: Building Docker image" +docker build \ + --file $script_path/Dockerfile \ + --tag elastic/elasticsearch-ruby \ + --build-arg RUBY_VERSION=$RUBY_VERSION \ + --build-arg TRANSPORT_VERSION=$TRANSPORT_VERSION \ + --build-arg RUBY_SOURCE=$RUBY_SOURCE \ + . + +echo "--- :ruby: Running $TEST_SUITE tests" +docker run \ + -e "ELASTIC_USER=elastic" \ + -e "BUILDKITE=true" \ + -e "QUIET=${QUIET}" \ + -e "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ + -e "ELASTICSEARCH_URL=${ELASTICSEARCH_URL}" \ + -e "API_KEY=${ES_API_SECRET_KEY}" \ + --volume $repo:/usr/src/app \ + --name elasticsearch-ruby \ + --rm \ + elastic/elasticsearch-ruby \ + bundle exec rake info diff --git a/rake_tasks/serverless.rake b/rake_tasks/serverless.rake new file mode 100644 index 0000000000..bec2194c39 --- /dev/null +++ b/rake_tasks/serverless.rake @@ -0,0 +1,24 @@ +# Licensed to Elasticsearch B.V. under one or more contributor +# license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright +# ownership. Elasticsearch B.V. licenses this file to you under +# the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +require 'elasticsearch' + +desc 'Server info' +task :info do + client = Elasticsearch::Client.new(url: ENV['ELASTICSEARCH_URL'], api_key: ENV['API_KEY']) + info = client.info + puts "Connected to Elasticsearch cluster #{info['cluster_name']}" +end From 5dfd8fd4f8d2cf08c77d9659b429b641f467dc77 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Fri, 3 Jan 2025 16:23:58 +0000 Subject: [PATCH 04/20] [CI] Renames ENV variables for info task --- .buildkite/run-serverless-tests.sh | 2 +- Rakefile | 7 ++++++ .../spec/yaml-test-runner/run.rb | 1 + rake_tasks/serverless.rake | 24 ------------------- 4 files changed, 9 insertions(+), 25 deletions(-) delete mode 100644 rake_tasks/serverless.rake diff --git a/.buildkite/run-serverless-tests.sh b/.buildkite/run-serverless-tests.sh index c85b8bcd4a..2bad4e5a9e 100755 --- a/.buildkite/run-serverless-tests.sh +++ b/.buildkite/run-serverless-tests.sh @@ -35,7 +35,7 @@ docker run \ -e "QUIET=${QUIET}" \ -e "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ -e "ELASTICSEARCH_URL=${ELASTICSEARCH_URL}" \ - -e "API_KEY=${ES_API_SECRET_KEY}" \ + -e "ES_API_KEY=${ES_API_SECRET_KEY}" \ --volume $repo:/usr/src/app \ --name elasticsearch-ruby \ --rm \ diff --git a/Rakefile b/Rakefile index 3d1cbacdea..37377b47d3 100644 --- a/Rakefile +++ b/Rakefile @@ -129,3 +129,10 @@ task :release do puts '-' * 80 end end + +desc 'Server info' +task :info do + client = Elasticsearch::Client.new(url: ENV['TEST_ES_SERVER'], api_key: ENV['ES_API_KEY']) + info = client.info + puts "Connected to Elasticsearch cluster #{info['cluster_name']}" +end diff --git a/elasticsearch-api/spec/yaml-test-runner/run.rb b/elasticsearch-api/spec/yaml-test-runner/run.rb index d1896627f6..3170865ea2 100644 --- a/elasticsearch-api/spec/yaml-test-runner/run.rb +++ b/elasticsearch-api/spec/yaml-test-runner/run.rb @@ -70,6 +70,7 @@ current_branch = `git rev-parse --abbrev-ref HEAD`.strip branch = current_branch.match(/[0-9]\.[0-9]+/)&.[](0) || ENV['ES_YAML_TESTS_BRANCH'] || nil Elasticsearch::Tests::Downloader::run(tests_path, branch) + runner = Elasticsearch::Tests::TestRunner.new(CLIENT, tests_path, logger) runner.add_tests_to_skip('knn_search.yml') # TODO: Extract into file runner.run(ENV['SINGLE_TEST'] || []) diff --git a/rake_tasks/serverless.rake b/rake_tasks/serverless.rake deleted file mode 100644 index bec2194c39..0000000000 --- a/rake_tasks/serverless.rake +++ /dev/null @@ -1,24 +0,0 @@ -# Licensed to Elasticsearch B.V. under one or more contributor -# license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright -# ownership. Elasticsearch B.V. licenses this file to you under -# the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -require 'elasticsearch' - -desc 'Server info' -task :info do - client = Elasticsearch::Client.new(url: ENV['ELASTICSEARCH_URL'], api_key: ENV['API_KEY']) - info = client.info - puts "Connected to Elasticsearch cluster #{info['cluster_name']}" -end From 0f68ec600300b4e6101f8f92ebaf209c27ec8bb6 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Mon, 6 Jan 2025 15:19:09 +0000 Subject: [PATCH 05/20] [CI] Fixes cloud credentials path --- .buildkite/pipeline.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 14c869df09..36dc65f6da 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -46,7 +46,7 @@ steps: RUBY_SOURCE: "{{ matrix.ruby_source }}" QUIET: false EC_PROJECT_PREFIX: 'sl_ruby' - CLOUD_CREDENTIALS_PATH: 'secret/ci/elastic-elasticsearch-serverless-ruby/cloud-access' + CLOUD_CREDENTIALS_PATH: 'secret/ci/elastic-elasticsearch-ruby/cloud-access' matrix: setup: ruby: From f31ca05b8b206229b93baf2f359e5715474d8fdb Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Thu, 9 Jan 2025 16:20:00 +0000 Subject: [PATCH 06/20] [CI] Updates using BUILDKITE env variable --- .buildkite/run-serverless-tests.sh | 3 ++- .buildkite/run-yaml-tests.sh | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) mode change 100644 => 100755 .buildkite/run-yaml-tests.sh diff --git a/.buildkite/run-serverless-tests.sh b/.buildkite/run-serverless-tests.sh index 2bad4e5a9e..b8894e7c3a 100755 --- a/.buildkite/run-serverless-tests.sh +++ b/.buildkite/run-serverless-tests.sh @@ -7,6 +7,7 @@ set -euo pipefail repo=`pwd` export RUBY_VERSION=${RUBY_VERSION:-3.4} +export BUILDKITE=${BUILDKITE:-false} export TRANSPORT_VERSION=${TRANSPORT_VERSION:-8} if [[ -z $EC_PROJECT_PREFIX ]]; then @@ -31,8 +32,8 @@ docker build \ echo "--- :ruby: Running $TEST_SUITE tests" docker run \ -e "ELASTIC_USER=elastic" \ - -e "BUILDKITE=true" \ -e "QUIET=${QUIET}" \ + -e "BUILDKITE=${BUILDKITE}" \ -e "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ -e "ELASTICSEARCH_URL=${ELASTICSEARCH_URL}" \ -e "ES_API_KEY=${ES_API_SECRET_KEY}" \ diff --git a/.buildkite/run-yaml-tests.sh b/.buildkite/run-yaml-tests.sh old mode 100644 new mode 100755 index a463972037..26834810f5 --- a/.buildkite/run-yaml-tests.sh +++ b/.buildkite/run-yaml-tests.sh @@ -13,6 +13,7 @@ echo "--- :elasticsearch: Starting Elasticsearch" DETACH=true bash $script_path/run-elasticsearch.sh export RUBY_VERSION=${RUBY_VERSION:-3.1} +export BUILDKITE=${BUILDKITE:-false} export TRANSPORT_VERSION=${TRANSPORT_VERSION:-8} echo "--- :ruby: Building Docker image" @@ -33,7 +34,7 @@ docker run \ --env "TEST_ES_SERVER=${elasticsearch_url}" \ --env "ELASTIC_PASSWORD=${elastic_password}" \ --env "ELASTIC_USER=elastic" \ - --env "BUILDKITE=true" \ + --env "BUILDKITE=${BUILDKITE}" \ --env "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ --env "STACK_VERSION=${STACK_VERSION}" \ --env "ES_YAML_TESTS_BRANCH=${ES_YAML_TESTS_BRANCH}" \ From 1e4f2ee143380a97d084a33fc1eb87e9f533af8b Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Thu, 9 Jan 2025 16:27:19 +0000 Subject: [PATCH 07/20] [Tests] Refactors initialization of the client for YAML test runner --- elasticsearch-api/spec/yaml-test-runner/run.rb | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/elasticsearch-api/spec/yaml-test-runner/run.rb b/elasticsearch-api/spec/yaml-test-runner/run.rb index 3170865ea2..24871d5311 100644 --- a/elasticsearch-api/spec/yaml-test-runner/run.rb +++ b/elasticsearch-api/spec/yaml-test-runner/run.rb @@ -49,18 +49,13 @@ transport_options = {} end -CLIENT = if ENV['ES_API_KEY'] - Elasticsearch::Client.new(host: host, api_key: ENV['ES_API_KEY'], transport_options: transport_options) - else - Elasticsearch::Client.new(host: host, transport_options: transport_options) - end +options = { host: host, transport_options: transport_options, compression: true } +options.merge!({ api_key: ENV['ES_API_KEY'] }) if ENV['ES_API_KEY'] +CLIENT = Elasticsearch::Client.new(options) tests_path = File.expand_path('./tmp', __dir__) -ruby_version = if defined? JRUBY_VERSION - "jruby-#{JRUBY_VERSION}" - else - "ruby-#{RUBY_VERSION}" - end +ruby_version = defined?(JRUBY_VERSION) ? "jruby-#{JRUBY_VERSION}" : "ruby-#{RUBY_VERSION}" + log_filename = "es-#{Elasticsearch::VERSION}-transport-#{ENV['TRANSPORT_VERSION']}-#{ruby_version}.log" logfile = File.expand_path "../../tmp/#{log_filename}", __dir__ logger = Logger.new(File.open(logfile, 'w')) From 42f5b8ebb3595eb3b80370a7cdb471b354d25249 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Fri, 10 Jan 2025 17:28:07 +0000 Subject: [PATCH 08/20] [CI] Set backend to buildkite for qaf --- .buildkite/create-serverless.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.buildkite/create-serverless.sh b/.buildkite/create-serverless.sh index 3975748a63..e4f6444f10 100644 --- a/.buildkite/create-serverless.sh +++ b/.buildkite/create-serverless.sh @@ -2,7 +2,7 @@ set -euo pipefail -export EC_REGISTER_BACKEND=appex-qa-team-cluster +export EC_REGISTER_BACKEND=buildkite export EC_ENV=qa export EC_REGION=aws-eu-west-1 # Using BUILDKITE_JOB_ID for the name to make it unique: From 69530016229f0ea92191da0eadbc0c8d5d4c01d2 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Fri, 10 Jan 2025 17:36:44 +0000 Subject: [PATCH 09/20] [CI] Updates Serverless env --- .buildkite/create-serverless.sh | 4 +++- .buildkite/pipeline.yml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.buildkite/create-serverless.sh b/.buildkite/create-serverless.sh index e4f6444f10..194708bab2 100644 --- a/.buildkite/create-serverless.sh +++ b/.buildkite/create-serverless.sh @@ -12,6 +12,8 @@ export EC_PROJECT_NAME="$EC_PROJECT_PREFIX-$BUILDKITE_JOB_ID" CLOUD_ACCESS_KEY=$(vault read -field="$EC_ENV" $CLOUD_CREDENTIALS_PATH) echo "{\"api_key\":{\"$EC_ENV\":\"$CLOUD_ACCESS_KEY\"}}" > "$(pwd)/cloud.json" +echo -e "--- Buildkite: ${BUILDKITE}" + run_qaf() { cmd=$1 docker run --rm \ @@ -20,7 +22,7 @@ run_qaf() { -e EC_REGION \ -e EC_PROJECT_NAME \ -e VAULT_TOKEN \ - -e BUILDKITE \ + -e "BUILDKITE=${BUILDKITE}" \ -v "$(pwd)/cloud.json:/root/.elastic/cloud.json" \ docker.elastic.co/appex-qa/qaf:latest \ bash -c "$cmd" diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 36dc65f6da..f32764528b 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -45,7 +45,7 @@ steps: TEST_SUITE: 'serverless' RUBY_SOURCE: "{{ matrix.ruby_source }}" QUIET: false - EC_PROJECT_PREFIX: 'sl_ruby' + EC_PROJECT_PREFIX: 'ruby' CLOUD_CREDENTIALS_PATH: 'secret/ci/elastic-elasticsearch-ruby/cloud-access' matrix: setup: From ef4721cf55fc9e1ba851300e306ce7a9168b0bb1 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Mon, 13 Jan 2025 12:44:26 +0000 Subject: [PATCH 10/20] [CI] Install qaf and run directly --- .buildkite/create-serverless.sh | 31 ++++--------------------------- .buildkite/pipeline.yml | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/.buildkite/create-serverless.sh b/.buildkite/create-serverless.sh index 194708bab2..cbc03268a5 100644 --- a/.buildkite/create-serverless.sh +++ b/.buildkite/create-serverless.sh @@ -2,44 +2,21 @@ set -euo pipefail -export EC_REGISTER_BACKEND=buildkite -export EC_ENV=qa -export EC_REGION=aws-eu-west-1 # Using BUILDKITE_JOB_ID for the name to make it unique: export EC_PROJECT_NAME="$EC_PROJECT_PREFIX-$BUILDKITE_JOB_ID" -# fetch cloud creds used by qaf -CLOUD_ACCESS_KEY=$(vault read -field="$EC_ENV" $CLOUD_CREDENTIALS_PATH) -echo "{\"api_key\":{\"$EC_ENV\":\"$CLOUD_ACCESS_KEY\"}}" > "$(pwd)/cloud.json" - -echo -e "--- Buildkite: ${BUILDKITE}" - -run_qaf() { - cmd=$1 - docker run --rm \ - -e EC_REGISTER_BACKEND \ - -e EC_ENV \ - -e EC_REGION \ - -e EC_PROJECT_NAME \ - -e VAULT_TOKEN \ - -e "BUILDKITE=${BUILDKITE}" \ - -v "$(pwd)/cloud.json:/root/.elastic/cloud.json" \ - docker.elastic.co/appex-qa/qaf:latest \ - bash -c "$cmd" -} - # ensure serverless instance is deleted even if script errors cleanup() { echo -e "--- :elasticsearch: :broom::sparkles: Tear down serverless instance $EC_PROJECT_NAME" - run_qaf 'qaf elastic-cloud projects delete' - rm -rf "$(pwd)/cloud.json" + qaf elastic-cloud projects delete + rm -rf "~/.elastic/cloud.json" } trap cleanup EXIT echo -e "--- :elasticsearch: Start serverless instance $EC_PROJECT_NAME" -run_qaf "qaf elastic-cloud projects create --project-type elasticsearch" -deployment=$(run_qaf "qaf elastic-cloud projects describe $EC_PROJECT_NAME --as-json --show-credentials") +qaf elastic-cloud projects create --project-type elasticsearch +deployment=$(qaf elastic-cloud projects describe $EC_PROJECT_NAME --as-json --show-credentials) # Set ELASTICSEARCH_URL and API_KEY variables export ES_API_SECRET_KEY=$(echo "$deployment" | jq -r '.credentials.api_key') diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index f32764528b..f34413dba2 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -39,25 +39,31 @@ steps: artifact_paths: "elasticsearch-api/tmp/*" - label: ":elasticsearch: Serverless :rspec: API Tests :ruby: {{ matrix.ruby_source }} - {{ matrix.ruby }}" agents: - provider: "gcp" + image: docker.elastic.co/appex-qa/qaf:latest env: RUBY_VERSION: "{{ matrix.ruby }}" - TEST_SUITE: 'serverless' RUBY_SOURCE: "{{ matrix.ruby_source }}" + TEST_SUITE: serverless QUIET: false - EC_PROJECT_PREFIX: 'ruby' - CLOUD_CREDENTIALS_PATH: 'secret/ci/elastic-elasticsearch-ruby/cloud-access' + EC_PROJECT_PREFIX: ruby + EC_REGISTER_BACKEND: local + EC_REGION: aws-eu-west-1 + EC_ENV: qa matrix: setup: ruby: - - "3.4" + - '3.4' ruby_source: - 'ruby' adjustments: - with: ruby_source: 'jruby' ruby: '9.4' - command: ./.buildkite/run-serverless-tests.sh + commands: + - mkdir ~/.elastic + - touch ~/.elastic/cloud.json + - echo "{\"api_key\":{\"qa\":\"$(vault read -field=qa secret/ci/elastic-elasticsearch-ruby/cloud-access)\"}}" > ~/.elastic/cloud.json + - ./.buildkite/run-serverless-tests.sh - wait: ~ continue_on_failure: true - label: "Log Results" From 6c3770fe85cb534fad70bcb8d0e8a91f06e9d7c9 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Tue, 14 Jan 2025 17:46:40 +0000 Subject: [PATCH 11/20] [CI] Separating jobs in pipeline for Serverless --- .buildkite/create-serverless.sh | 19 ++++++++------- .buildkite/pipeline.yml | 37 +++++++++++++++++++++++++----- .buildkite/run-serverless-tests.sh | 12 ++-------- 3 files changed, 42 insertions(+), 26 deletions(-) mode change 100644 => 100755 .buildkite/create-serverless.sh diff --git a/.buildkite/create-serverless.sh b/.buildkite/create-serverless.sh old mode 100644 new mode 100755 index cbc03268a5..65fd9b9e7b --- a/.buildkite/create-serverless.sh +++ b/.buildkite/create-serverless.sh @@ -2,17 +2,14 @@ set -euo pipefail -# Using BUILDKITE_JOB_ID for the name to make it unique: -export EC_PROJECT_NAME="$EC_PROJECT_PREFIX-$BUILDKITE_JOB_ID" - -# ensure serverless instance is deleted even if script errors -cleanup() { - echo -e "--- :elasticsearch: :broom::sparkles: Tear down serverless instance $EC_PROJECT_NAME" - qaf elastic-cloud projects delete - rm -rf "~/.elastic/cloud.json" -} -trap cleanup EXIT +if [[ -z $EC_PROJECT_PREFIX ]]; then + echo -e "\033[31;1mERROR:\033[0m Required environment variable [EC_PROJECT_PREFIX] not set\033[0m" + exit 1 +fi +# Using BUILDKITE_JOB_ID for the name to make it unique: +# export EC_PROJECT_NAME="$EC_PROJECT_PREFIX-$BUILDKITE_JOB_ID" +export EC_PROJECT_NAME="$EC_PROJECT_PREFIX-test" echo -e "--- :elasticsearch: Start serverless instance $EC_PROJECT_NAME" qaf elastic-cloud projects create --project-type elasticsearch @@ -21,6 +18,8 @@ deployment=$(qaf elastic-cloud projects describe $EC_PROJECT_NAME --as-json --sh # Set ELASTICSEARCH_URL and API_KEY variables export ES_API_SECRET_KEY=$(echo "$deployment" | jq -r '.credentials.api_key') export ELASTICSEARCH_URL=$(echo "$deployment" | jq -r '.elasticsearch.url') +buildkite-agent meta-data set "ES_API_SECRET_KEY" $ES_API_SECRET_KEY +buildkite-agent meta-data set "ELASTICSEARCH_URL" $ELASTICSEARCH_URL echo -e "--- :computer: Environment variables" echo -e "ELASTICSEARCH_URL $ELASTICSEARCH_URL" diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index f34413dba2..dada048185 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -37,18 +37,31 @@ steps: DEBUG: true command: ./.buildkite/run-yaml-tests.sh artifact_paths: "elasticsearch-api/tmp/*" - - label: ":elasticsearch: Serverless :rspec: API Tests :ruby: {{ matrix.ruby_source }} - {{ matrix.ruby }}" + - label: "Create :elasticsearch: Serverless projects" + key: "create-serverless" agents: image: docker.elastic.co/appex-qa/qaf:latest + env: + EC_PROJECT_PREFIX: ruby + EC_REGISTER_BACKEND: buildkite + EC_REGION: aws-eu-west-1 + EC_ENV: qa + commands: + - mkdir ~/.elastic + - touch ~/.elastic/cloud.json + - echo "{\"api_key\":{\"qa\":\"$(vault read -field=qa secret/ci/elastic-elasticsearch-ruby/cloud-access)\"}}" > ~/.elastic/cloud.json + - ./.buildkite/create-serverless.sh + - label: "Run :elasticsearch: Serverless :rspec: Tests :ruby:" + key: run-serverless-tests + depends_on: + - step: create-serverless + agents: + provider: "gcp" env: RUBY_VERSION: "{{ matrix.ruby }}" RUBY_SOURCE: "{{ matrix.ruby_source }}" TEST_SUITE: serverless QUIET: false - EC_PROJECT_PREFIX: ruby - EC_REGISTER_BACKEND: local - EC_REGION: aws-eu-west-1 - EC_ENV: qa matrix: setup: ruby: @@ -59,11 +72,23 @@ steps: - with: ruby_source: 'jruby' ruby: '9.4' + command: ./.buildkite/run-serverless-tests.sh + - label: "Destroy :elasticsearch: Serverless projects" + depends_on: + - step: run-serverless-tests + allow_failure: true + agents: + image: docker.elastic.co/appex-qa/qaf:latest + env: + EC_REGISTER_BACKEND: buildkite + EC_ENV: qa + EC_REGION: aws-eu-west-1 + EC_PROJECT_NAME: ruby-test commands: - mkdir ~/.elastic - touch ~/.elastic/cloud.json - echo "{\"api_key\":{\"qa\":\"$(vault read -field=qa secret/ci/elastic-elasticsearch-ruby/cloud-access)\"}}" > ~/.elastic/cloud.json - - ./.buildkite/run-serverless-tests.sh + - qaf elastic-cloud projects delete - wait: ~ continue_on_failure: true - label: "Log Results" diff --git a/.buildkite/run-serverless-tests.sh b/.buildkite/run-serverless-tests.sh index b8894e7c3a..00eef890e5 100755 --- a/.buildkite/run-serverless-tests.sh +++ b/.buildkite/run-serverless-tests.sh @@ -9,16 +9,8 @@ repo=`pwd` export RUBY_VERSION=${RUBY_VERSION:-3.4} export BUILDKITE=${BUILDKITE:-false} export TRANSPORT_VERSION=${TRANSPORT_VERSION:-8} - -if [[ -z $EC_PROJECT_PREFIX ]]; then - echo -e "\033[31;1mERROR:\033[0m Required environment variable [EC_PROJECT_PREFIX] not set\033[0m" - exit 1 -fi - -# Create a serverless project: -source $script_path/create-serverless.sh -# Make sure we remove projects: -trap cleanup EXIT +ELASTICSEARCH_URL=`buildkite-agent meta-data get "ELASTICSEARCH_URL"` +ES_API_SECRET_KEY=`buildkite-agent meta-data get "ES_API_SECRET_KEY"` echo "--- :ruby: Building Docker image" docker build \ From be471603e346896370d5461a69b8f63925448cea Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Tue, 14 Jan 2025 18:23:21 +0000 Subject: [PATCH 12/20] Require gem in Rakefile --- Rakefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Rakefile b/Rakefile index 37377b47d3..62a6205a2b 100644 --- a/Rakefile +++ b/Rakefile @@ -132,6 +132,8 @@ end desc 'Server info' task :info do + require 'elasticsearch' + client = Elasticsearch::Client.new(url: ENV['TEST_ES_SERVER'], api_key: ENV['ES_API_KEY']) info = client.info puts "Connected to Elasticsearch cluster #{info['cluster_name']}" From e7a392cade1dc5e8df382565089bba05a94bde4a Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Tue, 14 Jan 2025 18:37:25 +0000 Subject: [PATCH 13/20] [CI] Run Serverless tests --- .buildkite/pipeline.yml | 4 +++- .buildkite/run-serverless-tests.sh | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index dada048185..4f3689d8f4 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -51,7 +51,7 @@ steps: - touch ~/.elastic/cloud.json - echo "{\"api_key\":{\"qa\":\"$(vault read -field=qa secret/ci/elastic-elasticsearch-ruby/cloud-access)\"}}" > ~/.elastic/cloud.json - ./.buildkite/create-serverless.sh - - label: "Run :elasticsearch: Serverless :rspec: Tests :ruby:" + - label: "Run :elasticsearch: Serverless :rspec: Tests :ruby: {{ matrix.ruby_source }} {{ matrix.ruby }}" key: run-serverless-tests depends_on: - step: create-serverless @@ -61,6 +61,7 @@ steps: RUBY_VERSION: "{{ matrix.ruby }}" RUBY_SOURCE: "{{ matrix.ruby_source }}" TEST_SUITE: serverless + ES_YAML_TESTS_BRANCH: main QUIET: false matrix: setup: @@ -73,6 +74,7 @@ steps: ruby_source: 'jruby' ruby: '9.4' command: ./.buildkite/run-serverless-tests.sh + artifact_paths: "elasticsearch-api/tmp/*" - label: "Destroy :elasticsearch: Serverless projects" depends_on: - step: run-serverless-tests diff --git a/.buildkite/run-serverless-tests.sh b/.buildkite/run-serverless-tests.sh index 00eef890e5..d145d6e6d3 100755 --- a/.buildkite/run-serverless-tests.sh +++ b/.buildkite/run-serverless-tests.sh @@ -21,8 +21,11 @@ docker build \ --build-arg RUBY_SOURCE=$RUBY_SOURCE \ . +mkdir -p elasticsearch-api/tmp + echo "--- :ruby: Running $TEST_SUITE tests" docker run \ + -u "$(id -u)" \ -e "ELASTIC_USER=elastic" \ -e "QUIET=${QUIET}" \ -e "BUILDKITE=${BUILDKITE}" \ @@ -33,4 +36,4 @@ docker run \ --name elasticsearch-ruby \ --rm \ elastic/elasticsearch-ruby \ - bundle exec rake info + bundle exec bundle exec rake test:yaml From 7509f31b0d72b9fec2654d22e44fe92660bb3d5e Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Wed, 15 Jan 2025 15:15:00 +0000 Subject: [PATCH 14/20] [CI] Refactors Serverless and Stack into one script --- .buildkite/functions/wait-for-container.sh | 2 +- .buildkite/pipeline.yml | 18 ++--- .buildkite/run-yaml-tests.sh | 72 +++++++++++++------ .../spec/yaml-test-runner/run.rb | 2 +- 4 files changed, 57 insertions(+), 37 deletions(-) diff --git a/.buildkite/functions/wait-for-container.sh b/.buildkite/functions/wait-for-container.sh index 32a4498f46..89d65f4e7d 100755 --- a/.buildkite/functions/wait-for-container.sh +++ b/.buildkite/functions/wait-for-container.sh @@ -14,7 +14,7 @@ function wait_for_container { echo "" docker inspect -f "{{range .State.Health.Log}}{{.Output}}{{end}}" ${1} echo -e "\033[34;1mINFO:\033[0m waiting for node $1 to be up\033[0m" - sleep 5; + sleep 10; done; # Always show logs if the container is running, this is very useful both on CI as well as while developing diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 4f3689d8f4..044f2c71e5 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -51,29 +51,19 @@ steps: - touch ~/.elastic/cloud.json - echo "{\"api_key\":{\"qa\":\"$(vault read -field=qa secret/ci/elastic-elasticsearch-ruby/cloud-access)\"}}" > ~/.elastic/cloud.json - ./.buildkite/create-serverless.sh - - label: "Run :elasticsearch: Serverless :rspec: Tests :ruby: {{ matrix.ruby_source }} {{ matrix.ruby }}" + - label: "Run :elasticsearch: Serverless :rspec: Tests :ruby:" key: run-serverless-tests depends_on: - step: create-serverless agents: provider: "gcp" env: - RUBY_VERSION: "{{ matrix.ruby }}" - RUBY_SOURCE: "{{ matrix.ruby_source }}" + RUBY_VERSION: "3.4" + RUBY_SOURCE: "ruby" TEST_SUITE: serverless ES_YAML_TESTS_BRANCH: main QUIET: false - matrix: - setup: - ruby: - - '3.4' - ruby_source: - - 'ruby' - adjustments: - - with: - ruby_source: 'jruby' - ruby: '9.4' - command: ./.buildkite/run-serverless-tests.sh + command: ./.buildkite/run-yaml-tests.sh artifact_paths: "elasticsearch-api/tmp/*" - label: "Destroy :elasticsearch: Serverless projects" depends_on: diff --git a/.buildkite/run-yaml-tests.sh b/.buildkite/run-yaml-tests.sh index 26834810f5..1370d5a5dd 100755 --- a/.buildkite/run-yaml-tests.sh +++ b/.buildkite/run-yaml-tests.sh @@ -5,16 +5,27 @@ # Version 0.1 # script_path=$(dirname $(realpath -s $0)) -source $script_path/functions/imports.sh + +if [[ "$TEST_SUITE" == "serverless" ]]; then + # Get Elasticsearch Serverless credentials and endpoint + export TEST_ES_SERVER=`buildkite-agent meta-data get "ELASTICSEARCH_URL"` + export ES_API_SECRET_KEY=`buildkite-agent meta-data get "ES_API_SECRET_KEY"` +else + # Start Elasticsearch Stack on Docker + source $script_path/functions/imports.sh + echo "--- :elasticsearch: Starting Elasticsearch" + DETACH=true bash $script_path/run-elasticsearch.sh +fi + set -euo pipefail repo=`pwd` -echo "--- :elasticsearch: Starting Elasticsearch" -DETACH=true bash $script_path/run-elasticsearch.sh - export RUBY_VERSION=${RUBY_VERSION:-3.1} export BUILDKITE=${BUILDKITE:-false} export TRANSPORT_VERSION=${TRANSPORT_VERSION:-8} +export QUIET=${QUIET:-false} +export DEBUG=${DEBUG:-false} +export TEST_SUITE=${TEST_SUITE:-platinum} echo "--- :ruby: Building Docker image" docker build \ @@ -27,20 +38,39 @@ docker build \ mkdir -p elasticsearch-api/tmp -echo "--- :ruby: Running :yaml: tests" -docker run \ - -u "$(id -u)" \ - --network="${network_name}" \ - --env "TEST_ES_SERVER=${elasticsearch_url}" \ - --env "ELASTIC_PASSWORD=${elastic_password}" \ - --env "ELASTIC_USER=elastic" \ - --env "BUILDKITE=${BUILDKITE}" \ - --env "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ - --env "STACK_VERSION=${STACK_VERSION}" \ - --env "ES_YAML_TESTS_BRANCH=${ES_YAML_TESTS_BRANCH}" \ - --env "DEBUG=${DEBUG}" \ - --volume $repo:/usr/src/app \ - --name elasticsearch-ruby \ - --rm \ - elastic/elasticsearch-ruby \ - bundle exec rake test:yaml +if [[ "$TEST_SUITE" == "serverless" ]]; then + echo "--- :ruby: Running :yaml: tests" + docker run \ + -u "$(id -u)" \ + --env "TEST_ES_SERVER=${TEST_ES_SERVER}" \ + --env "ES_API_KEY=${ES_API_SECRET_KEY}" \ + --env "BUILDKITE=${BUILDKITE}" \ + --env "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ + --env "ES_YAML_TESTS_BRANCH=${ES_YAML_TESTS_BRANCH}" \ + --env "DEBUG=${DEBUG}" \ + --env "QUIET=${QUIET}" \ + --volume $repo:/usr/src/app \ + --name elasticsearch-ruby \ + --rm \ + elastic/elasticsearch-ruby \ + bundle exec rake test:yaml +else + echo "--- :ruby: Running stack tests" + docker run \ + -u "$(id -u)" \ + --network="${network_name}" \ + --env "TEST_ES_SERVER=${elasticsearch_url}" \ + --env "ELASTIC_PASSWORD=${elastic_password}" \ + --env "ELASTIC_USER=elastic" \ + --env "STACK_VERSION=${STACK_VERSION}" \ + --env "BUILDKITE=${BUILDKITE}" \ + --env "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ + --env "ES_YAML_TESTS_BRANCH=${ES_YAML_TESTS_BRANCH}" \ + --env "DEBUG=${DEBUG}" \ + --env "QUIET=${QUIET}" \ + --volume $repo:/usr/src/app \ + --name elasticsearch-ruby \ + --rm \ + elastic/elasticsearch-ruby \ + bundle exec rake test:yaml +fi diff --git a/elasticsearch-api/spec/yaml-test-runner/run.rb b/elasticsearch-api/spec/yaml-test-runner/run.rb index 24871d5311..760c2b09a0 100644 --- a/elasticsearch-api/spec/yaml-test-runner/run.rb +++ b/elasticsearch-api/spec/yaml-test-runner/run.rb @@ -35,7 +35,7 @@ raw_key = File.read("#{CERTS_PATH}/testnode.key") key = OpenSSL::PKey::RSA.new(raw_key) ca_file = File.expand_path("#{CERTS_PATH}/ca.crt") - host = "https://elastic:#{password}@#{uri.host}:#{uri.port}".freeze + host = "https://elastic:#{password}@#{uri.host}:#{uri.port}".freeze unless ENV['TEST_SUITE'] == 'serverless' transport_options = { ssl: { client_cert: certificate, From 940039b21b70b14512931eece5bf24c3d88ea7d4 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Thu, 16 Jan 2025 10:30:51 +0000 Subject: [PATCH 15/20] [CI] Allow Serverless tests failure while migrating --- .buildkite/pipeline.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 044f2c71e5..fc6dd40faf 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -55,6 +55,8 @@ steps: key: run-serverless-tests depends_on: - step: create-serverless + soft_fail: + - exit_status: 1 agents: provider: "gcp" env: From 10caab01cf402f3f4c81c6bd9ddcb0b74f338ae5 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Thu, 16 Jan 2025 11:17:45 +0000 Subject: [PATCH 16/20] [CI] Log Results error format --- .buildkite/log-results.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.buildkite/log-results.sh b/.buildkite/log-results.sh index 9481b6b5ce..2ee3d01b3a 100755 --- a/.buildkite/log-results.sh +++ b/.buildkite/log-results.sh @@ -14,11 +14,11 @@ for f in $files; do " - FAILED_TESTS=`grep -A1 "E,.*" $f` + FAILED_TESTS=`grep -A1 "E,.*" $f | sed 's/\#/-/g' | sed 's/^--/\n/g'` if [[ -n "$FAILED_TESTS" ]]; then - buildkite-agent annotate --append "Failures in $f - + buildkite-agent annotate --append "
" + buildkite-agent annotate --append "Failures in $f $FAILED_TESTS -" +
" fi done From 60a0975e11c3cf03f5e15c5d6c8692fca9a61f8f Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Thu, 16 Jan 2025 14:13:59 +0000 Subject: [PATCH 17/20] [CI] Make Serverless project name unique --- .buildkite/create-serverless.sh | 4 ++-- .buildkite/pipeline.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.buildkite/create-serverless.sh b/.buildkite/create-serverless.sh index 65fd9b9e7b..7b7d2c1dcf 100755 --- a/.buildkite/create-serverless.sh +++ b/.buildkite/create-serverless.sh @@ -8,8 +8,7 @@ if [[ -z $EC_PROJECT_PREFIX ]]; then fi # Using BUILDKITE_JOB_ID for the name to make it unique: -# export EC_PROJECT_NAME="$EC_PROJECT_PREFIX-$BUILDKITE_JOB_ID" -export EC_PROJECT_NAME="$EC_PROJECT_PREFIX-test" +export EC_PROJECT_NAME="$EC_PROJECT_PREFIX-$BUILDKITE_JOB_ID" echo -e "--- :elasticsearch: Start serverless instance $EC_PROJECT_NAME" qaf elastic-cloud projects create --project-type elasticsearch @@ -20,6 +19,7 @@ export ES_API_SECRET_KEY=$(echo "$deployment" | jq -r '.credentials.api_key') export ELASTICSEARCH_URL=$(echo "$deployment" | jq -r '.elasticsearch.url') buildkite-agent meta-data set "ES_API_SECRET_KEY" $ES_API_SECRET_KEY buildkite-agent meta-data set "ELASTICSEARCH_URL" $ELASTICSEARCH_URL +buildkite-agent meta-data set "EC_PROJECT_NAME" $EC_PROJECT_NAME echo -e "--- :computer: Environment variables" echo -e "ELASTICSEARCH_URL $ELASTICSEARCH_URL" diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index fc6dd40faf..5696edca12 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -77,10 +77,10 @@ steps: EC_REGISTER_BACKEND: buildkite EC_ENV: qa EC_REGION: aws-eu-west-1 - EC_PROJECT_NAME: ruby-test commands: - mkdir ~/.elastic - touch ~/.elastic/cloud.json + - export EC_PROJECT_NAME=`buildkite-agent meta-data get "EC_PROJECT_NAME"` - echo "{\"api_key\":{\"qa\":\"$(vault read -field=qa secret/ci/elastic-elasticsearch-ruby/cloud-access)\"}}" > ~/.elastic/cloud.json - qaf elastic-cloud projects delete - wait: ~ From b02ed7bbc21e06453820d2f5a818ecc5be5d01e1 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Thu, 16 Jan 2025 14:20:30 +0000 Subject: [PATCH 18/20] [Gem] Lock concurrent-ruby for JRuby 9.3 --- elasticsearch-api/elasticsearch-api.gemspec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/elasticsearch-api/elasticsearch-api.gemspec b/elasticsearch-api/elasticsearch-api.gemspec index 73f8917072..f576910773 100644 --- a/elasticsearch-api/elasticsearch-api.gemspec +++ b/elasticsearch-api/elasticsearch-api.gemspec @@ -47,7 +47,7 @@ Gem::Specification.new do |s| s.add_development_dependency 'ansi' s.add_development_dependency 'bundler' s.add_development_dependency 'elasticsearch' - s.add_development_dependency 'elasticsearch-test-runner' unless defined?(JRUBY_VERSION) && JRUBY_VERSION <= "9.4" + s.add_development_dependency 'elasticsearch-test-runner' unless defined?(JRUBY_VERSION) && JRUBY_VERSION <= '9.4' s.add_development_dependency 'minitest' s.add_development_dependency 'minitest-reporters', '>= 1.6' s.add_development_dependency 'mocha' @@ -57,6 +57,7 @@ Gem::Specification.new do |s| s.add_development_dependency 'yard' # Gems for testing integrations + s.add_development_dependency 'concurrent-ruby', '1.3.4' if defined? JRUBY_VERSION && JRUBY_VERSION < '9.4' s.add_development_dependency 'activesupport' s.add_development_dependency 'hashie' s.add_development_dependency 'jbuilder' From 6f95b84d278a9bcca37e137be509961cfab33743 Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Fri, 17 Jan 2025 09:57:11 +0000 Subject: [PATCH 19/20] [CI] Add test_suite to log filename --- .buildkite/run-yaml-tests.sh | 2 ++ elasticsearch-api/spec/yaml-test-runner/run.rb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.buildkite/run-yaml-tests.sh b/.buildkite/run-yaml-tests.sh index 1370d5a5dd..59faabb19c 100755 --- a/.buildkite/run-yaml-tests.sh +++ b/.buildkite/run-yaml-tests.sh @@ -47,6 +47,7 @@ if [[ "$TEST_SUITE" == "serverless" ]]; then --env "BUILDKITE=${BUILDKITE}" \ --env "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ --env "ES_YAML_TESTS_BRANCH=${ES_YAML_TESTS_BRANCH}" \ + --env "TEST_SUITE=${TEST_SUITE}" \ --env "DEBUG=${DEBUG}" \ --env "QUIET=${QUIET}" \ --volume $repo:/usr/src/app \ @@ -66,6 +67,7 @@ else --env "BUILDKITE=${BUILDKITE}" \ --env "TRANSPORT_VERSION=${TRANSPORT_VERSION}" \ --env "ES_YAML_TESTS_BRANCH=${ES_YAML_TESTS_BRANCH}" \ + --env "TEST_SUITE=${TEST_SUITE}" \ --env "DEBUG=${DEBUG}" \ --env "QUIET=${QUIET}" \ --volume $repo:/usr/src/app \ diff --git a/elasticsearch-api/spec/yaml-test-runner/run.rb b/elasticsearch-api/spec/yaml-test-runner/run.rb index 760c2b09a0..c0167c5ec9 100644 --- a/elasticsearch-api/spec/yaml-test-runner/run.rb +++ b/elasticsearch-api/spec/yaml-test-runner/run.rb @@ -56,7 +56,7 @@ tests_path = File.expand_path('./tmp', __dir__) ruby_version = defined?(JRUBY_VERSION) ? "jruby-#{JRUBY_VERSION}" : "ruby-#{RUBY_VERSION}" -log_filename = "es-#{Elasticsearch::VERSION}-transport-#{ENV['TRANSPORT_VERSION']}-#{ruby_version}.log" +log_filename = "es-#{Elasticsearch::VERSION}-#{ENV['TEST_SUITE']}-transport-#{ENV['TRANSPORT_VERSION']}-#{ruby_version}.log" logfile = File.expand_path "../../tmp/#{log_filename}", __dir__ logger = Logger.new(File.open(logfile, 'w')) logger.level = ENV['DEBUG'] ? Logger::DEBUG : Logger::WARN From 5a75bf6df0da0ec2bd82958a8f043128ed889fcd Mon Sep 17 00:00:00 2001 From: Fernando Briano Date: Fri, 17 Jan 2025 10:38:06 +0000 Subject: [PATCH 20/20] [CI] Adds client options for running Serverless YAML tests --- .../spec/yaml-test-runner/run.rb | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/elasticsearch-api/spec/yaml-test-runner/run.rb b/elasticsearch-api/spec/yaml-test-runner/run.rb index c0167c5ec9..701d26b801 100644 --- a/elasticsearch-api/spec/yaml-test-runner/run.rb +++ b/elasticsearch-api/spec/yaml-test-runner/run.rb @@ -29,13 +29,17 @@ password = ENV['ELASTIC_PASSWORD'] || 'changeme' uri = URI.parse(host) +def serverless? + ENV['TEST_SUITE'] == 'serverless' +end + if uri.is_a?(URI::HTTPS) raw_certificate = File.read("#{CERTS_PATH}/testnode.crt") certificate = OpenSSL::X509::Certificate.new(raw_certificate) raw_key = File.read("#{CERTS_PATH}/testnode.key") key = OpenSSL::PKey::RSA.new(raw_key) ca_file = File.expand_path("#{CERTS_PATH}/ca.crt") - host = "https://elastic:#{password}@#{uri.host}:#{uri.port}".freeze unless ENV['TEST_SUITE'] == 'serverless' + host = "https://elastic:#{password}@#{uri.host}:#{uri.port}".freeze unless serverless? transport_options = { ssl: { client_cert: certificate, @@ -49,8 +53,22 @@ transport_options = {} end -options = { host: host, transport_options: transport_options, compression: true } +options = { + host: host, + transport_options: transport_options, +} options.merge!({ api_key: ENV['ES_API_KEY'] }) if ENV['ES_API_KEY'] + +if serverless? + options.merge!( + { + retry_on_status: [409], + retry_on_failure: 10, + delay_on_retry: 60_000, + request_timeout: 120 + } + ) +end CLIENT = Elasticsearch::Client.new(options) tests_path = File.expand_path('./tmp', __dir__)