From 4d7062c7858ee06dcf511c2216d980e9ba4be6e5 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 19 Oct 2020 14:26:11 -0400 Subject: [PATCH 01/39] Initial TeamCity work --- .ci/teamcity/bootstrap.sh | 21 +++ .ci/teamcity/checks/doc_api_changes.sh | 7 + .ci/teamcity/checks/file_casing.sh | 7 + .ci/teamcity/checks/i18n.sh | 7 + .ci/teamcity/checks/licenses.sh | 7 + .ci/teamcity/checks/lock_file_symlinks.sh | 7 + .ci/teamcity/checks/telemetry.sh | 7 + .ci/teamcity/checks/test_hardening.sh | 7 + .ci/teamcity/checks/ts_projects.sh | 7 + .ci/teamcity/checks/type_check.sh | 7 + .../checks/verify_dependency_versions.sh | 7 + .ci/teamcity/checks/verify_notice.sh | 7 + .ci/teamcity/ci_stats.js | 59 ++++++ .ci/teamcity/ci_stats_complete.js | 18 ++ .ci/teamcity/default/accessibility.sh | 16 ++ .ci/teamcity/default/build.sh | 30 +++ .ci/teamcity/default/build_plugins.sh | 19 ++ .ci/teamcity/default/ci_group.sh | 17 ++ .ci/teamcity/default/firefox.sh | 18 ++ .../default/saved_object_field_metrics.sh | 16 ++ .ci/teamcity/default/security_solution.sh | 16 ++ .ci/teamcity/es_snapshots/build.sh | 46 +++++ .ci/teamcity/es_snapshots/create_manifest.js | 82 +++++++++ .ci/teamcity/es_snapshots/promote_manifest.js | 53 ++++++ .ci/teamcity/oss/accessibility.sh | 14 ++ .ci/teamcity/oss/build.sh | 23 +++ .ci/teamcity/oss/build_plugins.sh | 15 ++ .ci/teamcity/oss/ci_group.sh | 11 ++ .ci/teamcity/oss/firefox.sh | 15 ++ .ci/teamcity/oss/plugin_functional.sh | 18 ++ .ci/teamcity/setup_ci_stats.js | 33 ++++ .ci/teamcity/setup_env.sh | 51 ++++++ .ci/teamcity/setup_node.sh | 42 +++++ .ci/teamcity/tests/mocha.sh | 7 + .ci/teamcity/tests/test_hardening.sh | 7 + .ci/teamcity/tests/test_projects.sh | 7 + .../tests/xpack_list_cyclic_dependency.sh | 8 + .../tests/xpack_siem_cyclic_dependency.sh | 8 + .ci/teamcity/util.sh | 59 ++++++ .teamcity/.editorconfig | 4 + .teamcity/Kibana.png | Bin 0 -> 130914 bytes .teamcity/README.md | 150 +++++++++++++++ .teamcity/pom.xml | 128 +++++++++++++ .teamcity/settings.kts | 12 ++ .teamcity/src/Extensions.kt | 139 ++++++++++++++ .teamcity/src/builds/BaselineCi.kt | 37 ++++ .teamcity/src/builds/Checks.kt | 37 ++++ .teamcity/src/builds/FullCi.kt | 30 +++ .teamcity/src/builds/HourlyCi.kt | 33 ++++ .teamcity/src/builds/Lint.kt | 32 ++++ .teamcity/src/builds/PullRequestCi.kt | 69 +++++++ .../builds/default/DefaultAccessibility.kt | 19 ++ .teamcity/src/builds/default/DefaultBuild.kt | 56 ++++++ .../src/builds/default/DefaultCiGroup.kt | 22 +++ .../src/builds/default/DefaultCiGroups.kt | 15 ++ .../src/builds/default/DefaultFirefox.kt | 19 ++ .../builds/default/DefaultFunctionalBase.kt | 18 ++ .../default/DefaultSavedObjectFieldMetrics.kt | 28 +++ .../builds/default/DefaultSecuritySolution.kt | 19 ++ .teamcity/src/builds/es_snapshots/Build.kt | 84 +++++++++ .teamcity/src/builds/es_snapshots/Promote.kt | 87 +++++++++ .../builds/es_snapshots/PromoteImmediate.kt | 79 ++++++++ .teamcity/src/builds/es_snapshots/Verify.kt | 96 ++++++++++ .teamcity/src/builds/oss/OssAccessibility.kt | 19 ++ .teamcity/src/builds/oss/OssBuild.kt | 41 +++++ .teamcity/src/builds/oss/OssCiGroup.kt | 22 +++ .teamcity/src/builds/oss/OssCiGroups.kt | 15 ++ .teamcity/src/builds/oss/OssFirefox.kt | 19 ++ .teamcity/src/builds/oss/OssFunctionalBase.kt | 18 ++ .../src/builds/oss/OssPluginFunctional.kt | 32 ++++ .teamcity/src/builds/test/AllTests.kt | 12 ++ .teamcity/src/builds/test/ApiIntegration.kt | 23 +++ .teamcity/src/builds/test/Jest.kt | 26 +++ .teamcity/src/builds/test/JestIntegration.kt | 23 +++ .teamcity/src/builds/test/QuickTests.kt | 35 ++++ .teamcity/src/builds/test/XPackJest.kt | 27 +++ .teamcity/src/projects/EsSnapshots.kt | 55 ++++++ .teamcity/src/projects/Kibana.kt | 171 ++++++++++++++++++ .teamcity/src/templates/DefaultTemplate.kt | 25 +++ .teamcity/src/templates/KibanaTemplate.kt | 128 +++++++++++++ .teamcity/src/vcs/Elasticsearch.kt | 11 ++ .teamcity/src/vcs/Kibana.kt | 11 ++ .teamcity/tests/projects/KibanaTest.kt | 33 ++++ .../report_failure.test.ts | 6 +- .../failed_tests_reporter/report_failure.ts | 8 +- .../run_failed_tests_reporter_cli.ts | 25 ++- .../__tests__/junit_report_generation.js | 1 + .../src/mocha/junit_report_generation.js | 1 + src/dev/precommit_hook/casing_check_config.js | 3 + .../security_solution/feature_controls.ts | 9 +- 90 files changed, 2802 insertions(+), 16 deletions(-) create mode 100755 .ci/teamcity/bootstrap.sh create mode 100755 .ci/teamcity/checks/doc_api_changes.sh create mode 100755 .ci/teamcity/checks/file_casing.sh create mode 100755 .ci/teamcity/checks/i18n.sh create mode 100755 .ci/teamcity/checks/licenses.sh create mode 100755 .ci/teamcity/checks/lock_file_symlinks.sh create mode 100755 .ci/teamcity/checks/telemetry.sh create mode 100755 .ci/teamcity/checks/test_hardening.sh create mode 100755 .ci/teamcity/checks/ts_projects.sh create mode 100755 .ci/teamcity/checks/type_check.sh create mode 100755 .ci/teamcity/checks/verify_dependency_versions.sh create mode 100755 .ci/teamcity/checks/verify_notice.sh create mode 100644 .ci/teamcity/ci_stats.js create mode 100644 .ci/teamcity/ci_stats_complete.js create mode 100755 .ci/teamcity/default/accessibility.sh create mode 100755 .ci/teamcity/default/build.sh create mode 100755 .ci/teamcity/default/build_plugins.sh create mode 100755 .ci/teamcity/default/ci_group.sh create mode 100755 .ci/teamcity/default/firefox.sh create mode 100755 .ci/teamcity/default/saved_object_field_metrics.sh create mode 100755 .ci/teamcity/default/security_solution.sh create mode 100755 .ci/teamcity/es_snapshots/build.sh create mode 100644 .ci/teamcity/es_snapshots/create_manifest.js create mode 100644 .ci/teamcity/es_snapshots/promote_manifest.js create mode 100755 .ci/teamcity/oss/accessibility.sh create mode 100755 .ci/teamcity/oss/build.sh create mode 100755 .ci/teamcity/oss/build_plugins.sh create mode 100755 .ci/teamcity/oss/ci_group.sh create mode 100755 .ci/teamcity/oss/firefox.sh create mode 100755 .ci/teamcity/oss/plugin_functional.sh create mode 100644 .ci/teamcity/setup_ci_stats.js create mode 100755 .ci/teamcity/setup_env.sh create mode 100755 .ci/teamcity/setup_node.sh create mode 100755 .ci/teamcity/tests/mocha.sh create mode 100755 .ci/teamcity/tests/test_hardening.sh create mode 100755 .ci/teamcity/tests/test_projects.sh create mode 100755 .ci/teamcity/tests/xpack_list_cyclic_dependency.sh create mode 100755 .ci/teamcity/tests/xpack_siem_cyclic_dependency.sh create mode 100755 .ci/teamcity/util.sh create mode 100644 .teamcity/.editorconfig create mode 100644 .teamcity/Kibana.png create mode 100644 .teamcity/README.md create mode 100644 .teamcity/pom.xml create mode 100644 .teamcity/settings.kts create mode 100644 .teamcity/src/Extensions.kt create mode 100644 .teamcity/src/builds/BaselineCi.kt create mode 100644 .teamcity/src/builds/Checks.kt create mode 100644 .teamcity/src/builds/FullCi.kt create mode 100644 .teamcity/src/builds/HourlyCi.kt create mode 100644 .teamcity/src/builds/Lint.kt create mode 100644 .teamcity/src/builds/PullRequestCi.kt create mode 100755 .teamcity/src/builds/default/DefaultAccessibility.kt create mode 100644 .teamcity/src/builds/default/DefaultBuild.kt create mode 100755 .teamcity/src/builds/default/DefaultCiGroup.kt create mode 100644 .teamcity/src/builds/default/DefaultCiGroups.kt create mode 100755 .teamcity/src/builds/default/DefaultFirefox.kt create mode 100644 .teamcity/src/builds/default/DefaultFunctionalBase.kt create mode 100644 .teamcity/src/builds/default/DefaultSavedObjectFieldMetrics.kt create mode 100755 .teamcity/src/builds/default/DefaultSecuritySolution.kt create mode 100644 .teamcity/src/builds/es_snapshots/Build.kt create mode 100644 .teamcity/src/builds/es_snapshots/Promote.kt create mode 100644 .teamcity/src/builds/es_snapshots/PromoteImmediate.kt create mode 100644 .teamcity/src/builds/es_snapshots/Verify.kt create mode 100644 .teamcity/src/builds/oss/OssAccessibility.kt create mode 100644 .teamcity/src/builds/oss/OssBuild.kt create mode 100644 .teamcity/src/builds/oss/OssCiGroup.kt create mode 100644 .teamcity/src/builds/oss/OssCiGroups.kt create mode 100644 .teamcity/src/builds/oss/OssFirefox.kt create mode 100644 .teamcity/src/builds/oss/OssFunctionalBase.kt create mode 100644 .teamcity/src/builds/oss/OssPluginFunctional.kt create mode 100644 .teamcity/src/builds/test/AllTests.kt create mode 100644 .teamcity/src/builds/test/ApiIntegration.kt create mode 100644 .teamcity/src/builds/test/Jest.kt create mode 100644 .teamcity/src/builds/test/JestIntegration.kt create mode 100644 .teamcity/src/builds/test/QuickTests.kt create mode 100644 .teamcity/src/builds/test/XPackJest.kt create mode 100644 .teamcity/src/projects/EsSnapshots.kt create mode 100644 .teamcity/src/projects/Kibana.kt create mode 100644 .teamcity/src/templates/DefaultTemplate.kt create mode 100644 .teamcity/src/templates/KibanaTemplate.kt create mode 100644 .teamcity/src/vcs/Elasticsearch.kt create mode 100644 .teamcity/src/vcs/Kibana.kt create mode 100644 .teamcity/tests/projects/KibanaTest.kt diff --git a/.ci/teamcity/bootstrap.sh b/.ci/teamcity/bootstrap.sh new file mode 100755 index 0000000000000..adb884ca064ba --- /dev/null +++ b/.ci/teamcity/bootstrap.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/util.sh" + +tc_start_block "Bootstrap" + +tc_start_block "yarn install and kbn bootstrap" +verify_no_git_changes yarn kbn bootstrap --prefer-offline +tc_end_block "yarn install and kbn bootstrap" + +tc_start_block "build kbn-pm" +verify_no_git_changes yarn kbn run build -i @kbn/pm +tc_end_block "build kbn-pm" + +tc_start_block "build plugin list docs" +verify_no_git_changes node scripts/build_plugin_list_docs +tc_end_block "build plugin list docs" + +tc_end_block "Bootstrap" diff --git a/.ci/teamcity/checks/doc_api_changes.sh b/.ci/teamcity/checks/doc_api_changes.sh new file mode 100755 index 0000000000000..821647a39441c --- /dev/null +++ b/.ci/teamcity/checks/doc_api_changes.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:checkDocApiChanges diff --git a/.ci/teamcity/checks/file_casing.sh b/.ci/teamcity/checks/file_casing.sh new file mode 100755 index 0000000000000..66578a4970fec --- /dev/null +++ b/.ci/teamcity/checks/file_casing.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:checkFileCasing diff --git a/.ci/teamcity/checks/i18n.sh b/.ci/teamcity/checks/i18n.sh new file mode 100755 index 0000000000000..f269816cf6b95 --- /dev/null +++ b/.ci/teamcity/checks/i18n.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:i18nCheck diff --git a/.ci/teamcity/checks/licenses.sh b/.ci/teamcity/checks/licenses.sh new file mode 100755 index 0000000000000..2baca87074630 --- /dev/null +++ b/.ci/teamcity/checks/licenses.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:licenses diff --git a/.ci/teamcity/checks/lock_file_symlinks.sh b/.ci/teamcity/checks/lock_file_symlinks.sh new file mode 100755 index 0000000000000..1de8699012a96 --- /dev/null +++ b/.ci/teamcity/checks/lock_file_symlinks.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:checkLockfileSymlinks diff --git a/.ci/teamcity/checks/telemetry.sh b/.ci/teamcity/checks/telemetry.sh new file mode 100755 index 0000000000000..6413584d2057d --- /dev/null +++ b/.ci/teamcity/checks/telemetry.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:telemetryCheck diff --git a/.ci/teamcity/checks/test_hardening.sh b/.ci/teamcity/checks/test_hardening.sh new file mode 100755 index 0000000000000..21ee68e5ade70 --- /dev/null +++ b/.ci/teamcity/checks/test_hardening.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:test_hardening diff --git a/.ci/teamcity/checks/ts_projects.sh b/.ci/teamcity/checks/ts_projects.sh new file mode 100755 index 0000000000000..8afc195fee555 --- /dev/null +++ b/.ci/teamcity/checks/ts_projects.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:checkTsProjects diff --git a/.ci/teamcity/checks/type_check.sh b/.ci/teamcity/checks/type_check.sh new file mode 100755 index 0000000000000..da8ae3373d976 --- /dev/null +++ b/.ci/teamcity/checks/type_check.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:typeCheck diff --git a/.ci/teamcity/checks/verify_dependency_versions.sh b/.ci/teamcity/checks/verify_dependency_versions.sh new file mode 100755 index 0000000000000..4c2ddf5ce8612 --- /dev/null +++ b/.ci/teamcity/checks/verify_dependency_versions.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:verifyDependencyVersions diff --git a/.ci/teamcity/checks/verify_notice.sh b/.ci/teamcity/checks/verify_notice.sh new file mode 100755 index 0000000000000..8571e0bbceb13 --- /dev/null +++ b/.ci/teamcity/checks/verify_notice.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:verifyNotice diff --git a/.ci/teamcity/ci_stats.js b/.ci/teamcity/ci_stats.js new file mode 100644 index 0000000000000..2953661eca1fd --- /dev/null +++ b/.ci/teamcity/ci_stats.js @@ -0,0 +1,59 @@ +const https = require('https'); +const token = process.env.CI_STATS_TOKEN; +const host = process.env.CI_STATS_HOST; + +const request = (url, options, data = null) => { + const httpOptions = { + ...options, + headers: { + ...(options.headers || {}), + Authorization: `token ${token}`, + }, + }; + + return new Promise((resolve, reject) => { + console.log(`Calling https://${host}${url}`); + + const req = https.request(`https://${host}${url}`, httpOptions, (res) => { + if (res.statusCode < 200 || res.statusCode >= 300) { + return reject(new Error(`Status Code: ${res.statusCode}`)); + } + + const data = []; + res.on('data', (d) => { + data.push(d); + }) + + res.on('end', () => { + try { + let resp = Buffer.concat(data).toString(); + + try { + if (resp.trim()) { + resp = JSON.parse(resp); + } + } catch (ex) { + console.error(ex); + } + + resolve(resp); + } catch (ex) { + reject(ex); + } + }); + }) + + req.on('error', reject); + + if (data) { + req.write(JSON.stringify(data)); + } + + req.end(); + }); +} + +module.exports = { + get: (url) => request(url, { method: 'GET' }), + post: (url, data) => request(url, { method: 'POST' }, data), +} diff --git a/.ci/teamcity/ci_stats_complete.js b/.ci/teamcity/ci_stats_complete.js new file mode 100644 index 0000000000000..0df9329167ff6 --- /dev/null +++ b/.ci/teamcity/ci_stats_complete.js @@ -0,0 +1,18 @@ +const ciStats = require('./ci_stats'); + +// This might be better as an API call in the future. +// Instead, it relies on a separate step setting the BUILD_STATUS env var. BUILD_STATUS is not something provided by TeamCity. +const BUILD_STATUS = process.env.BUILD_STATUS === 'SUCCESS' ? 'SUCCESS' : 'FAILURE'; + +(async () => { + try { + if (process.env.CI_STATS_BUILD_ID) { + await ciStats.post(`/v1/build/_complete?id=${process.env.CI_STATS_BUILD_ID}`, { + result: BUILD_STATUS, + }); + } + } catch (ex) { + console.error(ex); + process.exit(1); + } +})(); diff --git a/.ci/teamcity/default/accessibility.sh b/.ci/teamcity/default/accessibility.sh new file mode 100755 index 0000000000000..2868db9d067b8 --- /dev/null +++ b/.ci/teamcity/default/accessibility.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +export JOB=kibana-default-accessibility +export KIBANA_INSTALL_DIR="$PARENT_DIR/build/kibana-build-default" + +cd "$XPACK_DIR" + +checks-reporter-with-killswitch "X-Pack accessibility tests" \ + node scripts/functional_tests \ + --debug --bail \ + --kibana-install-dir "$KIBANA_INSTALL_DIR" \ + --config test/accessibility/config.ts diff --git a/.ci/teamcity/default/build.sh b/.ci/teamcity/default/build.sh new file mode 100755 index 0000000000000..269c300f43233 --- /dev/null +++ b/.ci/teamcity/default/build.sh @@ -0,0 +1,30 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +tc_start_block "Build Platform Plugins" +node scripts/build_kibana_platform_plugins \ + --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ + --scan-dir "$XPACK_DIR/test/plugin_functional/plugins" \ + --scan-dir "$XPACK_DIR/test/functional_with_es_ssl/fixtures/plugins" \ + --scan-dir "$XPACK_DIR/test/alerting_api_integration/plugins" \ + --scan-dir "$XPACK_DIR/test/plugin_api_integration/plugins" \ + --scan-dir "$XPACK_DIR/test/plugin_api_perf/plugins" \ + --scan-dir "$XPACK_DIR/test/licensing_plugin/plugins" \ + --verbose +tc_end_block "Build Platform Plugins" + +export KBN_NP_PLUGINS_BUILT=true + +tc_start_block "Build Default Distribution" + +cd "$KIBANA_DIR" +node scripts/build --debug --no-oss +linuxBuild="$(find "$KIBANA_DIR/target" -name 'kibana-*-linux-x86_64.tar.gz')" +installDir="$KIBANA_DIR/install/kibana" +mkdir -p "$installDir" +tar -xzf "$linuxBuild" -C "$installDir" --strip=1 + +tc_end_block "Build Default Distribution" diff --git a/.ci/teamcity/default/build_plugins.sh b/.ci/teamcity/default/build_plugins.sh new file mode 100755 index 0000000000000..19203ee3a5b10 --- /dev/null +++ b/.ci/teamcity/default/build_plugins.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +tc_start_block "Build Platform Plugins" +node scripts/build_kibana_platform_plugins \ + --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ + --scan-dir "$XPACK_DIR/test/plugin_functional/plugins" \ + --scan-dir "$XPACK_DIR/test/functional_with_es_ssl/fixtures/plugins" \ + --scan-dir "$XPACK_DIR/test/alerting_api_integration/plugins" \ + --scan-dir "$XPACK_DIR/test/plugin_api_integration/plugins" \ + --scan-dir "$XPACK_DIR/test/plugin_api_perf/plugins" \ + --scan-dir "$XPACK_DIR/test/licensing_plugin/plugins" \ + --verbose +tc_end_block "Build Platform Plugins" + +tc_set_env KBN_NP_PLUGINS_BUILT true diff --git a/.ci/teamcity/default/ci_group.sh b/.ci/teamcity/default/ci_group.sh new file mode 100755 index 0000000000000..26c2c563210ed --- /dev/null +++ b/.ci/teamcity/default/ci_group.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +export CI_GROUP="$1" +export JOB=kibana-default-ciGroup${CI_GROUP} +export KIBANA_INSTALL_DIR="$PARENT_DIR/build/kibana-build-default" + +cd "$XPACK_DIR" + +checks-reporter-with-killswitch "Default Distro Chrome Functional tests / Group ${CI_GROUP}" \ + node scripts/functional_tests \ + --debug --bail \ + --kibana-install-dir "$KIBANA_INSTALL_DIR" \ + --include-tag "ciGroup$CI_GROUP" diff --git a/.ci/teamcity/default/firefox.sh b/.ci/teamcity/default/firefox.sh new file mode 100755 index 0000000000000..5922a72bd5e85 --- /dev/null +++ b/.ci/teamcity/default/firefox.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +export JOB=kibana-default-firefoxSmoke +export KIBANA_INSTALL_DIR="$PARENT_DIR/build/kibana-build-default" + +cd "$XPACK_DIR" + +checks-reporter-with-killswitch "X-Pack firefox smoke test" \ + node scripts/functional_tests \ + --debug --bail \ + --kibana-install-dir "$KIBANA_INSTALL_DIR" \ + --include-tag "includeFirefox" \ + --config test/functional/config.firefox.js \ + --config test/functional_embedded/config.firefox.ts diff --git a/.ci/teamcity/default/saved_object_field_metrics.sh b/.ci/teamcity/default/saved_object_field_metrics.sh new file mode 100755 index 0000000000000..f5b57ce3b06eb --- /dev/null +++ b/.ci/teamcity/default/saved_object_field_metrics.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +export JOB=kibana-default-savedObjectFieldMetrics +export KIBANA_INSTALL_DIR="$PARENT_DIR/build/kibana-build-default" + +cd "$XPACK_DIR" + +checks-reporter-with-killswitch "Capture Kibana Saved Objects field count metrics" \ + node scripts/functional_tests \ + --debug --bail \ + --kibana-install-dir "$KIBANA_INSTALL_DIR" \ + --config test/saved_objects_field_count/config.ts diff --git a/.ci/teamcity/default/security_solution.sh b/.ci/teamcity/default/security_solution.sh new file mode 100755 index 0000000000000..46048f6c82d52 --- /dev/null +++ b/.ci/teamcity/default/security_solution.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +export JOB=kibana-default-securitySolution +export KIBANA_INSTALL_DIR="$PARENT_DIR/build/kibana-build-default" + +cd "$XPACK_DIR" + +checks-reporter-with-killswitch "Security Solution Cypress Tests" \ + node scripts/functional_tests \ + --debug --bail \ + --kibana-install-dir "$KIBANA_INSTALL_DIR" \ + --config test/security_solution_cypress/cli_config.ts diff --git a/.ci/teamcity/es_snapshots/build.sh b/.ci/teamcity/es_snapshots/build.sh new file mode 100755 index 0000000000000..211de58b757a5 --- /dev/null +++ b/.ci/teamcity/es_snapshots/build.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +cd .. +destination="$(pwd)/es-build" +mkdir -p "$destination" + +cd elasticsearch + +# These turn off automation in the Elasticsearch repo +export BUILD_NUMBER="" +export JENKINS_URL="" +export BUILD_URL="" +export JOB_NAME="" +export NODE_NAME="" + +# TODO ES_BUILD_JAVA = openjdk14 -- .ci/java-versions.properties +export ES_BUILD_JAVA="openjdk14" +export PATH="$HOME/.java/$ES_BUILD_JAVA/bin:$PATH" +export JAVA_HOME="$HOME/.java/$ES_BUILD_JAVA" + +tc_start_block "Build Elasticsearch" +./gradlew -Dbuild.docker=true assemble --parallel +tc_end_block "Build Elasticsearch" + +# mkdir -p ${destination} + +tc_start_block "Create distribution archives" +find distribution -type f \( -name 'elasticsearch-*-*-*-*.tar.gz' -o -name 'elasticsearch-*-*-*-*.zip' \) -not -path '*no-jdk*' -not -path '*build-context*' -exec cp {} "$destination" \; +tc_end_block "Create distribution archives" + +ls -alh "$destination" + +tc_start_block "Create docker image archives" +docker images "docker.elastic.co/elasticsearch/elasticsearch" +docker images "docker.elastic.co/elasticsearch/elasticsearch" --format "{{.Tag}}" | xargs -n1 echo 'docker save docker.elastic.co/elasticsearch/elasticsearch:${0} | gzip > ../es-build/elasticsearch-${0}-docker-image.tar.gz' +docker images "docker.elastic.co/elasticsearch/elasticsearch" --format "{{.Tag}}" | xargs -n1 bash -c 'docker save docker.elastic.co/elasticsearch/elasticsearch:${0} | gzip > ../es-build/elasticsearch-${0}-docker-image.tar.gz' +tc_end_block "Create docker image archives" + +cd "$destination" + +find ./* -exec bash -c "shasum -a 512 {} > {}.sha512" \; +ls -alh "$destination" diff --git a/.ci/teamcity/es_snapshots/create_manifest.js b/.ci/teamcity/es_snapshots/create_manifest.js new file mode 100644 index 0000000000000..63e54987f788f --- /dev/null +++ b/.ci/teamcity/es_snapshots/create_manifest.js @@ -0,0 +1,82 @@ +const fs = require('fs'); +const { execSync } = require('child_process'); + +(async () => { + const destination = process.argv[2] || __dirname + '/test'; + + let ES_BRANCH = process.env.ELASTICSEARCH_BRANCH; + let GIT_COMMIT = process.env.ELASTICSEARCH_GIT_COMMIT; + let GIT_COMMIT_SHORT = execSync(`git rev-parse --short '${GIT_COMMIT}'`).toString().trim(); + + let VERSION = ''; + let SNAPSHOT_ID = ''; + let DESTINATION = ''; + + const now = new Date() + + // format: yyyyMMdd-HHmmss + const date = [ + now.getFullYear(), + (now.getMonth()+1).toString().padStart(2, '0'), + now.getDate().toString().padStart(2, '0'), + '-', + now.getHours().toString().padStart(2, '0'), + now.getMinutes().toString().padStart(2, '0'), + now.getSeconds().toString().padStart(2, '0'), + ].join('') + + try { + const files = fs.readdirSync(destination); + const manifestEntries = files + .filter(f => !f.match(/.sha512$/)) + .filter(f => !f.match(/.json$/)) + .map(filename => { + const parts = filename.replace("elasticsearch-oss", "oss").split("-") + + VERSION = VERSION || parts[1]; + SNAPSHOT_ID = SNAPSHOT_ID || `${date}_${GIT_COMMIT_SHORT}`; + DESTINATION = DESTINATION || `${VERSION}/archives/${SNAPSHOT_ID}`; + + return { + filename: filename, + checksum: filename + '.sha512', + url: `https://storage.googleapis.com/kibana-ci-es-snapshots-daily-teamcity/${DESTINATION}/${filename}`, + version: parts[1], + platform: parts[3], + architecture: parts[4].split('.')[0], + license: parts[0] == 'oss' ? 'oss' : 'default', + } + }); + + const manifest = { + id: SNAPSHOT_ID, + bucket: `kibana-ci-es-snapshots-daily-teamcity/${DESTINATION}`.toString(), + branch: ES_BRANCH, + sha: GIT_COMMIT, + sha_short: GIT_COMMIT_SHORT, + version: VERSION, + generated: now.toISOString(), + archives: manifestEntries, + }; + + const manifestJSON = JSON.stringify(manifest, null, 2); + fs.writeFileSync(`${destination}/manifest.json`, manifestJSON); + + execSync(` + set -euo pipefail + cd "${destination}" + gsutil -m cp -r *.* gs://kibana-ci-es-snapshots-daily-teamcity/${DESTINATION} + cp manifest.json manifest-latest.json + gsutil cp manifest-latest.json gs://kibana-ci-es-snapshots-daily-teamcity/${VERSION} + `, { shell: '/bin/bash' }); + + console.log(`##teamcity[setParameter name='env.ES_SNAPSHOT_MANIFEST' value='https://storage.googleapis.com/kibana-ci-es-snapshots-daily-teamcity/${DESTINATION}/manifest.json']`); + console.log(`##teamcity[setParameter name='env.ES_SNAPSHOT_VERSION' value='${VERSION}']`); + console.log(`##teamcity[setParameter name='env.ES_SNAPSHOT_ID' value='${SNAPSHOT_ID}']`); + + console.log(`##teamcity[buildNumber '{build.number}-${VERSION}-${SNAPSHOT_ID}']`); + } catch (ex) { + console.error(ex); + process.exit(1); + } +})(); diff --git a/.ci/teamcity/es_snapshots/promote_manifest.js b/.ci/teamcity/es_snapshots/promote_manifest.js new file mode 100644 index 0000000000000..bcc79e696d783 --- /dev/null +++ b/.ci/teamcity/es_snapshots/promote_manifest.js @@ -0,0 +1,53 @@ +const fs = require('fs'); +const { execSync } = require('child_process'); + +const BASE_BUCKET_DAILY = 'kibana-ci-es-snapshots-daily-teamcity'; +const BASE_BUCKET_PERMANENT = 'kibana-ci-es-snapshots-daily-teamcity/permanent'; + +(async () => { + try { + const MANIFEST_URL = process.argv[2]; + + if (!MANIFEST_URL) { + throw Error('Manifest URL missing'); + } + + if (!fs.existsSync('snapshot-promotion')) { + fs.mkdirSync('snapshot-promotion'); + } + process.chdir('snapshot-promotion'); + + execSync(`curl '${MANIFEST_URL}' > manifest.json`); + + const manifest = JSON.parse(fs.readFileSync('manifest.json')); + const { id, bucket, version } = manifest; + + console.log(`##teamcity[buildNumber '{build.number}-${version}-${id}']`); + + const manifestPermanent = { + ...manifest, + bucket: bucket.replace(BASE_BUCKET_DAILY, BASE_BUCKET_PERMANENT), + }; + + fs.writeFileSync('manifest-permanent.json', JSON.stringify(manifestPermanent, null, 2)); + + execSync( + ` + set -euo pipefail + + cp manifest.json manifest-latest-verified.json + gsutil cp manifest-latest-verified.json gs://${BASE_BUCKET_DAILY}/${version}/ + + rm manifest.json + cp manifest-permanent.json manifest.json + gsutil -m cp -r gs://${bucket}/* gs://${BASE_BUCKET_PERMANENT}/${version}/ + gsutil cp manifest.json gs://${BASE_BUCKET_PERMANENT}/${version}/ + + `, + { shell: '/bin/bash' } + ); + } catch (ex) { + console.error(ex); + process.exit(1); + } +})(); diff --git a/.ci/teamcity/oss/accessibility.sh b/.ci/teamcity/oss/accessibility.sh new file mode 100755 index 0000000000000..09693d7ebdc57 --- /dev/null +++ b/.ci/teamcity/oss/accessibility.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +export JOB=kibana-oss-accessibility +export KIBANA_INSTALL_DIR="$PARENT_DIR/build/kibana-build-oss" + +checks-reporter-with-killswitch "Kibana accessibility tests" \ + node scripts/functional_tests \ + --debug --bail \ + --kibana-install-dir "$KIBANA_INSTALL_DIR" \ + --config test/accessibility/config.ts diff --git a/.ci/teamcity/oss/build.sh b/.ci/teamcity/oss/build.sh new file mode 100755 index 0000000000000..0d508a5d4ec77 --- /dev/null +++ b/.ci/teamcity/oss/build.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +tc_start_block "Build Platform Plugins" +node scripts/build_kibana_platform_plugins \ + --oss \ + --filter '!alertingExample' \ + --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ + --scan-dir "$KIBANA_DIR/test/interpreter_functional/plugins" \ + --verbose +tc_end_block "Build Platform Plugins" + +export KBN_NP_PLUGINS_BUILT=true + +tc_start_block "Build OSS Distribution" +node scripts/build --debug --oss + +# Renaming the build directory to a static one, so that we can put a static one in the TeamCity artifact rules +mv build/oss/kibana-*-SNAPSHOT-linux-x86_64 build/oss/kibana-build-oss +tc_end_block "Build OSS Distribution" diff --git a/.ci/teamcity/oss/build_plugins.sh b/.ci/teamcity/oss/build_plugins.sh new file mode 100755 index 0000000000000..cc5525fcb0a09 --- /dev/null +++ b/.ci/teamcity/oss/build_plugins.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +tc_start_block "Build Platform Plugins - OSS" + +node scripts/build_kibana_platform_plugins \ + --oss \ + --filter '!alertingExample' \ + --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ + --scan-dir "$KIBANA_DIR/test/interpreter_functional/plugins" \ + --verbose +tc_end_block "Build Platform Plugins - OSS" diff --git a/.ci/teamcity/oss/ci_group.sh b/.ci/teamcity/oss/ci_group.sh new file mode 100755 index 0000000000000..bf6a80e88de98 --- /dev/null +++ b/.ci/teamcity/oss/ci_group.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +export CI_GROUP="$1" +export JOB=kibana-ciGroup${CI_GROUP} +export KIBANA_INSTALL_DIR="$PARENT_DIR/build/kibana-build-oss" + +checks-reporter-with-killswitch "Functional tests / Group ${CI_GROUP}" yarn run grunt "run:functionalTests_ciGroup${CI_GROUP}"; diff --git a/.ci/teamcity/oss/firefox.sh b/.ci/teamcity/oss/firefox.sh new file mode 100755 index 0000000000000..5e2a6c17c0052 --- /dev/null +++ b/.ci/teamcity/oss/firefox.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +export JOB=kibana-firefoxSmoke +export KIBANA_INSTALL_DIR="$PARENT_DIR/build/kibana-build-oss" + +checks-reporter-with-killswitch "Firefox smoke test" \ + node scripts/functional_tests \ + --bail --debug \ + --kibana-install-dir "$KIBANA_INSTALL_DIR" \ + --include-tag "includeFirefox" \ + --config test/functional/config.firefox.js diff --git a/.ci/teamcity/oss/plugin_functional.sh b/.ci/teamcity/oss/plugin_functional.sh new file mode 100755 index 0000000000000..41ff549945c0b --- /dev/null +++ b/.ci/teamcity/oss/plugin_functional.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +export JOB=kibana-oss-pluginFunctional +export KIBANA_INSTALL_DIR="$PARENT_DIR/build/kibana-build-oss" + +cd test/plugin_functional/plugins/kbn_sample_panel_action +if [[ ! -d "target" ]]; then + yarn build +fi +cd - + +yarn run grunt run:pluginFunctionalTestsRelease --from=source +yarn run grunt run:exampleFunctionalTestsRelease --from=source +yarn run grunt run:interpreterFunctionalTestsRelease diff --git a/.ci/teamcity/setup_ci_stats.js b/.ci/teamcity/setup_ci_stats.js new file mode 100644 index 0000000000000..6b381530d9bb7 --- /dev/null +++ b/.ci/teamcity/setup_ci_stats.js @@ -0,0 +1,33 @@ +const ciStats = require('./ci_stats'); + +(async () => { + try { + const build = await ciStats.post('/v1/build', { + jenkinsJobName: process.env.TEAMCITY_BUILDCONF_NAME, + jenkinsJobId: process.env.TEAMCITY_BUILD_ID, + jenkinsUrl: process.env.TEAMCITY_BUILD_URL, + prId: process.env.GITHUB_PR_NUMBER || null, + }); + + const config = { + apiUrl: `https://${process.env.CI_STATS_HOST}`, + apiToken: process.env.CI_STATS_TOKEN, + buildId: build.id, + }; + + const configJson = JSON.stringify(config); + process.env.KIBANA_CI_STATS_CONFIG = configJson; + console.log(`\n##teamcity[setParameter name='env.KIBANA_CI_STATS_CONFIG' display='hidden' password='true' value='${configJson}']\n`); + console.log(`\n##teamcity[setParameter name='env.CI_STATS_BUILD_ID' value='${build.id}']\n`); + + await ciStats.post(`/v1/git_info?buildId=${build.id}`, { + branch: process.env.GIT_BRANCH.replace(/^(refs\/heads\/|origin\/)/, ''), + commit: process.env.GIT_COMMIT, + targetBranch: process.env.GITHUB_PR_TARGET_BRANCH || null, + mergeBase: null, // TODO + }); + } catch (ex) { + console.error(ex); + process.exit(1); + } +})(); diff --git a/.ci/teamcity/setup_env.sh b/.ci/teamcity/setup_env.sh new file mode 100755 index 0000000000000..85c420e4a5ec2 --- /dev/null +++ b/.ci/teamcity/setup_env.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/util.sh" + +tc_set_env KIBANA_DIR "$(cd "$(dirname "$0")/../.." && pwd)" +tc_set_env XPACK_DIR "$KIBANA_DIR/x-pack" + +tc_set_env CACHE_DIR "$HOME/.kibana" +tc_set_env PARENT_DIR "$(cd "$KIBANA_DIR/.."; pwd)" +tc_set_env WORKSPACE "${WORKSPACE:-$PARENT_DIR}" + +tc_set_env KIBANA_PKG_BRANCH "$(jq -r .branch "$KIBANA_DIR/package.json")" +tc_set_env KIBANA_BASE_BRANCH "$KIBANA_PKG_BRANCH" + +tc_set_env GECKODRIVER_CDNURL "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache" +tc_set_env CHROMEDRIVER_CDNURL "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache" +tc_set_env RE2_DOWNLOAD_MIRROR "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache" +tc_set_env CYPRESS_DOWNLOAD_MIRROR "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/cypress" + +tc_set_env NODE_OPTIONS "${NODE_OPTIONS:-} --max-old-space-size=4096" + +tc_set_env FORCE_COLOR 1 +tc_set_env TEST_BROWSER_HEADLESS 1 + +if [[ "${KIBANA_CI_REPORTER_KEY_BASE64-}" ]]; then + tc_set_env KIBANA_CI_REPORTER_KEY "$(echo "$KIBANA_CI_REPORTER_KEY_BASE64" | base64 -d)" +fi + +if is_pr; then + tc_set_env CHECKS_REPORTER_ACTIVE true + + # These can be removed once we're not supporting Jenkins and TeamCity at the same time + # These are primarily used by github checks reporter and can be configured via /github_checks_api.json + tc_set_env ghprbGhRepository "elastic/kibana" # TODO? + tc_set_env ghprbActualCommit "$GITHUB_PR_TRIGGERED_SHA" + tc_set_env BUILD_URL "$TEAMCITY_BUILD_URL" +else + tc_set_env CHECKS_REPORTER_ACTIVE false +fi + +tc_set_env INGEST_MANAGEMENT_PACKAGE_REGISTRY_PORT 6104 # Any unused port is fine, used by ingest manager tests + +if [[ "$(which google-chrome-stable)" || "$(which google-chrome)" ]]; then + echo "Chrome detected, setting DETECT_CHROMEDRIVER_VERSION=true" + tc_set_env DETECT_CHROMEDRIVER_VERSION true + tc_set_env CHROMEDRIVER_FORCE_DOWNLOAD true +else + echo "Chrome not detected, installing default chromedriver binary for the package version" +fi diff --git a/.ci/teamcity/setup_node.sh b/.ci/teamcity/setup_node.sh new file mode 100755 index 0000000000000..b805a2aa6fe62 --- /dev/null +++ b/.ci/teamcity/setup_node.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/util.sh" + +tc_start_block "Setup Node" + +tc_set_env NODE_VERSION "$(cat "$KIBANA_DIR/.node-version")" +tc_set_env NODE_DIR "$CACHE_DIR/node/$NODE_VERSION" +tc_set_env NODE_BIN_DIR "$NODE_DIR/bin" +tc_set_env YARN_OFFLINE_CACHE "$CACHE_DIR/yarn-offline-cache" + +if [[ ! -d "$NODE_DIR" ]]; then + nodeUrl="https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" + + echo "node.js v$NODE_VERSION not found at $NODE_DIR, downloading from $nodeUrl" + + mkdir -p "$NODE_DIR" + curl --silent -L "$nodeUrl" | tar -xz -C "$NODE_DIR" --strip-components=1 +else + echo "node.js v$NODE_VERSION already installed to $NODE_DIR, re-using" + ls -alh "$NODE_BIN_DIR" +fi + +tc_set_env PATH "$NODE_BIN_DIR:$PATH" + +tc_end_block "Setup Node" +tc_start_block "Setup Yarn" + +tc_set_env YARN_VERSION "$(node -e "console.log(String(require('./package.json').engines.yarn || '').replace(/^[^\d]+/,''))")" + +if [[ ! $(which yarn) || $(yarn --version) != "$YARN_VERSION" ]]; then + npm install -g "yarn@^${YARN_VERSION}" +fi + +yarn config set yarn-offline-mirror "$YARN_OFFLINE_CACHE" + +tc_set_env YARN_GLOBAL_BIN "$(yarn global bin)" +tc_set_env PATH "$PATH:$YARN_GLOBAL_BIN" + +tc_end_block "Setup Yarn" diff --git a/.ci/teamcity/tests/mocha.sh b/.ci/teamcity/tests/mocha.sh new file mode 100755 index 0000000000000..ea6c43c39e397 --- /dev/null +++ b/.ci/teamcity/tests/mocha.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:mocha diff --git a/.ci/teamcity/tests/test_hardening.sh b/.ci/teamcity/tests/test_hardening.sh new file mode 100755 index 0000000000000..21ee68e5ade70 --- /dev/null +++ b/.ci/teamcity/tests/test_hardening.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:test_hardening diff --git a/.ci/teamcity/tests/test_projects.sh b/.ci/teamcity/tests/test_projects.sh new file mode 100755 index 0000000000000..3feaa821424e1 --- /dev/null +++ b/.ci/teamcity/tests/test_projects.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +yarn run grunt run:test_projects diff --git a/.ci/teamcity/tests/xpack_list_cyclic_dependency.sh b/.ci/teamcity/tests/xpack_list_cyclic_dependency.sh new file mode 100755 index 0000000000000..39f79f94744c7 --- /dev/null +++ b/.ci/teamcity/tests/xpack_list_cyclic_dependency.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +cd x-pack +checks-reporter-with-killswitch "X-Pack List cyclic dependency test" node plugins/lists/scripts/check_circular_deps diff --git a/.ci/teamcity/tests/xpack_siem_cyclic_dependency.sh b/.ci/teamcity/tests/xpack_siem_cyclic_dependency.sh new file mode 100755 index 0000000000000..e3829c961fac8 --- /dev/null +++ b/.ci/teamcity/tests/xpack_siem_cyclic_dependency.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +cd x-pack +checks-reporter-with-killswitch "X-Pack SIEM cyclic dependency test" node plugins/security_solution/scripts/check_circular_deps diff --git a/.ci/teamcity/util.sh b/.ci/teamcity/util.sh new file mode 100755 index 0000000000000..aba6cff22b113 --- /dev/null +++ b/.ci/teamcity/util.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +tc_escape() { + escaped="$1" + + # See https://www.jetbrains.com/help/teamcity/service-messages.html#Escaped+values + + escaped="$(echo "$escaped" | sed -z 's/|/||/g')" + escaped="$(echo "$escaped" | sed -z "s/'/|'/g")" + escaped="$(echo "$escaped" | sed -z 's/\[/|\[/g')" + escaped="$(echo "$escaped" | sed -z 's/\]/|\]/g')" + escaped="$(echo "$escaped" | sed -z 's/\n/|n/g')" + escaped="$(echo "$escaped" | sed -z 's/\r/|r/g')" + + echo "$escaped" +} + +# Sets up an environment variable locally, and also makes it available for subsequent steps in the build +# NOTE: env vars set up this way will be visible in the UI when logged in unless you set them up as blank password parameters ahead of time. +tc_set_env() { + export "$1"="$2" + echo "##teamcity[setParameter name='env.$1' value='$(tc_escape "$2")']" +} + +verify_no_git_changes() { + RED='\033[0;31m' + C_RESET='\033[0m' # Reset color + + "$@" + + GIT_CHANGES="$(git ls-files --modified)" + if [ "$GIT_CHANGES" ]; then + echo -e "\n${RED}ERROR: '$*' caused changes to the following files:${C_RESET}\n" + echo -e "$GIT_CHANGES\n" + exit 1 + fi +} + +tc_start_block() { + echo "##teamcity[blockOpened name='$1']" +} + +tc_end_block() { + echo "##teamcity[blockClosed name='$1']" +} + +checks-reporter-with-killswitch() { + if [ "$CHECKS_REPORTER_ACTIVE" == "true" ] ; then + yarn run github-checks-reporter "$@" + else + arguments=("$@"); + "${arguments[@]:1}"; + fi +} + +is_pr() { + [[ "${GITHUB_PR_NUMBER-}" ]] && return + false +} diff --git a/.teamcity/.editorconfig b/.teamcity/.editorconfig new file mode 100644 index 0000000000000..db789a8c72de1 --- /dev/null +++ b/.teamcity/.editorconfig @@ -0,0 +1,4 @@ +[*.{kt,kts}] +disabled_rules=no-wildcard-imports +indent_size=2 +kotlin_imports_layout=idea diff --git a/.teamcity/Kibana.png b/.teamcity/Kibana.png new file mode 100644 index 0000000000000000000000000000000000000000..5cfc64392438ef8aeb80d4f573983df895a2eddb GIT binary patch literal 130914 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 literal 0 HcmV?d00001 diff --git a/.teamcity/README.md b/.teamcity/README.md new file mode 100644 index 0000000000000..e79137eaa6ea0 --- /dev/null +++ b/.teamcity/README.md @@ -0,0 +1,150 @@ +# Kibana TeamCity + +## Implemented so far + +- Project configuration with ability to provide configuration values that are unique per TeamCity instance (e.g. dev vs prod) +- Read-only configuration (no editing through the UI) +- Secrets stored in TeamCity outside of source control +- Setting secret environment variables (they get filtered from console if output on accident) +- GCP agent configurations + - One-time use agents + - Multiple agents configured, of different sizes (cpu, memory) + - Require specific agents per build configuration +- Unit testable DSL code +- Build artifact generation and consumption +- DSL Extensions of various kinds to easily share common configuration between build configurations in the same repo +- Barebones Slack notifications via plugin +- Dynamically creating environment variables / secrets at runtime for subsequent steps +- "Baseline CI" job that runs a subset of CI for every commit +- "Full CI" job that runs full CI hourly, if changes are detected. Re-uses builds that ran during "Baseline CI" for same commit +- Performance monitoring enabled for all jobs +- Jobs with multiple VCS roots (Kibana + Elasticsearch) +- GCS uploading using service account key file and gsutil +- Job that has a version string as an "output", rather than an artifact/file, with consumption in a different job +- Clone a list of jobs and modify dependencies/configuration for a second pipeline +- Promote/deploy a built artifact through the UI by selecting previously built artifact (or automatically build a new one and deploy if successful) +- Custom Build IDs using service messages + +## Pull Requests + +The `Pull Request` feature in TeamCity: + +- Automatically discovers pull request branches in GitHub + - Option to filter by contributor type (members of same org, org+external contributor, everyone) + - Option to filter by target branch (e.g. only discover Pull Requests targeting master) + - Works by essentially modifying the VCS root branch spec (so you should NOT add anything related to PRs to branch spec if you are using this) + - Draft PRs do get discovered +- Adds some Pull Request information to build overview pages +- Adds a few parameters available to build configurations: + - teamcity.pullRequest.number + - teamcity.pullRequest.title + - teamcity.pullRequest.source.branch + - teamcity.pullRequest.target.branch + - (Notice that source owner is not available - there's no information for forks) +- Requires a token for API interaction + +That's it. There's no interaction with labels/comments/etc. Triggering is handled via the standard triggering options. + +So, if you only want to: + +- Build on new commit (e.g. not via comment) or via the TeamCity UI +- Start builds for users not covered by the filter options using the TeamCity UI + +The Pull Request feature may be enough to cover your needs. Otherwise, you'll need something additional (an external bot, or a new teamcity plugin, etc). + +### Other PR notes + +- TeamCity doesn't have the ability to cancel currently-running builds when a new commit is pushed +- TeamCity does not add fork information (e.g. the owner) to build configuration parameters +- Builds CAN be triggered for branches not yet discovered + - You can turn off discovery altogether, and a branch will still be build-able. When triggered externally, it will show up in the UI and build. + +How to [trigger a build via API](https://www.jetbrains.com/help/teamcity/rest-api-reference.html#Triggering+a+Build): + +``` +POST https://teamcity-server/app/rest/buildQueue + + + + +``` + +and with additional properties: + +``` + + + + + + + +``` + +## Kibana Builds + +### Baseline CI + +- Generates baseline metrics needed for PR comparisons +- Only runs OSS and default builds and visual regression tests +- Runs for each commit (each build should build a single commit) + +### Full CI + +- Runs everything in CI +- Runs hourly, currently only if there are changes since the last run +- Re-uses builds from Baseline CI if they are finished or in-progress + +![Diagram](Kibana.png) + +### ES Snapshot Verification + +Build Configurations: + +- Build Snapshot +- Test Builds (e.g. OSS CI Group 1, Default CI Group 3, etc) +- Verify Snapshot +- Promote Snapshot +- Immediately Promote Snapshot + +Desires: + +- Build ES snapshot on a daily basis, run E2E tests against it, promote when successful +- Ability to easily promote old builds that have been verified +- Ability to run verification without promoting it + +#### Build Snapshot + +- checks out both Kibana and ES codebases +- builds ES artifacts +- uses scripts from Kibana repo to create JSON manifest and assemble snapshot files +- uploads artifacts to GCS +- sets parameters via service message that contains the snapshot URL, ID, version so they can be consumed by downstream jobs +- triggers on timer, once per day + +#### Test Builds + +- builds are clones of all "essential ci" functional and integration tests with irrelevant features disabled + - they are clones because runs of this build and runs of the essential ci versions for the same commit hash mean different things +- snapshot dependency on `Build Elasticsearch Snapshot` is added to clones +- set `env.ES_SNAPSHOT_MANIFEST` = `dep..ES_SNAPSHOT_MANIFEST` to "consume" the built artifact + +#### Verify Snapshot + +- composite build that contains all of the cloned test builds + +#### Promote Snapshot + +- snapshot dependency on `Build Snapshot` and `Verify Snapshot` +- uses scripts from Kibana repo to promote elasticsearch snapshot from `Build Snapshot` by updating manifest files in GCS +- triggers whenever a build of `Verify Snapshot` completes successfully + +#### Immediately Promote Snapshot + +- snapshot dependency only on `Build Snapshot` +- same as `Promote Snapshot` but skips testing +- can only be triggered manually + +``` + +``` diff --git a/.teamcity/pom.xml b/.teamcity/pom.xml new file mode 100644 index 0000000000000..5fa068d0a92e0 --- /dev/null +++ b/.teamcity/pom.xml @@ -0,0 +1,128 @@ + + + + + 4.0.0 + Kibana Teamcity Config DSL Script + org.elastic.kibana + kibana-teamcity-dsl + 1.0-SNAPSHOT + + + org.jetbrains.teamcity + configs-dsl-kotlin-parent + 1.0-SNAPSHOT + + + + + jetbrains-all + https://download.jetbrains.com/teamcity-repository + + true + + + + teamcity-server + https://ci.elastic.dev/app/dsl-plugins-repository + + true + + + + + + + JetBrains + https://download.jetbrains.com/teamcity-repository + + + + + tests + src + + + kotlin-maven-plugin + org.jetbrains.kotlin + ${kotlin.version} + + + + compile + process-sources + + compile + + + + test-compile + process-test-sources + + test-compile + + + + + + org.jetbrains.teamcity + teamcity-configs-maven-plugin + ${teamcity.dsl.version} + + kotlin + target/generated-configs + + + + + + + + org.jetbrains.teamcity + configs-dsl-kotlin + ${teamcity.dsl.version} + compile + + + org.jetbrains.teamcity + configs-dsl-kotlin-plugins + 1.0-SNAPSHOT + pom + compile + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + ${kotlin.version} + compile + + + org.jetbrains.kotlin + kotlin-script-runtime + ${kotlin.version} + compile + + + junit + junit + 4.13 + + + diff --git a/.teamcity/settings.kts b/.teamcity/settings.kts new file mode 100644 index 0000000000000..ec1b1c6eb94ef --- /dev/null +++ b/.teamcity/settings.kts @@ -0,0 +1,12 @@ +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import projects.Kibana +import projects.KibanaConfiguration + +version = "2020.1" + +val config = KibanaConfiguration { + agentNetwork = DslContext.getParameter("agentNetwork", "teamcity") + agentSubnet = DslContext.getParameter("agentSubnet", "teamcity") +} + +project(Kibana(config)) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt new file mode 100644 index 0000000000000..f9594ab818e17 --- /dev/null +++ b/.teamcity/src/Extensions.kt @@ -0,0 +1,139 @@ +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.notifications +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.ScriptBuildStep +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import jetbrains.buildServer.configs.kotlin.v2019_2.ui.insert +import projects.kibanaConfiguration + +fun BuildFeatures.junit(dirs: String = "target/**/TEST-*.xml") { + feature { + type = "xml-report-plugin" + param("xmlReportParsing.reportType", "junit") + param("xmlReportParsing.reportDirs", dirs) + } +} + +fun ProjectFeatures.kibanaAgent(init: ProjectFeature.() -> Unit) { + feature { + type = "CloudImage" + param("network", kibanaConfiguration.agentNetwork) + param("subnet", kibanaConfiguration.agentSubnet) + param("growingId", "true") + param("agent_pool_id", "-2") + param("preemptible", "false") +// param("sourceProject", "elastic-kibana-184716") +// param("sourceImageFamily", "kibana-ci-elastic-dev") +// param("sourceImageFamily", "elastic-kibana-ci-ubuntu-1804-lts-nocache") + param("sourceProject", "elastic-images-prod") + param("sourceImageFamily", "elastic-kibana-ci-ubuntu-1804-lts") + param("zone", "us-central1-a") + param("profileId", "kibana") + param("diskType", "pd-ssd") + param("machineCustom", "false") + param("maxInstances", "200") + param("imageType", "ImageFamily") + param("diskSizeGb", "75") // TODO + init() + } +} + +fun ProjectFeatures.kibanaAgent(size: String, init: ProjectFeature.() -> Unit = {}) { + kibanaAgent { + id = "KIBANA_STANDARD_$size" + param("source-id", "kibana-standard-$size-") + param("machineType", "n2-standard-$size") + init() + } +} + +fun BuildType.kibanaAgent(size: String) { + requirements { + startsWith("teamcity.agent.name", "kibana-standard-$size-", "RQ_AGENT_NAME") + } +} + +fun BuildType.kibanaAgent(size: Int) { + kibanaAgent(size.toString()) +} + +val testArtifactRules = """ + target/kibana-* + target/test-metrics/* + target/kibana-security-solution/**/*.png + target/junit/**/* + target/test-suites-ci-plan.json + test/**/screenshots/session/*.png + test/**/screenshots/failure/*.png + test/**/screenshots/diff/*.png + test/functional/failure_debug/html/*.html + x-pack/test/**/screenshots/session/*.png + x-pack/test/**/screenshots/failure/*.png + x-pack/test/**/screenshots/diff/*.png + x-pack/test/functional/failure_debug/html/*.html + x-pack/test/functional/apps/reporting/reports/session/*.pdf + """.trimIndent() + +fun BuildType.addTestSettings() { + artifactRules += "\n" + testArtifactRules + steps { + failedTestReporter() + } + features { + junit() + } +} + +fun BuildType.addTestArtifacts() { + this.artifactRules += "\n" + testArtifactRules +} + +fun BuildType.addSlackNotifications(to: String = "#kibana-teamcity-testing") { + features { + notifications { + notifierSettings = slackNotifier { + connection = "KIBANA_SLACK" + sendTo = to + messageFormat = verboseMessageFormat { + addBranch = true + addChanges = true + addStatusText = true + maximumNumberOfChanges = 5 + } + } + buildFailedToStart = true + buildFailed = true + buildFinishedSuccessfully = false + firstBuildErrorOccurs = true + buildProbablyHanging = true + } + } +} + +fun BuildType.dependsOn(buildType: BuildType, init: SnapshotDependency.() -> Unit = {}) { + dependencies { + snapshot(buildType) { + reuseBuilds = ReuseBuilds.SUCCESSFUL + onDependencyCancel = FailureAction.ADD_PROBLEM + onDependencyFailure = FailureAction.ADD_PROBLEM + synchronizeRevisions = true + init() + } + } +} + +fun BuildType.dependsOn(vararg buildTypes: BuildType, init: SnapshotDependency.() -> Unit = {}) { + buildTypes.forEach { dependsOn(it, init) } +} + +fun BuildSteps.failedTestReporter(init: ScriptBuildStep.() -> Unit = {}) { + script { + name = "Failed Test Reporter" + scriptContent = + """ + #!/bin/bash + node scripts/report_failed_tests + """.trimIndent() + executionMode = BuildStep.ExecutionMode.RUN_ON_FAILURE + init() + } +} diff --git a/.teamcity/src/builds/BaselineCi.kt b/.teamcity/src/builds/BaselineCi.kt new file mode 100644 index 0000000000000..df32d59674092 --- /dev/null +++ b/.teamcity/src/builds/BaselineCi.kt @@ -0,0 +1,37 @@ +package builds + +import addSlackNotifications +import builds.default.DefaultBuild +import builds.default.DefaultSavedObjectFieldMetrics +import builds.oss.OssBuild +import dependsOn +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.FailureAction +import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.vcs +import templates.KibanaTemplate + +object BaselineCi : BuildType({ + id("Baseline_CI") + name = "Baseline CI" + description = "Runs builds, saved object field metrics for every commit" + type = Type.COMPOSITE + paused = true + + templates(KibanaTemplate) + + triggers { + vcs { +// perCheckinTriggering = true // TODO re-enable this later, it wreaks havoc when I merge upstream + } + } + + dependsOn( + OssBuild, + DefaultBuild, + DefaultSavedObjectFieldMetrics + ) { + onDependencyCancel = FailureAction.ADD_PROBLEM + } + + addSlackNotifications() +}) diff --git a/.teamcity/src/builds/Checks.kt b/.teamcity/src/builds/Checks.kt new file mode 100644 index 0000000000000..2bf7925fb30b2 --- /dev/null +++ b/.teamcity/src/builds/Checks.kt @@ -0,0 +1,37 @@ +package builds + +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import kibanaAgent + +object Checks : BuildType({ + name = "Checks" + description = "Executes Various Checks" + + kibanaAgent(4) + + val checkScripts = mapOf( + "Check Telemetry Schema" to ".ci/teamcity/checks/telemetry.sh", + "Check TypeScript Projects" to ".ci/teamcity/checks/ts_projects.sh", + "Check File Casing" to ".ci/teamcity/checks/file_casing.sh", + "Check Lockfile Symlinks" to ".ci/teamcity/checks/lock_file_symlinks.sh", + "Check Licenses" to ".ci/teamcity/checks/licenses.sh", + "Verify NOTICE" to ".ci/teamcity/checks/verify_notice.sh", + "Test Hardening" to ".ci/teamcity/checks/test_hardening.sh", + "Check Types" to ".ci/teamcity/checks/type_check.sh", + "Check Doc API Changes" to ".ci/teamcity/checks/doc_api_changes.sh", + "Check i18n" to ".ci/teamcity/checks/i18n.sh" + ) + + steps { + for (checkScript in checkScripts) { + script { + name = checkScript.key + scriptContent = """ + #!/bin/bash + ${checkScript.value} + """.trimIndent() + } + } + } +}) diff --git a/.teamcity/src/builds/FullCi.kt b/.teamcity/src/builds/FullCi.kt new file mode 100644 index 0000000000000..7f19304428d7e --- /dev/null +++ b/.teamcity/src/builds/FullCi.kt @@ -0,0 +1,30 @@ +package builds + +import builds.default.* +import builds.oss.* +import builds.test.AllTests +import dependsOn +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType + +object FullCi : BuildType({ + id("Full_CI") + name = "Full CI" + description = "Runs everything in CI. For tracked branches and PRs." + type = Type.COMPOSITE + + dependsOn( + Lint, + Checks, + AllTests, + OssBuild, + OssAccessibility, + OssPluginFunctional, + OssCiGroups, + OssFirefox, + DefaultBuild, + DefaultCiGroups, + DefaultFirefox, + DefaultAccessibility, + DefaultSecuritySolution + ) +}) diff --git a/.teamcity/src/builds/HourlyCi.kt b/.teamcity/src/builds/HourlyCi.kt new file mode 100644 index 0000000000000..83a8242c752f6 --- /dev/null +++ b/.teamcity/src/builds/HourlyCi.kt @@ -0,0 +1,33 @@ +package builds + +import addSlackNotifications +import dependsOn +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.FailureAction +import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.schedule + +object HourlyCi : BuildType({ + id("Hourly_CI") + name = "Hourly CI" + description = "Runs everything in CI, hourly" + type = Type.COMPOSITE + + triggers { + schedule { + schedulingPolicy = cron { + hours = "*" + minutes = "0" + } + triggerBuild = always() + withPendingChangesOnly = true + } + } + + dependsOn( + FullCi + ) { + onDependencyCancel = FailureAction.ADD_PROBLEM + } + + addSlackNotifications() +}) diff --git a/.teamcity/src/builds/Lint.kt b/.teamcity/src/builds/Lint.kt new file mode 100644 index 0000000000000..18d0e20a199d7 --- /dev/null +++ b/.teamcity/src/builds/Lint.kt @@ -0,0 +1,32 @@ +package builds + +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import kibanaAgent + +object Lint : BuildType({ + name = "Lint" + description = "Executes Linting, such as eslint and sasslint" + + kibanaAgent(2) + + steps { + script { + name = "Sasslint" + scriptContent = + """ + #!/bin/bash + yarn run grunt run:sasslint + """.trimIndent() + } + + script { + name = "ESLint" + scriptContent = + """ + #!/bin/bash + yarn run grunt run:eslint + """.trimIndent() + } + } +}) diff --git a/.teamcity/src/builds/PullRequestCi.kt b/.teamcity/src/builds/PullRequestCi.kt new file mode 100644 index 0000000000000..126f89de4a723 --- /dev/null +++ b/.teamcity/src/builds/PullRequestCi.kt @@ -0,0 +1,69 @@ +package builds + +import dependsOn +import jetbrains.buildServer.configs.kotlin.v2019_2.AbsoluteId +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.PullRequests +import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.commitStatusPublisher +import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.pullRequests +import vcs.Kibana + +object PullRequestCi : BuildType({ + id = AbsoluteId("Kibana_PullRequest_CI") + name = "Pull Request CI" + type = Type.COMPOSITE + + buildNumberPattern = "%build.counter%-%env.GITHUB_PR_OWNER%-%env.GITHUB_PR_BRANCH%" + + vcs { + root(Kibana) + checkoutDir = "kibana" + + branchFilter = "+:pull/*" + } + + params { + // These params should get filled in by the app that triggers builds + param("env.GITHUB_PR_TARGET_BRANCH", "") + param("env.GITHUB_PR_NUMBER", "") + param("env.GITHUB_PR_OWNER", "") + param("env.GITHUB_PR_REPO", "") + param("env.GITHUB_PR_BRANCH", "") + param("env.GITHUB_PR_TRIGGERED_SHA", "") + param("env.GITHUB_PR_LABELS", "") + param("env.GITHUB_PR_TRIGGER_COMMENT", "") + + param("reverse.dep.*.env.GITHUB_PR_TARGET_BRANCH", "") + param("reverse.dep.*.env.GITHUB_PR_NUMBER", "") + param("reverse.dep.*.env.GITHUB_PR_OWNER", "") + param("reverse.dep.*.env.GITHUB_PR_REPO", "") + param("reverse.dep.*.env.GITHUB_PR_BRANCH", "") + param("reverse.dep.*.env.GITHUB_PR_TRIGGERED_SHA", "") + param("reverse.dep.*.env.GITHUB_PR_LABELS", "") + param("reverse.dep.*.env.GITHUB_PR_TRIGGER_COMMENT", "") + } + + features { + pullRequests { + vcsRootExtId = "${Kibana.id}" + provider = github { + authType = token { + token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" + } + filterTargetBranch = "refs/heads/master_teamcity" + filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER + } + } + commitStatusPublisher { + vcsRootExtId = "${Kibana.id}" + publisher = github { + githubUrl = "https://api.github.com" + authType = personalToken { + token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" + } + } + } + } + + dependsOn(FullCi) +}) diff --git a/.teamcity/src/builds/default/DefaultAccessibility.kt b/.teamcity/src/builds/default/DefaultAccessibility.kt new file mode 100755 index 0000000000000..a7e6f831d0da4 --- /dev/null +++ b/.teamcity/src/builds/default/DefaultAccessibility.kt @@ -0,0 +1,19 @@ +package builds.default + +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object DefaultAccessibility : DefaultFunctionalBase({ + id("DefaultAccessibility") + name = "Accessibility" + + steps { + script { + name = "Default Accessibility" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/default/accessibility.sh + """.trimIndent() + } + } +}) diff --git a/.teamcity/src/builds/default/DefaultBuild.kt b/.teamcity/src/builds/default/DefaultBuild.kt new file mode 100644 index 0000000000000..f4683e6cf0c1a --- /dev/null +++ b/.teamcity/src/builds/default/DefaultBuild.kt @@ -0,0 +1,56 @@ +package builds.default + +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.Dependencies +import jetbrains.buildServer.configs.kotlin.v2019_2.FailureAction +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object DefaultBuild : BuildType({ + name = "Build Default" + description = "Generates Default Build Distribution artifact" + + artifactRules = """ + +:install/kibana/**/* => kibana-default.tar.gz + target/kibana-* + +:src/**/target/public/**/* => kibana-default-plugins.tar.gz!/src/ + +:x-pack/plugins/**/target/public/**/* => kibana-default-plugins.tar.gz!/x-pack/plugins/ + +:x-pack/test/**/target/public/**/* => kibana-default-plugins.tar.gz!/x-pack/test/ + +:examples/**/target/public/**/* => kibana-default-plugins.tar.gz!/examples/ + +:test/**/target/public/**/* => kibana-default-plugins.tar.gz!/test/ + """.trimIndent() + + requirements { + startsWith("teamcity.agent.name", "kibana-c2-16-", "RQ_AGENT_NAME") + } + + steps { + script { + name = "Build Default Distribution" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/default/build.sh + """.trimIndent() + } + } +}) + +fun Dependencies.defaultBuild(rules: String = "+:kibana-default.tar.gz!** => ../build/kibana-build-default") { + dependency(DefaultBuild) { + snapshot { + onDependencyFailure = FailureAction.FAIL_TO_START + onDependencyCancel = FailureAction.FAIL_TO_START + } + + artifacts { + artifactRules = rules + } + } +} + +fun Dependencies.defaultBuildWithPlugins() { + defaultBuild(""" + +:kibana-default.tar.gz!** => ../build/kibana-build-default + +:kibana-default-plugins.tar.gz!** + """.trimIndent()) +} diff --git a/.teamcity/src/builds/default/DefaultCiGroup.kt b/.teamcity/src/builds/default/DefaultCiGroup.kt new file mode 100755 index 0000000000000..e62ff5fe91bef --- /dev/null +++ b/.teamcity/src/builds/default/DefaultCiGroup.kt @@ -0,0 +1,22 @@ +package builds.default + +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +class DefaultCiGroup(val ciGroup: Int = 0, init: BuildType.() -> Unit = {}) : DefaultFunctionalBase({ + id("DefaultCiGroup_$ciGroup") + name = "CI Group $ciGroup" + + steps { + script { + name = "Default CI Group $ciGroup" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/default/ci_group.sh $ciGroup + """.trimIndent() + } + } + + init() +}) diff --git a/.teamcity/src/builds/default/DefaultCiGroups.kt b/.teamcity/src/builds/default/DefaultCiGroups.kt new file mode 100644 index 0000000000000..6f1d45598c92e --- /dev/null +++ b/.teamcity/src/builds/default/DefaultCiGroups.kt @@ -0,0 +1,15 @@ +package builds.default + +import dependsOn +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType + +const val DEFAULT_CI_GROUP_COUNT = 10 +val defaultCiGroups = (1..DEFAULT_CI_GROUP_COUNT).map { DefaultCiGroup(it) } + +object DefaultCiGroups : BuildType({ + id("Default_CIGroups_Composite") + name = "CI Groups" + type = Type.COMPOSITE + + dependsOn(*defaultCiGroups.toTypedArray()) +}) diff --git a/.teamcity/src/builds/default/DefaultFirefox.kt b/.teamcity/src/builds/default/DefaultFirefox.kt new file mode 100755 index 0000000000000..e7850b746e843 --- /dev/null +++ b/.teamcity/src/builds/default/DefaultFirefox.kt @@ -0,0 +1,19 @@ +package builds.default + +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object DefaultFirefox : DefaultFunctionalBase({ + id("DefaultFirefox") + name = "Firefox" + + steps { + script { + name = "Default Firefox" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/default/firefox.sh + """.trimIndent() + } + } +}) diff --git a/.teamcity/src/builds/default/DefaultFunctionalBase.kt b/.teamcity/src/builds/default/DefaultFunctionalBase.kt new file mode 100644 index 0000000000000..1c9002e14507c --- /dev/null +++ b/.teamcity/src/builds/default/DefaultFunctionalBase.kt @@ -0,0 +1,18 @@ +package builds.default + +import addTestSettings +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType + +open class DefaultFunctionalBase(init: BuildType.() -> Unit = {}) : BuildType({ + params { + param("env.KBN_NP_PLUGINS_BUILT", "true") + } + + dependencies { + defaultBuildWithPlugins() + } + + init() + + addTestSettings() +}) diff --git a/.teamcity/src/builds/default/DefaultSavedObjectFieldMetrics.kt b/.teamcity/src/builds/default/DefaultSavedObjectFieldMetrics.kt new file mode 100644 index 0000000000000..61505d4757faa --- /dev/null +++ b/.teamcity/src/builds/default/DefaultSavedObjectFieldMetrics.kt @@ -0,0 +1,28 @@ +package builds.default + +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object DefaultSavedObjectFieldMetrics : BuildType({ + id("DefaultSavedObjectFieldMetrics") + name = "Default Saved Object Field Metrics" + + params { + param("env.KBN_NP_PLUGINS_BUILT", "true") + } + + steps { + script { + name = "Default Saved Object Field Metrics" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/default/saved_object_field_metrics.sh + """.trimIndent() + } + } + + dependencies { + defaultBuild() + } +}) diff --git a/.teamcity/src/builds/default/DefaultSecuritySolution.kt b/.teamcity/src/builds/default/DefaultSecuritySolution.kt new file mode 100755 index 0000000000000..5cd335c1fc961 --- /dev/null +++ b/.teamcity/src/builds/default/DefaultSecuritySolution.kt @@ -0,0 +1,19 @@ +package builds.default + +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object DefaultSecuritySolution : DefaultFunctionalBase({ + id("DefaultSecuritySolution") + name = "Security Solution" + + steps { + script { + name = "Default Security Solution" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/default/security_solution.sh + """.trimIndent() + } + } +}) diff --git a/.teamcity/src/builds/es_snapshots/Build.kt b/.teamcity/src/builds/es_snapshots/Build.kt new file mode 100644 index 0000000000000..d0c849ff5f996 --- /dev/null +++ b/.teamcity/src/builds/es_snapshots/Build.kt @@ -0,0 +1,84 @@ +package builds.es_snapshots + +import addSlackNotifications +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import vcs.Elasticsearch +import vcs.Kibana + +object ESSnapshotBuild : BuildType({ + name = "Build Snapshot" + paused = true + + requirements { + startsWith("teamcity.agent.name", "kibana-c2-16-", "RQ_AGENT_NAME") + } + + vcs { + root(Kibana, "+:. => kibana") + root(Elasticsearch, "+:. => elasticsearch") + checkoutDir = "" + } + + params { + param("env.ELASTICSEARCH_BRANCH", "%vcsroot.${Elasticsearch.id.toString()}.branch%") + param("env.ELASTICSEARCH_GIT_COMMIT", "%build.vcs.number.${Elasticsearch.id.toString()}%") + + param("env.GOOGLE_APPLICATION_CREDENTIALS", "%teamcity.build.workingDir%/gcp-credentials.json") + password("env.GOOGLE_APPLICATION_CREDENTIALS_JSON", "credentialsJSON:6e0acb7c-f89c-4225-84b8-4fc102f1a5ef", display = ParameterDisplay.HIDDEN) + } + + steps { + script { + name = "Setup Environment" + scriptContent = + """ + #!/bin/bash + cd kibana + ./.ci/teamcity/setup_env.sh + """.trimIndent() + } + + script { + name = "Setup Node and Yarn" + scriptContent = + """ + #!/bin/bash + cd kibana + ./.ci/teamcity/setup_node.sh + """.trimIndent() + } + + script { + name = "Build Elasticsearch Distribution" + scriptContent = + """ + #!/bin/bash + cd kibana + ./.ci/teamcity/es_snapshots/build.sh + """.trimIndent() + } + + script { + name = "Setup Google Cloud Credentials" + scriptContent = + """#!/bin/bash + echo "${"$"}GOOGLE_APPLICATION_CREDENTIALS_JSON" > "${"$"}GOOGLE_APPLICATION_CREDENTIALS" + gcloud auth activate-service-account --key-file "${"$"}GOOGLE_APPLICATION_CREDENTIALS" + """.trimIndent() + } + + script { + name = "Create Snapshot Manifest" + scriptContent = + """#!/bin/bash + cd kibana + node ./.ci/teamcity/es_snapshots/create_manifest.js "$(cd ../es-build && pwd)" + """.trimIndent() + } + } + + artifactRules = "+:es-build/**/*.json" + + addSlackNotifications() +}) diff --git a/.teamcity/src/builds/es_snapshots/Promote.kt b/.teamcity/src/builds/es_snapshots/Promote.kt new file mode 100644 index 0000000000000..9303439d49f30 --- /dev/null +++ b/.teamcity/src/builds/es_snapshots/Promote.kt @@ -0,0 +1,87 @@ +package builds.es_snapshots + +import addSlackNotifications +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.finishBuildTrigger +import vcs.Kibana + +object ESSnapshotPromote : BuildType({ + name = "Promote Snapshot" + paused = true + type = Type.DEPLOYMENT + + vcs { + root(Kibana, "+:. => kibana") + checkoutDir = "" + } + + params { + param("env.ES_SNAPSHOT_MANIFEST", "${ESSnapshotBuild.depParamRefs["env.ES_SNAPSHOT_MANIFEST"]}") + param("env.GOOGLE_APPLICATION_CREDENTIALS", "%teamcity.build.workingDir%/gcp-credentials.json") + password("env.GOOGLE_APPLICATION_CREDENTIALS_JSON", "credentialsJSON:6e0acb7c-f89c-4225-84b8-4fc102f1a5ef", display = ParameterDisplay.HIDDEN) + } + + triggers { + finishBuildTrigger { + buildType = Verify.id.toString() + successfulOnly = true + } + } + + steps { + script { + name = "Setup Environment" + scriptContent = + """ + #!/bin/bash + cd kibana + ./.ci/teamcity/setup_env.sh + """.trimIndent() + } + + script { + name = "Setup Node and Yarn" + scriptContent = + """ + #!/bin/bash + cd kibana + ./.ci/teamcity/setup_node.sh + """.trimIndent() + } + + script { + name = "Setup Google Cloud Credentials" + scriptContent = + """#!/bin/bash + echo "${"$"}GOOGLE_APPLICATION_CREDENTIALS_JSON" > "${"$"}GOOGLE_APPLICATION_CREDENTIALS" + gcloud auth activate-service-account --key-file "${"$"}GOOGLE_APPLICATION_CREDENTIALS" + """.trimIndent() + } + + script { + name = "Promote Snapshot Manifest" + scriptContent = + """#!/bin/bash + cd kibana + node ./.ci/teamcity/es_snapshots/promote_manifest.js "${"$"}ES_SNAPSHOT_MANIFEST" + """.trimIndent() + } + } + + dependencies { + dependency(ESSnapshotBuild) { + snapshot { } + + // This is just here to allow build selection in the UI, the file isn't actually used + artifacts { + artifactRules = "manifest.json" + } + } + dependency(Verify) { + snapshot { } + } + } + + addSlackNotifications() +}) diff --git a/.teamcity/src/builds/es_snapshots/PromoteImmediate.kt b/.teamcity/src/builds/es_snapshots/PromoteImmediate.kt new file mode 100644 index 0000000000000..f80a97873b246 --- /dev/null +++ b/.teamcity/src/builds/es_snapshots/PromoteImmediate.kt @@ -0,0 +1,79 @@ +package builds.es_snapshots + +import addSlackNotifications +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import jetbrains.buildServer.configs.kotlin.v2019_2.triggers.finishBuildTrigger +import vcs.Elasticsearch +import vcs.Kibana + +object ESSnapshotPromoteImmediate : BuildType({ + name = "Immediately Promote Snapshot" + description = "Skip testing and immediately promote the selected snapshot" + paused = true + type = Type.DEPLOYMENT + + vcs { + root(Kibana, "+:. => kibana") + checkoutDir = "" + } + + params { + param("env.ES_SNAPSHOT_MANIFEST", "${ESSnapshotBuild.depParamRefs["env.ES_SNAPSHOT_MANIFEST"]}") + param("env.GOOGLE_APPLICATION_CREDENTIALS", "%teamcity.build.workingDir%/gcp-credentials.json") + password("env.GOOGLE_APPLICATION_CREDENTIALS_JSON", "credentialsJSON:6e0acb7c-f89c-4225-84b8-4fc102f1a5ef", display = ParameterDisplay.HIDDEN) + } + + steps { + script { + name = "Setup Environment" + scriptContent = + """ + #!/bin/bash + cd kibana + ./.ci/teamcity/setup_env.sh + """.trimIndent() + } + + script { + name = "Setup Node and Yarn" + scriptContent = + """ + #!/bin/bash + cd kibana + ./.ci/teamcity/setup_node.sh + """.trimIndent() + } + + script { + name = "Setup Google Cloud Credentials" + scriptContent = + """#!/bin/bash + echo "${"$"}GOOGLE_APPLICATION_CREDENTIALS_JSON" > "${"$"}GOOGLE_APPLICATION_CREDENTIALS" + gcloud auth activate-service-account --key-file "${"$"}GOOGLE_APPLICATION_CREDENTIALS" + """.trimIndent() + } + + script { + name = "Promote Snapshot Manifest" + scriptContent = + """#!/bin/bash + cd kibana + node ./.ci/teamcity/es_snapshots/promote_manifest.js "${"$"}ES_SNAPSHOT_MANIFEST" + """.trimIndent() + } + } + + dependencies { + dependency(ESSnapshotBuild) { + snapshot { } + + // This is just here to allow build selection in the UI, the file isn't actually used + artifacts { + artifactRules = "manifest.json" + } + } + } + + addSlackNotifications() +}) diff --git a/.teamcity/src/builds/es_snapshots/Verify.kt b/.teamcity/src/builds/es_snapshots/Verify.kt new file mode 100644 index 0000000000000..0acf0dccdf33f --- /dev/null +++ b/.teamcity/src/builds/es_snapshots/Verify.kt @@ -0,0 +1,96 @@ +package builds.es_snapshots + +import builds.default.DefaultBuild +import builds.default.DefaultSecuritySolution +import builds.default.defaultCiGroups +import builds.oss.OssBuild +import builds.oss.OssPluginFunctional +import builds.oss.ossCiGroups +import builds.test.ApiIntegration +import builds.test.JestIntegration +import dependsOn +import jetbrains.buildServer.configs.kotlin.v2019_2.* + +val cloneForVerify = { build: BuildType -> + val newBuild = BuildType() + build.copyTo(newBuild) + newBuild.id = AbsoluteId(build.id?.toString() + "_ES_Snapshots") + newBuild.params { + param("env.ES_SNAPSHOT_MANIFEST", "${ESSnapshotBuild.depParamRefs["env.ES_SNAPSHOT_MANIFEST"]}") + } + newBuild.dependencies { + dependency(ESSnapshotBuild) { + snapshot { + onDependencyFailure = FailureAction.FAIL_TO_START + onDependencyCancel = FailureAction.FAIL_TO_START + } + // This is just here to allow us to select a build when manually triggering a build using the UI + artifacts { + artifactRules = "manifest.json" + } + } + } + newBuild.steps.items.removeIf { it.name == "Failed Test Reporter" } + newBuild +} + +val ossBuildsToClone = listOf( + *ossCiGroups.toTypedArray(), + OssPluginFunctional +) + +val ossCloned = ossBuildsToClone.map { cloneForVerify(it) } + +val defaultBuildsToClone = listOf( + *defaultCiGroups.toTypedArray(), + DefaultSecuritySolution +) + +val defaultCloned = defaultBuildsToClone.map { cloneForVerify(it) } + +val integrationsBuildsToClone = listOf( + ApiIntegration, + JestIntegration +) + +val integrationCloned = integrationsBuildsToClone.map { cloneForVerify(it) } + +object OssTests : BuildType({ + id("ES_Snapshots_OSS_Tests_Composite") + name = "OSS Distro Tests" + type = Type.COMPOSITE + + dependsOn(*ossCloned.toTypedArray()) +}) + +object DefaultTests : BuildType({ + id("ES_Snapshots_Default_Tests_Composite") + name = "Default Distro Tests" + type = Type.COMPOSITE + + dependsOn(*defaultCloned.toTypedArray()) +}) + +object IntegrationTests : BuildType({ + id("ES_Snapshots_Integration_Tests_Composite") + name = "Integration Tests" + type = Type.COMPOSITE + + dependsOn(*integrationCloned.toTypedArray()) +}) + +object Verify : BuildType({ + id("ES_Snapshots_Verify_Composite") + name = "Verify Snapshot" + description = "Run all Kibana functional and integration tests using a given Elasticsearch snapshot" + type = Type.COMPOSITE + + dependsOn( + ESSnapshotBuild, + OssBuild, + DefaultBuild, + OssTests, + DefaultTests, + IntegrationTests + ) +}) diff --git a/.teamcity/src/builds/oss/OssAccessibility.kt b/.teamcity/src/builds/oss/OssAccessibility.kt new file mode 100644 index 0000000000000..dc555a74a7361 --- /dev/null +++ b/.teamcity/src/builds/oss/OssAccessibility.kt @@ -0,0 +1,19 @@ +package builds.oss + +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object OssAccessibility : OssFunctionalBase({ + id("OssAccessibility") + name = "Accessibility" + + steps { + script { + name = "OSS Accessibility" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/oss/accessibility.sh + """.trimIndent() + } + } +}) diff --git a/.teamcity/src/builds/oss/OssBuild.kt b/.teamcity/src/builds/oss/OssBuild.kt new file mode 100644 index 0000000000000..50fd73c17ba42 --- /dev/null +++ b/.teamcity/src/builds/oss/OssBuild.kt @@ -0,0 +1,41 @@ +package builds.oss + +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.Dependencies +import jetbrains.buildServer.configs.kotlin.v2019_2.FailureAction +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object OssBuild : BuildType({ + name = "Build OSS" + description = "Generates OSS Build Distribution artifact" + + requirements { + startsWith("teamcity.agent.name", "kibana-c2-16-", "RQ_AGENT_NAME") + } + + steps { + script { + name = "Build OSS Distribution" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/oss/build.sh + """.trimIndent() + } + } + + artifactRules = "+:build/oss/kibana-build-oss/**/* => kibana-oss.tar.gz" +}) + +fun Dependencies.ossBuild(rules: String = "+:kibana-oss.tar.gz!** => ../build/kibana-build-oss") { + dependency(OssBuild) { + snapshot { + onDependencyFailure = FailureAction.FAIL_TO_START + onDependencyCancel = FailureAction.FAIL_TO_START + } + + artifacts { + artifactRules = rules + } + } +} diff --git a/.teamcity/src/builds/oss/OssCiGroup.kt b/.teamcity/src/builds/oss/OssCiGroup.kt new file mode 100644 index 0000000000000..ed8fd3ead1748 --- /dev/null +++ b/.teamcity/src/builds/oss/OssCiGroup.kt @@ -0,0 +1,22 @@ +package builds.oss + +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +class OssCiGroup(val ciGroup: Int, init: BuildType.() -> Unit = {}) : OssFunctionalBase({ + id("OssCiGroup_$ciGroup") + name = "CI Group $ciGroup" + + steps { + script { + name = "OSS CI Group $ciGroup" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/oss/ci_group.sh $ciGroup + """.trimIndent() + } + } + + init() +}) diff --git a/.teamcity/src/builds/oss/OssCiGroups.kt b/.teamcity/src/builds/oss/OssCiGroups.kt new file mode 100644 index 0000000000000..931cca2554a24 --- /dev/null +++ b/.teamcity/src/builds/oss/OssCiGroups.kt @@ -0,0 +1,15 @@ +package builds.oss + +import dependsOn +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType + +const val OSS_CI_GROUP_COUNT = 12 +val ossCiGroups = (1..OSS_CI_GROUP_COUNT).map { OssCiGroup(it) } + +object OssCiGroups : BuildType({ + id("OSS_CIGroups_Composite") + name = "CI Groups" + type = Type.COMPOSITE + + dependsOn(*ossCiGroups.toTypedArray()) +}) diff --git a/.teamcity/src/builds/oss/OssFirefox.kt b/.teamcity/src/builds/oss/OssFirefox.kt new file mode 100644 index 0000000000000..3f0ec4c017c2a --- /dev/null +++ b/.teamcity/src/builds/oss/OssFirefox.kt @@ -0,0 +1,19 @@ +package builds.oss + +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object OssFirefox : OssFunctionalBase({ + id("OssFirefox") + name = "Firefox" + + steps { + script { + name = "OSS Firefox" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/oss/firefox.sh + """.trimIndent() + } + } +}) diff --git a/.teamcity/src/builds/oss/OssFunctionalBase.kt b/.teamcity/src/builds/oss/OssFunctionalBase.kt new file mode 100644 index 0000000000000..d8189fd358966 --- /dev/null +++ b/.teamcity/src/builds/oss/OssFunctionalBase.kt @@ -0,0 +1,18 @@ +package builds.oss + +import addTestSettings +import jetbrains.buildServer.configs.kotlin.v2019_2.* + +open class OssFunctionalBase(init: BuildType.() -> Unit = {}) : BuildType({ + params { + param("env.KBN_NP_PLUGINS_BUILT", "true") + } + + dependencies { + ossBuild() + } + + init() + + addTestSettings() +}) diff --git a/.teamcity/src/builds/oss/OssPluginFunctional.kt b/.teamcity/src/builds/oss/OssPluginFunctional.kt new file mode 100644 index 0000000000000..d3ebd554d9fba --- /dev/null +++ b/.teamcity/src/builds/oss/OssPluginFunctional.kt @@ -0,0 +1,32 @@ +package builds.oss + +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object OssPluginFunctional : OssFunctionalBase({ + id("OssPluginFunctional") + name = "Plugin Functional" + + steps { + script { + name = "Build OSS Plugins" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/oss/build_plugins.sh + """.trimIndent() + } + + script { + name = "OSS Plugin Functional" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/oss/plugin_functional.sh + """.trimIndent() + } + } + + dependencies { + ossBuild() + } +}) diff --git a/.teamcity/src/builds/test/AllTests.kt b/.teamcity/src/builds/test/AllTests.kt new file mode 100644 index 0000000000000..2e2213d55649e --- /dev/null +++ b/.teamcity/src/builds/test/AllTests.kt @@ -0,0 +1,12 @@ +package builds.test + +import dependsOn +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType + +object AllTests : BuildType({ + name = "All Tests" + description = "All Non-Functional Tests" + type = Type.COMPOSITE + + dependsOn(QuickTests, Jest, XPackJest, JestIntegration, ApiIntegration) +}) diff --git a/.teamcity/src/builds/test/ApiIntegration.kt b/.teamcity/src/builds/test/ApiIntegration.kt new file mode 100644 index 0000000000000..e4820e231c999 --- /dev/null +++ b/.teamcity/src/builds/test/ApiIntegration.kt @@ -0,0 +1,23 @@ +package builds.test + +import addTestSettings +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object ApiIntegration : BuildType({ + name = "API Integration" + description = "Executes API Integration Tests" + + steps { + script { + name = "API Integration" + scriptContent = + """ + #!/bin/bash + yarn run grunt run:apiIntegrationTests + """.trimIndent() + } + } + + addTestSettings() +}) diff --git a/.teamcity/src/builds/test/Jest.kt b/.teamcity/src/builds/test/Jest.kt new file mode 100644 index 0000000000000..58a76582b3967 --- /dev/null +++ b/.teamcity/src/builds/test/Jest.kt @@ -0,0 +1,26 @@ +package builds.test + +import addTestSettings +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import kibanaAgent + +object Jest : BuildType({ + name = "Jest Unit" + description = "Executes Jest Unit Tests" + + kibanaAgent(8) + + steps { + script { + name = "Jest Unit" + scriptContent = + """ + #!/bin/bash + yarn run grunt run:test_jest + """.trimIndent() + } + } + + addTestSettings() +}) diff --git a/.teamcity/src/builds/test/JestIntegration.kt b/.teamcity/src/builds/test/JestIntegration.kt new file mode 100644 index 0000000000000..aa7635ba5d9b9 --- /dev/null +++ b/.teamcity/src/builds/test/JestIntegration.kt @@ -0,0 +1,23 @@ +package builds.test + +import addTestSettings +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object JestIntegration : BuildType({ + name = "Jest Integration" + description = "Executes Jest Integration Tests" + + steps { + script { + name = "Jest Integration" + scriptContent = + """ + #!/bin/bash + yarn run grunt run:test_jest_integration + """.trimIndent() + } + } + + addTestSettings() +}) diff --git a/.teamcity/src/builds/test/QuickTests.kt b/.teamcity/src/builds/test/QuickTests.kt new file mode 100644 index 0000000000000..481b7537efbfe --- /dev/null +++ b/.teamcity/src/builds/test/QuickTests.kt @@ -0,0 +1,35 @@ +package builds.test + +import addTestSettings +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import kibanaAgent + +object QuickTests : BuildType({ + name = "Quick Tests" + description = "Executes Quick Tests" + + kibanaAgent(2) + + val testScripts = mapOf( + "Test Hardening" to ".ci/teamcity/tests/test_hardening.sh", + "X-Pack List cyclic dependency" to ".ci/teamcity/tests/xpack_list_cyclic_dependency.sh", + "X-Pack SIEM cyclic dependency" to ".ci/teamcity/tests/xpack_siem_cyclic_dependency.sh", + "Test Projects" to ".ci/teamcity/tests/test_projects.sh", + "Mocha Tests" to ".ci/teamcity/tests/mocha.sh" + ) + + steps { + for (testScript in testScripts) { + script { + name = testScript.key + scriptContent = """ + #!/bin/bash + ${testScript.value} + """.trimIndent() + } + } + } + + addTestSettings() +}) diff --git a/.teamcity/src/builds/test/XPackJest.kt b/.teamcity/src/builds/test/XPackJest.kt new file mode 100644 index 0000000000000..9d16108c756e1 --- /dev/null +++ b/.teamcity/src/builds/test/XPackJest.kt @@ -0,0 +1,27 @@ +package builds.test + +import addTestSettings +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import kibanaAgent + +object XPackJest : BuildType({ + name = "X-Pack Jest Unit" + description = "Executes X-Pack Jest Unit Tests" + + kibanaAgent(16) + + steps { + script { + name = "X-Pack Jest Unit" + scriptContent = + """ + #!/bin/bash + cd x-pack + node --max-old-space-size=6144 scripts/jest --ci --verbose --maxWorkers=6 + """.trimIndent() + } + } + + addTestSettings() +}) diff --git a/.teamcity/src/projects/EsSnapshots.kt b/.teamcity/src/projects/EsSnapshots.kt new file mode 100644 index 0000000000000..a5aa47d5cae48 --- /dev/null +++ b/.teamcity/src/projects/EsSnapshots.kt @@ -0,0 +1,55 @@ +package projects + +import builds.es_snapshots.* +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import templates.KibanaTemplate + +object EsSnapshotsProject : Project({ + id("ES_Snapshots") + name = "ES Snapshots" + + subProject { + id("ES_Snapshot_Tests") + name = "Tests" + + defaultTemplate = KibanaTemplate + + subProject { + id("ES_Snapshot_Tests_OSS") + name = "OSS Distro Tests" + + ossCloned.forEach { + buildType(it) + } + + buildType(OssTests) + } + + subProject { + id("ES_Snapshot_Tests_Default") + name = "Default Distro Tests" + + defaultCloned.forEach { + buildType(it) + } + + buildType(DefaultTests) + } + + subProject { + id("ES_Snapshot_Tests_Integration") + name = "Integration Tests" + + integrationCloned.forEach { + buildType(it) + } + + buildType(IntegrationTests) + } + } + + buildType(ESSnapshotBuild) + buildType(ESSnapshotPromote) + buildType(ESSnapshotPromoteImmediate) + buildType(Verify) +}) diff --git a/.teamcity/src/projects/Kibana.kt b/.teamcity/src/projects/Kibana.kt new file mode 100644 index 0000000000000..4e1dd43b6f900 --- /dev/null +++ b/.teamcity/src/projects/Kibana.kt @@ -0,0 +1,171 @@ +package projects + +import vcs.Kibana +import builds.* +import builds.default.* +import builds.oss.* +import builds.test.* +import jetbrains.buildServer.configs.kotlin.v2019_2.* +import jetbrains.buildServer.configs.kotlin.v2019_2.projectFeatures.slackConnection +import kibanaAgent +import templates.KibanaTemplate +import templates.DefaultTemplate +import vcs.Elasticsearch + +class KibanaConfiguration() { + var agentNetwork: String = "teamcity" + var agentSubnet: String = "teamcity" + + constructor(init: KibanaConfiguration.() -> Unit) : this() { + init() + } +} + +var kibanaConfiguration = KibanaConfiguration() + +fun Kibana(config: KibanaConfiguration = KibanaConfiguration()) : Project { + kibanaConfiguration = config + + return Project { + params { + param("teamcity.ui.settings.readOnly", "true") + + // https://github.com/JetBrains/teamcity-webhooks + param("teamcity.internal.webhooks.enable", "true") + param("teamcity.internal.webhooks.events", "BUILD_STARTED;BUILD_FINISHED;BUILD_INTERRUPTED;CHANGES_LOADED;BUILD_TYPE_ADDED_TO_QUEUE;BUILD_PROBLEMS_CHANGED") + param("teamcity.internal.webhooks.url", "https://ci-stats.kibana.dev/_teamcity_webhook") + param("teamcity.internal.webhooks.username", "automation") + password("teamcity.internal.webhooks.password", "credentialsJSON:b2ee34c5-fc89-4596-9b47-ecdeb68e4e7a", display = ParameterDisplay.HIDDEN) + } + + vcsRoot(Kibana) + vcsRoot(Elasticsearch) + + template(DefaultTemplate) + template(KibanaTemplate) + + defaultTemplate = DefaultTemplate + + features { + val sizes = listOf("2", "4", "8", "16") + for (size in sizes) { + kibanaAgent(size) + } + + kibanaAgent { + id = "KIBANA_C2_16" + param("source-id", "kibana-c2-16-") + param("machineType", "c2-standard-16") + } + + feature { + id = "kibana" + type = "CloudProfile" + param("agentPushPreset", "") + param("profileId", "kibana") + param("profileServerUrl", "") + param("name", "kibana") + param("total-work-time", "") + param("credentialsType", "key") + param("description", "") + param("next-hour", "") + param("cloud-code", "google") + param("terminate-after-build", "true") + param("terminate-idle-time", "30") + param("enabled", "true") + param("secure:accessKey", "credentialsJSON:447fdd4d-7129-46b7-9822-2e57658c7422") + } + + slackConnection { + id = "KIBANA_SLACK" + displayName = "Kibana Slack" + botToken = "credentialsJSON:39eafcfc-97a6-4877-82c1-115f1f10d14b" + clientId = "12985172978.1291178427153" + clientSecret = "credentialsJSON:8b5901fb-fd2c-4e45-8aff-fdd86dc68f67" + } + } + + subProject { + id("CI") + name = "CI" + defaultTemplate = KibanaTemplate + + buildType(Lint) + buildType(Checks) + + subProject { + id("Test") + name = "Test" + + subProject { + id("Jest") + name = "Jest" + + buildType(Jest) + buildType(XPackJest) + buildType(JestIntegration) + } + + buildType(ApiIntegration) + buildType(QuickTests) + buildType(AllTests) + } + + subProject { + id("OSS") + name = "OSS Distro" + + buildType(OssBuild) + + subProject { + id("OSS_Functional") + name = "Functional" + + buildType(OssCiGroups) + buildType(OssFirefox) + buildType(OssAccessibility) + buildType(OssPluginFunctional) + + subProject { + id("CIGroups") + name = "CI Groups" + + ossCiGroups.forEach { buildType(it) } + } + } + } + + subProject { + id("Default") + name = "Default Distro" + + buildType(DefaultBuild) + + subProject { + id("Default_Functional") + name = "Functional" + + buildType(DefaultCiGroups) + buildType(DefaultFirefox) + buildType(DefaultAccessibility) + buildType(DefaultSecuritySolution) + buildType(DefaultSavedObjectFieldMetrics) + + subProject { + id("Default_CIGroups") + name = "CI Groups" + + defaultCiGroups.forEach { buildType(it) } + } + } + } + + buildType(FullCi) + buildType(BaselineCi) + buildType(HourlyCi) + buildType(PullRequestCi) + } + + subProject(EsSnapshotsProject) + } +} diff --git a/.teamcity/src/templates/DefaultTemplate.kt b/.teamcity/src/templates/DefaultTemplate.kt new file mode 100644 index 0000000000000..762218b72ab10 --- /dev/null +++ b/.teamcity/src/templates/DefaultTemplate.kt @@ -0,0 +1,25 @@ +package templates + +import jetbrains.buildServer.configs.kotlin.v2019_2.Template +import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.perfmon + +object DefaultTemplate : Template({ + name = "Default Template" + + requirements { + equals("system.cloud.profile_id", "kibana", "RQ_CLOUD_PROFILE_ID") + startsWith("teamcity.agent.name", "kibana-standard-2-", "RQ_AGENT_NAME") + } + + params { + param("env.HOME", "/var/lib/jenkins") // TODO once the agent images are sorted out + } + + features { + perfmon { } + } + + failureConditions { + executionTimeoutMin = 120 + } +}) diff --git a/.teamcity/src/templates/KibanaTemplate.kt b/.teamcity/src/templates/KibanaTemplate.kt new file mode 100644 index 0000000000000..f39f3dc6411b0 --- /dev/null +++ b/.teamcity/src/templates/KibanaTemplate.kt @@ -0,0 +1,128 @@ +package templates + +import vcs.Kibana +import jetbrains.buildServer.configs.kotlin.v2019_2.BuildStep +import jetbrains.buildServer.configs.kotlin.v2019_2.ParameterDisplay +import jetbrains.buildServer.configs.kotlin.v2019_2.Template +import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.perfmon +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.placeholder +import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script + +object KibanaTemplate : Template({ + name = "Kibana Template" + description = "For builds that need to check out kibana and execute against the repo using node" + + vcs { + root(Kibana) + + checkoutDir = "kibana" +// checkoutDir = "/dev/shm/%system.teamcity.buildType.id%/%system.build.number%/kibana" + } + + requirements { + equals("system.cloud.profile_id", "kibana", "RQ_CLOUD_PROFILE_ID") + startsWith("teamcity.agent.name", "kibana-standard-2-", "RQ_AGENT_NAME") + } + + features { + perfmon { } + } + + failureConditions { + executionTimeoutMin = 120 + } + + params { + param("env.CI", "true") + param("env.TEAMCITY_CI", "true") + param("env.HOME", "/var/lib/jenkins") // TODO once the agent images are sorted out + + // TODO remove these + param("env.GCS_UPLOAD_PREFIX", "INVALID_PREFIX") + param("env.CI_PARALLEL_PROCESS_NUMBER", "1") + + param("env.TEAMCITY_URL", "%teamcity.serverUrl%") + param("env.TEAMCITY_BUILD_URL", "%teamcity.serverUrl%/build/%teamcity.build.id%") + param("env.TEAMCITY_JOB_ID", "%system.teamcity.buildType.id%") + param("env.TEAMCITY_BUILD_ID", "%build.number%") + param("env.TEAMCITY_BUILD_NUMBER", "%teamcity.build.id%") + + param("env.GIT_BRANCH", "%vcsroot.branch%") + param("env.GIT_COMMIT", "%build.vcs.number%") + param("env.branch_specifier", "%vcsroot.branch%") + + password("env.KIBANA_CI_STATS_CONFIG", "", display = ParameterDisplay.HIDDEN) + password("env.CI_STATS_TOKEN", "credentialsJSON:ea975068-ca68-4da5-8189-ce90f4286bc0", display = ParameterDisplay.HIDDEN) + password("env.CI_STATS_HOST", "credentialsJSON:933ba93e-4b06-44c1-8724-8c536651f2b6", display = ParameterDisplay.HIDDEN) + + // TODO move these to vault once the configuration is finalized + // password("env.CI_STATS_TOKEN", "%vault:kibana-issues:secret/kibana-issues/dev/kibana_ci_stats!/api_token%", display = ParameterDisplay.HIDDEN) + // password("env.CI_STATS_HOST", "%vault:kibana-issues:secret/kibana-issues/dev/kibana_ci_stats!/api_host%", display = ParameterDisplay.HIDDEN) + + // TODO remove this once we are able to pull it out of vault and put it closer to the things that require it + password("env.GITHUB_TOKEN", "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b", display = ParameterDisplay.HIDDEN) + password("env.KIBANA_CI_REPORTER_KEY", "", display = ParameterDisplay.HIDDEN) + password("env.KIBANA_CI_REPORTER_KEY_BASE64", "credentialsJSON:86878779-4cf7-4434-82af-5164a1b992fb", display = ParameterDisplay.HIDDEN) + + } + + steps { + script { + name = "Setup Environment" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/setup_env.sh + """.trimIndent() + } + + script { + name = "Setup Node and Yarn" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/setup_node.sh + """.trimIndent() + } + + script { + name = "Setup CI Stats" + scriptContent = + """ + #!/bin/bash + node .ci/teamcity/setup_ci_stats.js + """.trimIndent() + } + + script { + name = "Bootstrap" + scriptContent = + """ + #!/bin/bash + ./.ci/teamcity/bootstrap.sh + """.trimIndent() + } + + placeholder {} + + script { + name = "Set Build Status Success" + scriptContent = + """ + #!/bin/bash + echo "##teamcity[setParameter name='env.BUILD_STATUS' value='SUCCESS']" + """.trimIndent() + executionMode = BuildStep.ExecutionMode.RUN_ON_SUCCESS + } + + script { + name = "CI Stats Complete" + scriptContent = + """ + #!/bin/bash + node .ci/teamcity/ci_stats_complete.js + """.trimIndent() + executionMode = BuildStep.ExecutionMode.RUN_ON_FAILURE + } + } +}) diff --git a/.teamcity/src/vcs/Elasticsearch.kt b/.teamcity/src/vcs/Elasticsearch.kt new file mode 100644 index 0000000000000..ab7120b854446 --- /dev/null +++ b/.teamcity/src/vcs/Elasticsearch.kt @@ -0,0 +1,11 @@ +package vcs + +import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot + +object Elasticsearch : GitVcsRoot({ + id("elasticsearch_master") + + name = "elasticsearch / master" + url = "https://github.com/elastic/elasticsearch.git" + branch = "refs/heads/master" +}) diff --git a/.teamcity/src/vcs/Kibana.kt b/.teamcity/src/vcs/Kibana.kt new file mode 100644 index 0000000000000..d847a1565e6e0 --- /dev/null +++ b/.teamcity/src/vcs/Kibana.kt @@ -0,0 +1,11 @@ +package vcs + +import jetbrains.buildServer.configs.kotlin.v2019_2.vcs.GitVcsRoot + +object Kibana : GitVcsRoot({ + id("kibana_master") + + name = "kibana / master" + url = "https://github.com/elastic/kibana.git" + branch = "refs/heads/master_teamcity" +}) diff --git a/.teamcity/tests/projects/KibanaTest.kt b/.teamcity/tests/projects/KibanaTest.kt new file mode 100644 index 0000000000000..389761edd60af --- /dev/null +++ b/.teamcity/tests/projects/KibanaTest.kt @@ -0,0 +1,33 @@ +package projects + +import org.junit.Assert.* +import org.junit.Test + +val TestConfig = KibanaConfiguration { + agentNetwork = "network" + agentSubnet = "subnet" +} + +class KibanaTest { + @Test + fun test_Default_Configuration_Exists() { + assertNotNull(kibanaConfiguration) + Kibana() + assertEquals("teamcity", kibanaConfiguration.agentNetwork) + } + + @Test + fun test_CloudImages_Exist() { + val project = Kibana(TestConfig) + + assertTrue(project.features.items.any { + it.type == "CloudImage" && it.params.any { param -> param.name == "network" && param.value == "network"} + }) + } + + @Test + fun test_ESVerify() { + val project = Kibana() + assertTrue(true) + } +} diff --git a/packages/kbn-test/src/failed_tests_reporter/report_failure.test.ts b/packages/kbn-test/src/failed_tests_reporter/report_failure.test.ts index 5bbc72fe04e86..910c9ad246700 100644 --- a/packages/kbn-test/src/failed_tests_reporter/report_failure.test.ts +++ b/packages/kbn-test/src/failed_tests_reporter/report_failure.test.ts @@ -19,7 +19,7 @@ import dedent from 'dedent'; -import { createFailureIssue, updateFailureIssue } from './report_failure'; +import { createFailureIssue, getCiType, updateFailureIssue } from './report_failure'; jest.mock('./github_api'); const { GithubApi } = jest.requireMock('./github_api'); @@ -51,7 +51,7 @@ describe('createFailureIssue()', () => { this is the failure text \`\`\` - First failure: [Jenkins Build](https://build-url) + First failure: [${getCiType()} Build](https://build-url) ", Array [ @@ -111,7 +111,7 @@ describe('updateFailureIssue()', () => { "calls": Array [ Array [ 1234, - "New failure: [Jenkins Build](https://build-url)", + "New failure: [${getCiType()} Build](https://build-url)", ], ], "results": Array [ diff --git a/packages/kbn-test/src/failed_tests_reporter/report_failure.ts b/packages/kbn-test/src/failed_tests_reporter/report_failure.ts index 1413d05498459..30ec6ab939560 100644 --- a/packages/kbn-test/src/failed_tests_reporter/report_failure.ts +++ b/packages/kbn-test/src/failed_tests_reporter/report_failure.ts @@ -21,6 +21,10 @@ import { TestFailure } from './get_failures'; import { GithubIssueMini, GithubApi } from './github_api'; import { getIssueMetadata, updateIssueMetadata } from './issue_metadata'; +export function getCiType() { + return process.env.TEAMCITY_CI ? 'TeamCity' : 'Jenkins'; +} + export async function createFailureIssue(buildUrl: string, failure: TestFailure, api: GithubApi) { const title = `Failing test: ${failure.classname} - ${failure.name}`; @@ -32,7 +36,7 @@ export async function createFailureIssue(buildUrl: string, failure: TestFailure, failure.failure, '```', '', - `First failure: [Jenkins Build](${buildUrl})`, + `First failure: [${getCiType()} Build](${buildUrl})`, ].join('\n'), { 'test.class': failure.classname, @@ -52,7 +56,7 @@ export async function updateFailureIssue(buildUrl: string, issue: GithubIssueMin }); await api.editIssueBodyAndEnsureOpen(issue.number, newBody); - await api.addIssueComment(issue.number, `New failure: [Jenkins Build](${buildUrl})`); + await api.addIssueComment(issue.number, `New failure: [${getCiType()} Build](${buildUrl})`); return newCount; } diff --git a/packages/kbn-test/src/failed_tests_reporter/run_failed_tests_reporter_cli.ts b/packages/kbn-test/src/failed_tests_reporter/run_failed_tests_reporter_cli.ts index 93616ce78a04a..491b7000ec9f0 100644 --- a/packages/kbn-test/src/failed_tests_reporter/run_failed_tests_reporter_cli.ts +++ b/packages/kbn-test/src/failed_tests_reporter/run_failed_tests_reporter_cli.ts @@ -33,6 +33,17 @@ import { getReportMessageIter } from './report_metadata'; const DEFAULT_PATTERNS = [Path.resolve(REPO_ROOT, 'target/junit/**/*.xml')]; +const getBranch = () => { + if (process.env.TEAMCITY_CI) { + return (process.env.GIT_BRANCH || '').replace(/^refs\/heads\//, ''); + } else { + // JOB_NAME is formatted as `elastic+kibana+7.x` in some places and `elastic+kibana+7.x/JOB=kibana-intake,node=immutable` in others + const jobNameSplit = (process.env.JOB_NAME || '').split(/\+|\//); + const branch = jobNameSplit.length >= 3 ? jobNameSplit[2] : process.env.GIT_BRANCH; + return branch; + } +}; + export function runFailedTestsReporterCli() { run( async ({ log, flags }) => { @@ -44,16 +55,14 @@ export function runFailedTestsReporterCli() { } if (updateGithub) { - // JOB_NAME is formatted as `elastic+kibana+7.x` in some places and `elastic+kibana+7.x/JOB=kibana-intake,node=immutable` in others - const jobNameSplit = (process.env.JOB_NAME || '').split(/\+|\//); - const branch = jobNameSplit.length >= 3 ? jobNameSplit[2] : process.env.GIT_BRANCH; + const branch = getBranch(); if (!branch) { throw createFailError( 'Unable to determine originating branch from job name or other environment variables' ); } - const isPr = !!process.env.ghprbPullId; + const isPr = !!process.env.GITHUB_PR_NUMBER; const isMasterOrVersion = branch === 'master' || branch.match(/^\d+\.(x|\d+)$/); if (!isMasterOrVersion || isPr) { log.info('Failure issues only created on master/version branch jobs'); @@ -69,7 +78,9 @@ export function runFailedTestsReporterCli() { const buildUrl = flags['build-url'] || (updateGithub ? '' : 'http://buildUrl'); if (typeof buildUrl !== 'string' || !buildUrl) { - throw createFlagError('Missing --build-url or process.env.BUILD_URL'); + throw createFlagError( + 'Missing --build-url, process.env.TEAMCITY_BUILD_URL, or process.env.BUILD_URL' + ); } const patterns = flags._.length ? flags._ : DEFAULT_PATTERNS; @@ -161,12 +172,12 @@ export function runFailedTestsReporterCli() { default: { 'github-update': true, 'report-update': true, - 'build-url': process.env.BUILD_URL, + 'build-url': process.env.TEAMCITY_BUILD_URL || process.env.BUILD_URL, }, help: ` --no-github-update Execute the CLI without writing to Github --no-report-update Execute the CLI without writing to the JUnit reports - --build-url URL of the failed build, defaults to process.env.BUILD_URL + --build-url URL of the failed build, defaults to process.env.TEAMCITY_BUILD_URL or process.env.BUILD_URL `, }, } diff --git a/packages/kbn-test/src/mocha/__tests__/junit_report_generation.js b/packages/kbn-test/src/mocha/__tests__/junit_report_generation.js index 00a11432dd9e8..d3487e8d0fd1e 100644 --- a/packages/kbn-test/src/mocha/__tests__/junit_report_generation.js +++ b/packages/kbn-test/src/mocha/__tests__/junit_report_generation.js @@ -68,6 +68,7 @@ describe('dev/mocha/junit report generation', () => { expect(testsuite).to.eql({ $: { failures: '2', + name: 'test', skipped: '1', tests: '4', time: testsuite.$.time, diff --git a/packages/kbn-test/src/mocha/junit_report_generation.js b/packages/kbn-test/src/mocha/junit_report_generation.js index 7e39c32ee4db8..aa27263bb2923 100644 --- a/packages/kbn-test/src/mocha/junit_report_generation.js +++ b/packages/kbn-test/src/mocha/junit_report_generation.js @@ -108,6 +108,7 @@ export function setupJUnitReportGeneration(runner, options = {}) { ); const testsuitesEl = builder.ele('testsuite', { + name: reportName, timestamp: new Date(stats.startTime).toISOString().slice(0, -5), time: getDuration(stats), tests: allTests.length + failedHooks.length, diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index 9cd6ca6801bc3..d62c4eac9ce9c 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -69,8 +69,11 @@ export const IGNORE_FILE_GLOBS = [ 'x-pack/plugins/apm/e2e/**/*', 'x-pack/plugins/maps/server/fonts/**/*', + // packages for the ingest manager's api integration tests could be valid semver which has dashes 'x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/**/*', + + '.teamcity/**/*', ]; /** diff --git a/x-pack/test/api_integration/apis/security_solution/feature_controls.ts b/x-pack/test/api_integration/apis/security_solution/feature_controls.ts index c2dfd28d5c844..0137a90ce9817 100644 --- a/x-pack/test/api_integration/apis/security_solution/feature_controls.ts +++ b/x-pack/test/api_integration/apis/security_solution/feature_controls.ts @@ -82,10 +82,11 @@ export default function ({ getService }: FtrProviderContext) { }; describe('feature controls', () => { - let isProd = false; + let isProdOrCi = false; before(() => { const kbnConfig = config.get('servers.kibana'); - isProd = kbnConfig.hostname === 'localhost' && kbnConfig.port === 5620 ? false : true; + isProdOrCi = + !!process.env.CI || !(kbnConfig.hostname === 'localhost' && kbnConfig.port === 5620); }); it(`APIs can't be accessed by user with no privileges`, async () => { const username = 'logstash_read'; @@ -135,7 +136,7 @@ export default function ({ getService }: FtrProviderContext) { expectGraphQLResponse(graphQLResult); const graphQLIResult = await executeGraphIQLRequest(username, password); - if (!isProd) { + if (!isProdOrCi) { expectGraphIQLResponse(graphQLIResult); } else { expectGraphIQL404(graphQLIResult); @@ -234,7 +235,7 @@ export default function ({ getService }: FtrProviderContext) { expectGraphQLResponse(graphQLResult); const graphQLIResult = await executeGraphIQLRequest(username, password, space1Id); - if (!isProd) { + if (!isProdOrCi) { expectGraphIQLResponse(graphQLIResult); } else { expectGraphIQL404(graphQLIResult); From 2037198457a61d4a9e9bc2ad585daffdc91dc72b Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 19 Oct 2020 14:41:49 -0400 Subject: [PATCH 02/39] Read ES_BUILD_JAVA from file --- .ci/teamcity/es_snapshots/build.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.ci/teamcity/es_snapshots/build.sh b/.ci/teamcity/es_snapshots/build.sh index 211de58b757a5..10050cd30bf5c 100755 --- a/.ci/teamcity/es_snapshots/build.sh +++ b/.ci/teamcity/es_snapshots/build.sh @@ -17,8 +17,7 @@ export BUILD_URL="" export JOB_NAME="" export NODE_NAME="" -# TODO ES_BUILD_JAVA = openjdk14 -- .ci/java-versions.properties -export ES_BUILD_JAVA="openjdk14" +export "$(grep '^ES_BUILD_JAVA' .ci/java-versions.properties | xargs)" export PATH="$HOME/.java/$ES_BUILD_JAVA/bin:$PATH" export JAVA_HOME="$HOME/.java/$ES_BUILD_JAVA" @@ -26,8 +25,6 @@ tc_start_block "Build Elasticsearch" ./gradlew -Dbuild.docker=true assemble --parallel tc_end_block "Build Elasticsearch" -# mkdir -p ${destination} - tc_start_block "Create distribution archives" find distribution -type f \( -name 'elasticsearch-*-*-*-*.tar.gz' -o -name 'elasticsearch-*-*-*-*.zip' \) -not -path '*no-jdk*' -not -path '*build-context*' -exec cp {} "$destination" \; tc_end_block "Create distribution archives" From 55ffb6737e4179986403b76789e34aa762daaf1d Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 19 Oct 2020 16:39:42 -0400 Subject: [PATCH 03/39] Add bundle limits check --- .ci/teamcity/checks/bundle_limits.sh | 7 +++++++ .teamcity/src/builds/Checks.kt | 1 + 2 files changed, 8 insertions(+) create mode 100755 .ci/teamcity/checks/bundle_limits.sh diff --git a/.ci/teamcity/checks/bundle_limits.sh b/.ci/teamcity/checks/bundle_limits.sh new file mode 100755 index 0000000000000..3f7daef6d0473 --- /dev/null +++ b/.ci/teamcity/checks/bundle_limits.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +source "$(dirname "${0}")/../util.sh" + +node scripts/build_kibana_platform_plugins --validate-limits diff --git a/.teamcity/src/builds/Checks.kt b/.teamcity/src/builds/Checks.kt index 2bf7925fb30b2..a4da43b8c9f3e 100644 --- a/.teamcity/src/builds/Checks.kt +++ b/.teamcity/src/builds/Checks.kt @@ -20,6 +20,7 @@ object Checks : BuildType({ "Test Hardening" to ".ci/teamcity/checks/test_hardening.sh", "Check Types" to ".ci/teamcity/checks/type_check.sh", "Check Doc API Changes" to ".ci/teamcity/checks/doc_api_changes.sh", + "Check Bundle Limits" to ".ci/teamcity/checks/bundle_limits.sh", "Check i18n" to ".ci/teamcity/checks/i18n.sh" ) From 1a96deaf5e785dfc7701ca53b85033e4a5b7cff3 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 20 Oct 2020 11:51:48 -0400 Subject: [PATCH 04/39] Try runbld --- .teamcity/src/Extensions.kt | 31 +++++++++++++++++++++++++ .teamcity/src/builds/test/QuickTests.kt | 16 +++++++------ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index f9594ab818e17..3f02209fd3d6c 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -137,3 +137,34 @@ fun BuildSteps.failedTestReporter(init: ScriptBuildStep.() -> Unit = {}) { init() } } + +fun BuildSteps.runbld(stepName: String, script: String) { + script { + name = stepName + scriptContent = + """ + #!/bin/bash + branchName="${'$'}GIT_BRANCH" + if [[ "${'$'}GITHUB_PR_NUMBER" ]]; then + branchName=pull-request + fi + + project=kibana + if [[ "${'$'}ES_SNAPSHOT_MANIFEST" ]]; then + project=kibana-es-snapshot-verify + fi + + # These parameters are only for runbld reporting + export JENKINS_HOME="${'$'}HOME" + export BUILD_URL="%teamcity.serverUrl%/build/%teamcity.build.id%" + export branch_specifier=${'$'}branchName + export NODE_LABELS='teamcity' + export BUILD_NUMBER="%build.number%" + export EXECUTOR_NUMBER='' + export NODE_NAME='' + + /usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" $script + """.trimIndent() + executionMode = BuildStep.ExecutionMode.RUN_ON_FAILURE + } +} diff --git a/.teamcity/src/builds/test/QuickTests.kt b/.teamcity/src/builds/test/QuickTests.kt index 481b7537efbfe..1c7ffe9b3f0ff 100644 --- a/.teamcity/src/builds/test/QuickTests.kt +++ b/.teamcity/src/builds/test/QuickTests.kt @@ -4,6 +4,7 @@ import addTestSettings import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script import kibanaAgent +import runbld object QuickTests : BuildType({ name = "Quick Tests" @@ -21,13 +22,14 @@ object QuickTests : BuildType({ steps { for (testScript in testScripts) { - script { - name = testScript.key - scriptContent = """ - #!/bin/bash - ${testScript.value} - """.trimIndent() - } + runbld(testScript.key, testScript.value) +// script { +// name = testScript.key +// scriptContent = """ +// #!/bin/bash +// ${testScript.value} +// """.trimIndent() +// } } } From f86beae85099806663eb97997fcc0688ed3075d3 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 20 Oct 2020 12:13:55 -0400 Subject: [PATCH 05/39] Remove refs/heads/ prefix from runbld branch name --- .teamcity/src/Extensions.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index 3f02209fd3d6c..4075e2a842ab6 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -145,6 +145,8 @@ fun BuildSteps.runbld(stepName: String, script: String) { """ #!/bin/bash branchName="${'$'}GIT_BRANCH" + branchName="${'$'}{branchName#refs\/heads\/}" + if [[ "${'$'}GITHUB_PR_NUMBER" ]]; then branchName=pull-request fi From f44d4d019fa8ab69415bdb926bbb0b8a4a112fb5 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 20 Oct 2020 12:48:15 -0400 Subject: [PATCH 06/39] runbld --- .teamcity/src/Extensions.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index 4075e2a842ab6..51d381fb9335b 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -165,7 +165,15 @@ fun BuildSteps.runbld(stepName: String, script: String) { export EXECUTOR_NUMBER='' export NODE_NAME='' - /usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" $script + export OLD_PATH="${'$'}PATH" + + file=${'$'}(mktemp) + + echo '#!/bin/bash' > ${'$'}file + echo 'export PATH="${'$'}OLD_PATH"' >> ${'$'}file + echo 'bash $script' > ${'$'}' >> file + + /usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" ${'$'}file """.trimIndent() executionMode = BuildStep.ExecutionMode.RUN_ON_FAILURE } From 5b35584f4dba0b662aa68e8b193eb2b4b048f535 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 20 Oct 2020 12:49:44 -0400 Subject: [PATCH 07/39] Fix script --- .teamcity/src/Extensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index 51d381fb9335b..5aa00f3f3daff 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -171,7 +171,7 @@ fun BuildSteps.runbld(stepName: String, script: String) { echo '#!/bin/bash' > ${'$'}file echo 'export PATH="${'$'}OLD_PATH"' >> ${'$'}file - echo 'bash $script' > ${'$'}' >> file + echo 'bash $script' > ${'$'}' >> ${'$'}file /usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" ${'$'}file """.trimIndent() From 2fa4e1c1b3f374c195398fae0ef8594db0f00354 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 20 Oct 2020 12:50:53 -0400 Subject: [PATCH 08/39] Another fix --- .teamcity/src/Extensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index 5aa00f3f3daff..797f300ba86a3 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -171,7 +171,7 @@ fun BuildSteps.runbld(stepName: String, script: String) { echo '#!/bin/bash' > ${'$'}file echo 'export PATH="${'$'}OLD_PATH"' >> ${'$'}file - echo 'bash $script' > ${'$'}' >> ${'$'}file + echo 'bash $script' >> ${'$'}file /usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" ${'$'}file """.trimIndent() From b3b83ec05733e8f66d6d7e8532814e4ba55f8410 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 20 Oct 2020 14:23:25 -0400 Subject: [PATCH 09/39] Use ci-stats for slack notifications --- .teamcity/src/Extensions.kt | 42 ++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index 797f300ba86a3..f2b064f72a1ca 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -87,26 +87,30 @@ fun BuildType.addTestArtifacts() { this.artifactRules += "\n" + testArtifactRules } -fun BuildType.addSlackNotifications(to: String = "#kibana-teamcity-testing") { - features { - notifications { - notifierSettings = slackNotifier { - connection = "KIBANA_SLACK" - sendTo = to - messageFormat = verboseMessageFormat { - addBranch = true - addChanges = true - addStatusText = true - maximumNumberOfChanges = 5 - } - } - buildFailedToStart = true - buildFailed = true - buildFinishedSuccessfully = false - firstBuildErrorOccurs = true - buildProbablyHanging = true - } +fun BuildType.addSlackNotifications(to: String = "C019TKJ363F") { + params { + param("elastic.slack.enabled", "true") + param("elastic.slack.channels", to) } +// features { +// notifications { +// notifierSettings = slackNotifier { +// connection = "KIBANA_SLACK" +// sendTo = to +// messageFormat = verboseMessageFormat { +// addBranch = true +// addChanges = true +// addStatusText = true +// maximumNumberOfChanges = 5 +// } +// } +// buildFailedToStart = true +// buildFailed = true +// buildFinishedSuccessfully = false +// firstBuildErrorOccurs = true +// buildProbablyHanging = true +// } +// } } fun BuildType.dependsOn(buildType: BuildType, init: SnapshotDependency.() -> Unit = {}) { From 56060977b1d39c56f43e3fa1c32b4427ff3ebf3b Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 20 Oct 2020 14:54:03 -0400 Subject: [PATCH 10/39] Update runbld invocation and move more steps to runbld --- .teamcity/src/Extensions.kt | 12 ++++++++---- .teamcity/src/builds/oss/OssAccessibility.kt | 10 ++-------- .teamcity/src/builds/oss/OssCiGroup.kt | 11 ++--------- .teamcity/src/builds/oss/OssFirefox.kt | 11 ++--------- .teamcity/src/builds/oss/OssPluginFunctional.kt | 13 +++++-------- 5 files changed, 19 insertions(+), 38 deletions(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index f2b064f72a1ca..315eae62d1096 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -173,12 +173,16 @@ fun BuildSteps.runbld(stepName: String, script: String) { file=${'$'}(mktemp) - echo '#!/bin/bash' > ${'$'}file - echo 'export PATH="${'$'}OLD_PATH"' >> ${'$'}file - echo 'bash $script' >> ${'$'}file + ( + cat < ${'$'}file /usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" ${'$'}file - """.trimIndent() + """.trimIndent() executionMode = BuildStep.ExecutionMode.RUN_ON_FAILURE } } diff --git a/.teamcity/src/builds/oss/OssAccessibility.kt b/.teamcity/src/builds/oss/OssAccessibility.kt index dc555a74a7361..8e4a7acd77b76 100644 --- a/.teamcity/src/builds/oss/OssAccessibility.kt +++ b/.teamcity/src/builds/oss/OssAccessibility.kt @@ -1,19 +1,13 @@ package builds.oss import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import runbld object OssAccessibility : OssFunctionalBase({ id("OssAccessibility") name = "Accessibility" steps { - script { - name = "OSS Accessibility" - scriptContent = - """ - #!/bin/bash - ./.ci/teamcity/oss/accessibility.sh - """.trimIndent() - } + runbld("OSS Accessibility", "./.ci/teamcity/oss/accessibility.sh") } }) diff --git a/.teamcity/src/builds/oss/OssCiGroup.kt b/.teamcity/src/builds/oss/OssCiGroup.kt index ed8fd3ead1748..1c188cd4c175f 100644 --- a/.teamcity/src/builds/oss/OssCiGroup.kt +++ b/.teamcity/src/builds/oss/OssCiGroup.kt @@ -1,21 +1,14 @@ package builds.oss import jetbrains.buildServer.configs.kotlin.v2019_2.* -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import runbld class OssCiGroup(val ciGroup: Int, init: BuildType.() -> Unit = {}) : OssFunctionalBase({ id("OssCiGroup_$ciGroup") name = "CI Group $ciGroup" steps { - script { - name = "OSS CI Group $ciGroup" - scriptContent = - """ - #!/bin/bash - ./.ci/teamcity/oss/ci_group.sh $ciGroup - """.trimIndent() - } + runbld("OSS CI Group $ciGroup", "./.ci/teamcity/oss/ci_group.sh $ciGroup") } init() diff --git a/.teamcity/src/builds/oss/OssFirefox.kt b/.teamcity/src/builds/oss/OssFirefox.kt index 3f0ec4c017c2a..2db8314fa44fc 100644 --- a/.teamcity/src/builds/oss/OssFirefox.kt +++ b/.teamcity/src/builds/oss/OssFirefox.kt @@ -1,19 +1,12 @@ package builds.oss -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import runbld object OssFirefox : OssFunctionalBase({ id("OssFirefox") name = "Firefox" steps { - script { - name = "OSS Firefox" - scriptContent = - """ - #!/bin/bash - ./.ci/teamcity/oss/firefox.sh - """.trimIndent() - } + runbld("OSS Firefox", "./.ci/teamcity/oss/firefox.sh") } }) diff --git a/.teamcity/src/builds/oss/OssPluginFunctional.kt b/.teamcity/src/builds/oss/OssPluginFunctional.kt index d3ebd554d9fba..7fbf863820e4c 100644 --- a/.teamcity/src/builds/oss/OssPluginFunctional.kt +++ b/.teamcity/src/builds/oss/OssPluginFunctional.kt @@ -1,6 +1,8 @@ package builds.oss +import addTestSettings import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import runbld object OssPluginFunctional : OssFunctionalBase({ id("OssPluginFunctional") @@ -16,17 +18,12 @@ object OssPluginFunctional : OssFunctionalBase({ """.trimIndent() } - script { - name = "OSS Plugin Functional" - scriptContent = - """ - #!/bin/bash - ./.ci/teamcity/oss/plugin_functional.sh - """.trimIndent() - } + runbld("OSS Plugin Functional", "./.ci/teamcity/oss/plugin_functional.sh") } dependencies { ossBuild() } + + addTestSettings() }) From d665518ce6c6222d4a8664db4f2c29cf0262522f Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 20 Oct 2020 14:58:19 -0400 Subject: [PATCH 11/39] Remove accidental RUN_ON_FAILURE --- .teamcity/src/Extensions.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index 315eae62d1096..67643b1cbdfa8 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -183,6 +183,5 @@ fun BuildSteps.runbld(stepName: String, script: String) { /usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" ${'$'}file """.trimIndent() - executionMode = BuildStep.ExecutionMode.RUN_ON_FAILURE } } From 26b5c58400310e36ede7ce670aeb93bcb19d5617 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 20 Oct 2020 16:08:16 -0400 Subject: [PATCH 12/39] Update slack channel default --- .teamcity/src/Extensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index 67643b1cbdfa8..4f746f4b96430 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -87,7 +87,7 @@ fun BuildType.addTestArtifacts() { this.artifactRules += "\n" + testArtifactRules } -fun BuildType.addSlackNotifications(to: String = "C019TKJ363F") { +fun BuildType.addSlackNotifications(to: String = "#kibana-teamcity-testing") { params { param("elastic.slack.enabled", "true") param("elastic.slack.channels", to) From f89b3f7a3cdf6c549c8cf179b7ad5a7a95a3da1f Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Tue, 20 Oct 2020 17:38:56 -0400 Subject: [PATCH 13/39] Wrap all build tasks in runbld --- .../src/builds/default/DefaultAccessibility.kt | 11 ++--------- .teamcity/src/builds/default/DefaultCiGroup.kt | 11 ++--------- .teamcity/src/builds/default/DefaultFirefox.kt | 11 ++--------- .../src/builds/default/DefaultSecuritySolution.kt | 14 +++++--------- .teamcity/src/builds/test/ApiIntegration.kt | 11 ++--------- .teamcity/src/builds/test/Jest.kt | 11 ++--------- .teamcity/src/builds/test/JestIntegration.kt | 11 ++--------- .teamcity/src/builds/test/QuickTests.kt | 8 -------- .teamcity/src/builds/test/XPackJest.kt | 15 +++++---------- 9 files changed, 22 insertions(+), 81 deletions(-) diff --git a/.teamcity/src/builds/default/DefaultAccessibility.kt b/.teamcity/src/builds/default/DefaultAccessibility.kt index a7e6f831d0da4..f0a9c60cf3e45 100755 --- a/.teamcity/src/builds/default/DefaultAccessibility.kt +++ b/.teamcity/src/builds/default/DefaultAccessibility.kt @@ -1,19 +1,12 @@ package builds.default -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import runbld object DefaultAccessibility : DefaultFunctionalBase({ id("DefaultAccessibility") name = "Accessibility" steps { - script { - name = "Default Accessibility" - scriptContent = - """ - #!/bin/bash - ./.ci/teamcity/default/accessibility.sh - """.trimIndent() - } + runbld("Default Accessibility", "./.ci/teamcity/default/accessibility.sh") } }) diff --git a/.teamcity/src/builds/default/DefaultCiGroup.kt b/.teamcity/src/builds/default/DefaultCiGroup.kt index e62ff5fe91bef..7dbe9cd0ba84c 100755 --- a/.teamcity/src/builds/default/DefaultCiGroup.kt +++ b/.teamcity/src/builds/default/DefaultCiGroup.kt @@ -1,21 +1,14 @@ package builds.default import jetbrains.buildServer.configs.kotlin.v2019_2.* -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import runbld class DefaultCiGroup(val ciGroup: Int = 0, init: BuildType.() -> Unit = {}) : DefaultFunctionalBase({ id("DefaultCiGroup_$ciGroup") name = "CI Group $ciGroup" steps { - script { - name = "Default CI Group $ciGroup" - scriptContent = - """ - #!/bin/bash - ./.ci/teamcity/default/ci_group.sh $ciGroup - """.trimIndent() - } + runbld("Default CI Group $ciGroup", "./.ci/teamcity/default/ci_group.sh $ciGroup") } init() diff --git a/.teamcity/src/builds/default/DefaultFirefox.kt b/.teamcity/src/builds/default/DefaultFirefox.kt index e7850b746e843..2429967d24939 100755 --- a/.teamcity/src/builds/default/DefaultFirefox.kt +++ b/.teamcity/src/builds/default/DefaultFirefox.kt @@ -1,19 +1,12 @@ package builds.default -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import runbld object DefaultFirefox : DefaultFunctionalBase({ id("DefaultFirefox") name = "Firefox" steps { - script { - name = "Default Firefox" - scriptContent = - """ - #!/bin/bash - ./.ci/teamcity/default/firefox.sh - """.trimIndent() - } + runbld("Default Firefox", "./.ci/teamcity/default/firefox.sh") } }) diff --git a/.teamcity/src/builds/default/DefaultSecuritySolution.kt b/.teamcity/src/builds/default/DefaultSecuritySolution.kt index 5cd335c1fc961..1c3b85257c28a 100755 --- a/.teamcity/src/builds/default/DefaultSecuritySolution.kt +++ b/.teamcity/src/builds/default/DefaultSecuritySolution.kt @@ -1,19 +1,15 @@ package builds.default -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import addTestSettings +import runbld object DefaultSecuritySolution : DefaultFunctionalBase({ id("DefaultSecuritySolution") name = "Security Solution" steps { - script { - name = "Default Security Solution" - scriptContent = - """ - #!/bin/bash - ./.ci/teamcity/default/security_solution.sh - """.trimIndent() - } + runbld("Default Security Solution", "./.ci/teamcity/default/security_solution.sh") } + + addTestSettings() }) diff --git a/.teamcity/src/builds/test/ApiIntegration.kt b/.teamcity/src/builds/test/ApiIntegration.kt index e4820e231c999..edc7817336fc1 100644 --- a/.teamcity/src/builds/test/ApiIntegration.kt +++ b/.teamcity/src/builds/test/ApiIntegration.kt @@ -2,21 +2,14 @@ package builds.test import addTestSettings import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import runbld object ApiIntegration : BuildType({ name = "API Integration" description = "Executes API Integration Tests" steps { - script { - name = "API Integration" - scriptContent = - """ - #!/bin/bash - yarn run grunt run:apiIntegrationTests - """.trimIndent() - } + runbld("API Integration", "yarn run grunt run:apiIntegrationTests") } addTestSettings() diff --git a/.teamcity/src/builds/test/Jest.kt b/.teamcity/src/builds/test/Jest.kt index 58a76582b3967..04217a4e99b1c 100644 --- a/.teamcity/src/builds/test/Jest.kt +++ b/.teamcity/src/builds/test/Jest.kt @@ -2,8 +2,8 @@ package builds.test import addTestSettings import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script import kibanaAgent +import runbld object Jest : BuildType({ name = "Jest Unit" @@ -12,14 +12,7 @@ object Jest : BuildType({ kibanaAgent(8) steps { - script { - name = "Jest Unit" - scriptContent = - """ - #!/bin/bash - yarn run grunt run:test_jest - """.trimIndent() - } + runbld("Jest Unit", "yarn run grunt run:test_jest") } addTestSettings() diff --git a/.teamcity/src/builds/test/JestIntegration.kt b/.teamcity/src/builds/test/JestIntegration.kt index aa7635ba5d9b9..9ec1360dcb1d7 100644 --- a/.teamcity/src/builds/test/JestIntegration.kt +++ b/.teamcity/src/builds/test/JestIntegration.kt @@ -2,21 +2,14 @@ package builds.test import addTestSettings import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script +import runbld object JestIntegration : BuildType({ name = "Jest Integration" description = "Executes Jest Integration Tests" steps { - script { - name = "Jest Integration" - scriptContent = - """ - #!/bin/bash - yarn run grunt run:test_jest_integration - """.trimIndent() - } + runbld("Jest Integration", "yarn run grunt run:test_jest_integration") } addTestSettings() diff --git a/.teamcity/src/builds/test/QuickTests.kt b/.teamcity/src/builds/test/QuickTests.kt index 1c7ffe9b3f0ff..1fdb1e366e83f 100644 --- a/.teamcity/src/builds/test/QuickTests.kt +++ b/.teamcity/src/builds/test/QuickTests.kt @@ -2,7 +2,6 @@ package builds.test import addTestSettings import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script import kibanaAgent import runbld @@ -23,13 +22,6 @@ object QuickTests : BuildType({ steps { for (testScript in testScripts) { runbld(testScript.key, testScript.value) -// script { -// name = testScript.key -// scriptContent = """ -// #!/bin/bash -// ${testScript.value} -// """.trimIndent() -// } } } diff --git a/.teamcity/src/builds/test/XPackJest.kt b/.teamcity/src/builds/test/XPackJest.kt index 9d16108c756e1..1958d39183bae 100644 --- a/.teamcity/src/builds/test/XPackJest.kt +++ b/.teamcity/src/builds/test/XPackJest.kt @@ -2,8 +2,8 @@ package builds.test import addTestSettings import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType -import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script import kibanaAgent +import runbld object XPackJest : BuildType({ name = "X-Pack Jest Unit" @@ -12,15 +12,10 @@ object XPackJest : BuildType({ kibanaAgent(16) steps { - script { - name = "X-Pack Jest Unit" - scriptContent = - """ - #!/bin/bash - cd x-pack - node --max-old-space-size=6144 scripts/jest --ci --verbose --maxWorkers=6 - """.trimIndent() - } + runbld("X-Pack Jest Unit", """ + cd x-pack + node --max-old-space-size=6144 scripts/jest --ci --verbose --maxWorkers=6 + """.trimIndent()) } addTestSettings() From 1dadd7efbdb4764d1f84adb03b553040cd6d84c2 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Wed, 21 Oct 2020 13:01:56 -0400 Subject: [PATCH 14/39] Fix runbld heredoc --- .teamcity/src/Extensions.kt | 75 +++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 37 deletions(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index 4f746f4b96430..e3508aebc0424 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -145,43 +145,44 @@ fun BuildSteps.failedTestReporter(init: ScriptBuildStep.() -> Unit = {}) { fun BuildSteps.runbld(stepName: String, script: String) { script { name = stepName - scriptContent = - """ - #!/bin/bash - branchName="${'$'}GIT_BRANCH" - branchName="${'$'}{branchName#refs\/heads\/}" - - if [[ "${'$'}GITHUB_PR_NUMBER" ]]; then - branchName=pull-request - fi - - project=kibana - if [[ "${'$'}ES_SNAPSHOT_MANIFEST" ]]; then - project=kibana-es-snapshot-verify - fi - - # These parameters are only for runbld reporting - export JENKINS_HOME="${'$'}HOME" - export BUILD_URL="%teamcity.serverUrl%/build/%teamcity.build.id%" - export branch_specifier=${'$'}branchName - export NODE_LABELS='teamcity' - export BUILD_NUMBER="%build.number%" - export EXECUTOR_NUMBER='' - export NODE_NAME='' - export OLD_PATH="${'$'}PATH" - - file=${'$'}(mktemp) - - ( - cat < ${'$'}file - - /usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" ${'$'}file - """.trimIndent() + // The indentation for this string is like this to ensure 100% that the RUNBLD-SCRIPT heredoc termination will not have spaces at the beginning + scriptContent = +"""#!/bin/bash +branchName="${'$'}GIT_BRANCH" +branchName="${'$'}{branchName#refs\/heads\/}" + +if [[ "${'$'}GITHUB_PR_NUMBER" ]]; then + branchName=pull-request +fi + +project=kibana +if [[ "${'$'}ES_SNAPSHOT_MANIFEST" ]]; then + project=kibana-es-snapshot-verify +fi + +# These parameters are only for runbld reporting +export JENKINS_HOME="${'$'}HOME" +export BUILD_URL="%teamcity.serverUrl%/build/%teamcity.build.id%" +export branch_specifier=${'$'}branchName +export NODE_LABELS='teamcity' +export BUILD_NUMBER="%build.number%" +export EXECUTOR_NUMBER='' +export NODE_NAME='' + +export OLD_PATH="${'$'}PATH" + +file=${'$'}(mktemp) + +( +cat < ${'$'}file + +/usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" ${'$'}file +""" } } From 4b7cf6778adf48fb1f63c3b233a4afb534ee24f7 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Wed, 21 Oct 2020 17:13:41 -0400 Subject: [PATCH 15/39] Try making most test steps retry --- .ci/teamcity/util.sh | 21 +++++++++++++++++++++ .teamcity/src/Extensions.kt | 9 ++++++++- .teamcity/src/templates/KibanaTemplate.kt | 1 + 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/.ci/teamcity/util.sh b/.ci/teamcity/util.sh index aba6cff22b113..3d1ba7d9aaf58 100755 --- a/.ci/teamcity/util.sh +++ b/.ci/teamcity/util.sh @@ -57,3 +57,24 @@ is_pr() { [[ "${GITHUB_PR_NUMBER-}" ]] && return false } + +# This function is specifcally for retrying test runner steps one time +# A different solution should be used for retrying general steps (e.g. bootstrap) +tc_retry() { + tc_start_block "Retryable Step - Attempt #1" + "$@" || { + tc_end_block "Retryable Step - Attempt #1" + tc_start_block "Retryable Step - Attempt #2" + >&2 echo "First attempt failed. Retrying $*" + if "$@"; then + echo 'Second attempt successful' + echo "##teamcity[buildStatus status='SUCCESS' text='{build.status.text} with a flaky failure']" + echo "##teamcity[setParameter name='elastic.build.flaky' value='true']" + tc_end_block "Retryable Step - Attempt #2" + else + tc_end_block "Retryable Step - Attempt #2" + return "$?" + fi + } + tc_end_block "Retryable Step - Attempt #1" +} diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index e3508aebc0424..336d0dbcaf476 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -142,6 +142,8 @@ fun BuildSteps.failedTestReporter(init: ScriptBuildStep.() -> Unit = {}) { } } +// Note: This is currently only used for tests and has a retry in it for flaky tests. +// The retry should be refactored if runbld is ever needed for other tasks. fun BuildSteps.runbld(stepName: String, script: String) { script { name = stepName @@ -149,6 +151,11 @@ fun BuildSteps.runbld(stepName: String, script: String) { // The indentation for this string is like this to ensure 100% that the RUNBLD-SCRIPT heredoc termination will not have spaces at the beginning scriptContent = """#!/bin/bash + +set -euo pipefail + +source .ci/teamcity/util.sh + branchName="${'$'}GIT_BRANCH" branchName="${'$'}{branchName#refs\/heads\/}" @@ -182,7 +189,7 @@ $script RUNBLD-SCRIPT ) > ${'$'}file -/usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" ${'$'}file +tc_retry /usr/local/bin/runbld -d "${'$'}(pwd)" --job-name="elastic+${'$'}project+${'$'}branchName" ${'$'}file """ } } diff --git a/.teamcity/src/templates/KibanaTemplate.kt b/.teamcity/src/templates/KibanaTemplate.kt index f39f3dc6411b0..3714a53747dfb 100644 --- a/.teamcity/src/templates/KibanaTemplate.kt +++ b/.teamcity/src/templates/KibanaTemplate.kt @@ -30,6 +30,7 @@ object KibanaTemplate : Template({ failureConditions { executionTimeoutMin = 120 + testFailure = false } params { From 982b5bd3c6f9ab9e0c905fcedbfa8d36bac040a3 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Wed, 21 Oct 2020 17:24:11 -0400 Subject: [PATCH 16/39] Fix a couple of unbound vars --- .teamcity/src/Extensions.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index 336d0dbcaf476..c24bf9515849c 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -159,12 +159,12 @@ source .ci/teamcity/util.sh branchName="${'$'}GIT_BRANCH" branchName="${'$'}{branchName#refs\/heads\/}" -if [[ "${'$'}GITHUB_PR_NUMBER" ]]; then +if [[ "${'$'}{GITHUB_PR_NUMBER-}" ]]; then branchName=pull-request fi project=kibana -if [[ "${'$'}ES_SNAPSHOT_MANIFEST" ]]; then +if [[ "${'$'}{ES_SNAPSHOT_MANIFEST-}" ]]; then project=kibana-es-snapshot-verify fi From 377c76cc47391dd5686ba2408dc96e556ed0065b Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 22 Oct 2020 14:43:13 -0400 Subject: [PATCH 17/39] Move PR config to build config --- .teamcity/src/builds/PullRequestCi.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.teamcity/src/builds/PullRequestCi.kt b/.teamcity/src/builds/PullRequestCi.kt index 126f89de4a723..bfdc690c3fb50 100644 --- a/.teamcity/src/builds/PullRequestCi.kt +++ b/.teamcity/src/builds/PullRequestCi.kt @@ -22,7 +22,24 @@ object PullRequestCi : BuildType({ branchFilter = "+:pull/*" } + val prAllowedList = listOf( + "brianseeders", + "alexwizp", + "barlowm", + "DziyanaDzeraviankina", + "maryia-lapata", + "renovate[bot]", + "sulemanof", + "VladLasitsa" + ) + params { + param("elastic.pull_request.enabled", "true") + param("elastic.pull_request.allow_org_users", "true") + param("elastic.pull_request.allowed_repo_permissions", "admin,write") + param("elastic.pull_request.allowed_list", prAllowedList.joinToString(",")) + param("elastic.pull_request.cancel_in_progress_builds_on_update", "true") + // These params should get filled in by the app that triggers builds param("env.GITHUB_PR_TARGET_BRANCH", "") param("env.GITHUB_PR_NUMBER", "") From 0251da68d061672eb5ba0d11f8c5043c06337f0c Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 22 Oct 2020 17:40:16 -0400 Subject: [PATCH 18/39] Add target_branch to PR config --- .teamcity/src/builds/PullRequestCi.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/.teamcity/src/builds/PullRequestCi.kt b/.teamcity/src/builds/PullRequestCi.kt index bfdc690c3fb50..25d6d850a717b 100644 --- a/.teamcity/src/builds/PullRequestCi.kt +++ b/.teamcity/src/builds/PullRequestCi.kt @@ -35,6 +35,7 @@ object PullRequestCi : BuildType({ params { param("elastic.pull_request.enabled", "true") + param("elastic.pull_request.target_branch", "master_teamcity") param("elastic.pull_request.allow_org_users", "true") param("elastic.pull_request.allowed_repo_permissions", "admin,write") param("elastic.pull_request.allowed_list", prAllowedList.joinToString(",")) From 8ffd9e211fadd1b11dcdcdbb8eeed75c28b2887c Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 26 Oct 2020 14:23:59 -0400 Subject: [PATCH 19/39] Make sure PR check is backwards-compatible --- .../src/failed_tests_reporter/run_failed_tests_reporter_cli.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/kbn-test/src/failed_tests_reporter/run_failed_tests_reporter_cli.ts b/packages/kbn-test/src/failed_tests_reporter/run_failed_tests_reporter_cli.ts index 491b7000ec9f0..9010e324bb392 100644 --- a/packages/kbn-test/src/failed_tests_reporter/run_failed_tests_reporter_cli.ts +++ b/packages/kbn-test/src/failed_tests_reporter/run_failed_tests_reporter_cli.ts @@ -62,7 +62,8 @@ export function runFailedTestsReporterCli() { ); } - const isPr = !!process.env.GITHUB_PR_NUMBER; + // ghprbPullId check can be removed once there are no PR jobs running on Jenkins + const isPr = !!process.env.GITHUB_PR_NUMBER || !!process.env.ghprbPullId; const isMasterOrVersion = branch === 'master' || branch.match(/^\d+\.(x|\d+)$/); if (!isMasterOrVersion || isPr) { log.info('Failure issues only created on master/version branch jobs'); From 609e9f9711d090479874e6fc05f570d180307dee Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 26 Oct 2020 14:40:49 -0400 Subject: [PATCH 20/39] Remove test --- .teamcity/tests/projects/KibanaTest.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.teamcity/tests/projects/KibanaTest.kt b/.teamcity/tests/projects/KibanaTest.kt index 389761edd60af..677effec5be65 100644 --- a/.teamcity/tests/projects/KibanaTest.kt +++ b/.teamcity/tests/projects/KibanaTest.kt @@ -24,10 +24,4 @@ class KibanaTest { it.type == "CloudImage" && it.params.any { param -> param.name == "network" && param.value == "network"} }) } - - @Test - fun test_ESVerify() { - val project = Kibana() - assertTrue(true) - } } From 9793494b90b1d61a572d23c96573371c78920802 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 26 Oct 2020 14:44:10 -0400 Subject: [PATCH 21/39] Add a comment for unclear one-liner --- .ci/teamcity/es_snapshots/build.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.ci/teamcity/es_snapshots/build.sh b/.ci/teamcity/es_snapshots/build.sh index 10050cd30bf5c..f983713e80f4d 100755 --- a/.ci/teamcity/es_snapshots/build.sh +++ b/.ci/teamcity/es_snapshots/build.sh @@ -17,7 +17,9 @@ export BUILD_URL="" export JOB_NAME="" export NODE_NAME="" +# Reads the ES_BUILD_JAVA env var out of .ci/java-versions.properties and exports it export "$(grep '^ES_BUILD_JAVA' .ci/java-versions.properties | xargs)" + export PATH="$HOME/.java/$ES_BUILD_JAVA/bin:$PATH" export JAVA_HOME="$HOME/.java/$ES_BUILD_JAVA" From 94447586cc845c0bc0eeac2f19c706a0409479fe Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 26 Oct 2020 16:51:31 -0400 Subject: [PATCH 22/39] Update teamcity docs a little bit --- .teamcity/Kibana.png | Bin 130914 -> 129139 bytes .teamcity/README.md | 22 ++++++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.teamcity/Kibana.png b/.teamcity/Kibana.png index 5cfc64392438ef8aeb80d4f573983df895a2eddb..c8f78f4575965ffd34a9ea18e31c8d6c61ff5600 100644 GIT binary patch literal 129139 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 DA<>M< literal 130914 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 diff --git a/.teamcity/README.md b/.teamcity/README.md index e79137eaa6ea0..77c0bc5bc4cd3 100644 --- a/.teamcity/README.md +++ b/.teamcity/README.md @@ -16,7 +16,7 @@ - Barebones Slack notifications via plugin - Dynamically creating environment variables / secrets at runtime for subsequent steps - "Baseline CI" job that runs a subset of CI for every commit -- "Full CI" job that runs full CI hourly, if changes are detected. Re-uses builds that ran during "Baseline CI" for same commit +- "Hourly CI" job that runs full CI hourly, if changes are detected. Re-uses builds that ran during "Baseline CI" for same commit - Performance monitoring enabled for all jobs - Jobs with multiple VCS roots (Kibana + Elasticsearch) - GCS uploading using service account key file and gsutil @@ -86,14 +86,24 @@ and with additional properties: ### Baseline CI - Generates baseline metrics needed for PR comparisons -- Only runs OSS and default builds and visual regression tests +- Only runs OSS and default builds, and generates default saved object field metrics - Runs for each commit (each build should build a single commit) ### Full CI -- Runs everything in CI -- Runs hourly, currently only if there are changes since the last run +- Runs everything in CI - all tests and builds - Re-uses builds from Baseline CI if they are finished or in-progress +- Not generally triggered directly, is triggered by other jobs + +### Hourly CI + +- Triggers every hour and groups up all changes since the last run +- Runs whatever is in `Full CI` + +### Pull Request CI + +- Kibana TeamCity PR bot triggers this build for PRs (new commits, trigger comments) +- Sets many PR related parameters/env vars, then runs `Full CI` ![Diagram](Kibana.png) @@ -144,7 +154,3 @@ Desires: - snapshot dependency only on `Build Snapshot` - same as `Promote Snapshot` but skips testing - can only be triggered manually - -``` - -``` From 6bb4488ecd4861debe9f978cbd26d3a9c8631fb2 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 26 Oct 2020 16:53:25 -0400 Subject: [PATCH 23/39] Add TeamCity CODEOWNERS --- .github/CODEOWNERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 525da9d832b53..b09b57875c203 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -200,6 +200,8 @@ /src/legacy/server/utils/ @elastic/kibana-operations /src/legacy/server/warnings/ @elastic/kibana-operations /.ci/es-snapshots/ @elastic/kibana-operations +/.ci/teamcity/ @elastic/kibana-operations +/.teamcity/ @elastic/kibana-operations /vars/ @elastic/kibana-operations #CC# /packages/kbn-expect/ @elastic/kibana-operations From 2be995a35aa03f1c61714459eff045eee3b4e852 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 29 Oct 2020 14:30:29 -0400 Subject: [PATCH 24/39] Fix PR builds --- .teamcity/src/builds/Lint.kt | 9 +++++---- .teamcity/src/builds/PullRequestCi.kt | 1 + .teamcity/src/builds/default/DefaultFunctionalBase.kt | 1 + .teamcity/src/vcs/Kibana.kt | 4 ++++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.teamcity/src/builds/Lint.kt b/.teamcity/src/builds/Lint.kt index 18d0e20a199d7..0b3b3b013b5ec 100644 --- a/.teamcity/src/builds/Lint.kt +++ b/.teamcity/src/builds/Lint.kt @@ -13,10 +13,11 @@ object Lint : BuildType({ steps { script { name = "Sasslint" + scriptContent = """ - #!/bin/bash - yarn run grunt run:sasslint + #!/bin/bash + yarn run grunt run:sasslint """.trimIndent() } @@ -24,8 +25,8 @@ object Lint : BuildType({ name = "ESLint" scriptContent = """ - #!/bin/bash - yarn run grunt run:eslint + #!/bin/bash + yarn run grunt run:eslint """.trimIndent() } } diff --git a/.teamcity/src/builds/PullRequestCi.kt b/.teamcity/src/builds/PullRequestCi.kt index 25d6d850a717b..0b3ecb095b167 100644 --- a/.teamcity/src/builds/PullRequestCi.kt +++ b/.teamcity/src/builds/PullRequestCi.kt @@ -20,6 +20,7 @@ object PullRequestCi : BuildType({ checkoutDir = "kibana" branchFilter = "+:pull/*" + excludeDefaultBranchChanges = true } val prAllowedList = listOf( diff --git a/.teamcity/src/builds/default/DefaultFunctionalBase.kt b/.teamcity/src/builds/default/DefaultFunctionalBase.kt index 1c9002e14507c..d8124bd8521c0 100644 --- a/.teamcity/src/builds/default/DefaultFunctionalBase.kt +++ b/.teamcity/src/builds/default/DefaultFunctionalBase.kt @@ -16,3 +16,4 @@ open class DefaultFunctionalBase(init: BuildType.() -> Unit = {}) : BuildType({ addTestSettings() }) + diff --git a/.teamcity/src/vcs/Kibana.kt b/.teamcity/src/vcs/Kibana.kt index d847a1565e6e0..3c8e84487e2b7 100644 --- a/.teamcity/src/vcs/Kibana.kt +++ b/.teamcity/src/vcs/Kibana.kt @@ -8,4 +8,8 @@ object Kibana : GitVcsRoot({ name = "kibana / master" url = "https://github.com/elastic/kibana.git" branch = "refs/heads/master_teamcity" + branchSpec = """ + +:pull/* + +:feature/* + """.trimIndent() }) From 43d43b1a9865972772350c2feeeeecc21d1648ce Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 29 Oct 2020 14:41:35 -0400 Subject: [PATCH 25/39] Try disabling the PR feature for now --- .teamcity/src/builds/PullRequestCi.kt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.teamcity/src/builds/PullRequestCi.kt b/.teamcity/src/builds/PullRequestCi.kt index 0b3ecb095b167..e8af142719488 100644 --- a/.teamcity/src/builds/PullRequestCi.kt +++ b/.teamcity/src/builds/PullRequestCi.kt @@ -63,16 +63,16 @@ object PullRequestCi : BuildType({ } features { - pullRequests { - vcsRootExtId = "${Kibana.id}" - provider = github { - authType = token { - token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" - } - filterTargetBranch = "refs/heads/master_teamcity" - filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER - } - } +// pullRequests { +// vcsRootExtId = "${Kibana.id}" +// provider = github { +// authType = token { +// token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" +// } +// filterTargetBranch = "refs/heads/master_teamcity" +// filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER +// } +// } commitStatusPublisher { vcsRootExtId = "${Kibana.id}" publisher = github { From 15b86a1869535996adcebda54f07223780b9389c Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 29 Oct 2020 14:52:45 -0400 Subject: [PATCH 26/39] Re-enable PR feature --- .teamcity/src/builds/PullRequestCi.kt | 20 ++++++++++---------- .teamcity/src/vcs/Kibana.kt | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.teamcity/src/builds/PullRequestCi.kt b/.teamcity/src/builds/PullRequestCi.kt index e8af142719488..0b3ecb095b167 100644 --- a/.teamcity/src/builds/PullRequestCi.kt +++ b/.teamcity/src/builds/PullRequestCi.kt @@ -63,16 +63,16 @@ object PullRequestCi : BuildType({ } features { -// pullRequests { -// vcsRootExtId = "${Kibana.id}" -// provider = github { -// authType = token { -// token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" -// } -// filterTargetBranch = "refs/heads/master_teamcity" -// filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER -// } -// } + pullRequests { + vcsRootExtId = "${Kibana.id}" + provider = github { + authType = token { + token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" + } + filterTargetBranch = "refs/heads/master_teamcity" + filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER + } + } commitStatusPublisher { vcsRootExtId = "${Kibana.id}" publisher = github { diff --git a/.teamcity/src/vcs/Kibana.kt b/.teamcity/src/vcs/Kibana.kt index 3c8e84487e2b7..8254e41a5e85a 100644 --- a/.teamcity/src/vcs/Kibana.kt +++ b/.teamcity/src/vcs/Kibana.kt @@ -9,7 +9,7 @@ object Kibana : GitVcsRoot({ url = "https://github.com/elastic/kibana.git" branch = "refs/heads/master_teamcity" branchSpec = """ - +:pull/* - +:feature/* + +:refs/pull/* + +:refs/feature/* """.trimIndent() }) From c80b3aa695144ea2d0ce611675d5eac75eb52874 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 29 Oct 2020 15:02:26 -0400 Subject: [PATCH 27/39] Add PR feature to all builds --- .teamcity/src/builds/PullRequestCi.kt | 10 ---------- .teamcity/src/templates/KibanaTemplate.kt | 12 ++++++++++++ .teamcity/src/vcs/Kibana.kt | 4 ---- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/.teamcity/src/builds/PullRequestCi.kt b/.teamcity/src/builds/PullRequestCi.kt index 0b3ecb095b167..d3eb697981ce7 100644 --- a/.teamcity/src/builds/PullRequestCi.kt +++ b/.teamcity/src/builds/PullRequestCi.kt @@ -63,16 +63,6 @@ object PullRequestCi : BuildType({ } features { - pullRequests { - vcsRootExtId = "${Kibana.id}" - provider = github { - authType = token { - token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" - } - filterTargetBranch = "refs/heads/master_teamcity" - filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER - } - } commitStatusPublisher { vcsRootExtId = "${Kibana.id}" publisher = github { diff --git a/.teamcity/src/templates/KibanaTemplate.kt b/.teamcity/src/templates/KibanaTemplate.kt index 3714a53747dfb..117c30ddb86e3 100644 --- a/.teamcity/src/templates/KibanaTemplate.kt +++ b/.teamcity/src/templates/KibanaTemplate.kt @@ -4,7 +4,9 @@ import vcs.Kibana import jetbrains.buildServer.configs.kotlin.v2019_2.BuildStep import jetbrains.buildServer.configs.kotlin.v2019_2.ParameterDisplay import jetbrains.buildServer.configs.kotlin.v2019_2.Template +import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.PullRequests import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.perfmon +import jetbrains.buildServer.configs.kotlin.v2019_2.buildFeatures.pullRequests import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.placeholder import jetbrains.buildServer.configs.kotlin.v2019_2.buildSteps.script @@ -26,6 +28,16 @@ object KibanaTemplate : Template({ features { perfmon { } + pullRequests { + vcsRootExtId = "${Kibana.id}" + provider = github { + authType = token { + token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" + } + filterTargetBranch = "refs/heads/master_teamcity" + filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER + } + } } failureConditions { diff --git a/.teamcity/src/vcs/Kibana.kt b/.teamcity/src/vcs/Kibana.kt index 8254e41a5e85a..d847a1565e6e0 100644 --- a/.teamcity/src/vcs/Kibana.kt +++ b/.teamcity/src/vcs/Kibana.kt @@ -8,8 +8,4 @@ object Kibana : GitVcsRoot({ name = "kibana / master" url = "https://github.com/elastic/kibana.git" branch = "refs/heads/master_teamcity" - branchSpec = """ - +:refs/pull/* - +:refs/feature/* - """.trimIndent() }) From c7c1e5aa6dc5a76f0679222b50df17fb03ab1506 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 29 Oct 2020 15:07:28 -0400 Subject: [PATCH 28/39] Remove Kibana project temporarily --- .teamcity/src/projects/Kibana.kt | 280 +++++++++++++++---------------- 1 file changed, 140 insertions(+), 140 deletions(-) diff --git a/.teamcity/src/projects/Kibana.kt b/.teamcity/src/projects/Kibana.kt index 4e1dd43b6f900..4e42020eb2205 100644 --- a/.teamcity/src/projects/Kibana.kt +++ b/.teamcity/src/projects/Kibana.kt @@ -27,145 +27,145 @@ fun Kibana(config: KibanaConfiguration = KibanaConfiguration()) : Project { kibanaConfiguration = config return Project { - params { - param("teamcity.ui.settings.readOnly", "true") - - // https://github.com/JetBrains/teamcity-webhooks - param("teamcity.internal.webhooks.enable", "true") - param("teamcity.internal.webhooks.events", "BUILD_STARTED;BUILD_FINISHED;BUILD_INTERRUPTED;CHANGES_LOADED;BUILD_TYPE_ADDED_TO_QUEUE;BUILD_PROBLEMS_CHANGED") - param("teamcity.internal.webhooks.url", "https://ci-stats.kibana.dev/_teamcity_webhook") - param("teamcity.internal.webhooks.username", "automation") - password("teamcity.internal.webhooks.password", "credentialsJSON:b2ee34c5-fc89-4596-9b47-ecdeb68e4e7a", display = ParameterDisplay.HIDDEN) - } - - vcsRoot(Kibana) - vcsRoot(Elasticsearch) - - template(DefaultTemplate) - template(KibanaTemplate) - - defaultTemplate = DefaultTemplate - - features { - val sizes = listOf("2", "4", "8", "16") - for (size in sizes) { - kibanaAgent(size) - } - - kibanaAgent { - id = "KIBANA_C2_16" - param("source-id", "kibana-c2-16-") - param("machineType", "c2-standard-16") - } - - feature { - id = "kibana" - type = "CloudProfile" - param("agentPushPreset", "") - param("profileId", "kibana") - param("profileServerUrl", "") - param("name", "kibana") - param("total-work-time", "") - param("credentialsType", "key") - param("description", "") - param("next-hour", "") - param("cloud-code", "google") - param("terminate-after-build", "true") - param("terminate-idle-time", "30") - param("enabled", "true") - param("secure:accessKey", "credentialsJSON:447fdd4d-7129-46b7-9822-2e57658c7422") - } - - slackConnection { - id = "KIBANA_SLACK" - displayName = "Kibana Slack" - botToken = "credentialsJSON:39eafcfc-97a6-4877-82c1-115f1f10d14b" - clientId = "12985172978.1291178427153" - clientSecret = "credentialsJSON:8b5901fb-fd2c-4e45-8aff-fdd86dc68f67" - } - } - - subProject { - id("CI") - name = "CI" - defaultTemplate = KibanaTemplate - - buildType(Lint) - buildType(Checks) - - subProject { - id("Test") - name = "Test" - - subProject { - id("Jest") - name = "Jest" - - buildType(Jest) - buildType(XPackJest) - buildType(JestIntegration) - } - - buildType(ApiIntegration) - buildType(QuickTests) - buildType(AllTests) - } - - subProject { - id("OSS") - name = "OSS Distro" - - buildType(OssBuild) - - subProject { - id("OSS_Functional") - name = "Functional" - - buildType(OssCiGroups) - buildType(OssFirefox) - buildType(OssAccessibility) - buildType(OssPluginFunctional) - - subProject { - id("CIGroups") - name = "CI Groups" - - ossCiGroups.forEach { buildType(it) } - } - } - } - - subProject { - id("Default") - name = "Default Distro" - - buildType(DefaultBuild) - - subProject { - id("Default_Functional") - name = "Functional" - - buildType(DefaultCiGroups) - buildType(DefaultFirefox) - buildType(DefaultAccessibility) - buildType(DefaultSecuritySolution) - buildType(DefaultSavedObjectFieldMetrics) - - subProject { - id("Default_CIGroups") - name = "CI Groups" - - defaultCiGroups.forEach { buildType(it) } - } - } - } - - buildType(FullCi) - buildType(BaselineCi) - buildType(HourlyCi) - buildType(PullRequestCi) - } - - subProject(EsSnapshotsProject) +// params { +// param("teamcity.ui.settings.readOnly", "true") +// +// // https://github.com/JetBrains/teamcity-webhooks +// param("teamcity.internal.webhooks.enable", "true") +// param("teamcity.internal.webhooks.events", "BUILD_STARTED;BUILD_FINISHED;BUILD_INTERRUPTED;CHANGES_LOADED;BUILD_TYPE_ADDED_TO_QUEUE;BUILD_PROBLEMS_CHANGED") +// param("teamcity.internal.webhooks.url", "https://ci-stats.kibana.dev/_teamcity_webhook") +// param("teamcity.internal.webhooks.username", "automation") +// password("teamcity.internal.webhooks.password", "credentialsJSON:b2ee34c5-fc89-4596-9b47-ecdeb68e4e7a", display = ParameterDisplay.HIDDEN) +// } +// +// vcsRoot(Kibana) +// vcsRoot(Elasticsearch) +// +// template(DefaultTemplate) +// template(KibanaTemplate) +// +// defaultTemplate = DefaultTemplate +// +// features { +// val sizes = listOf("2", "4", "8", "16") +// for (size in sizes) { +// kibanaAgent(size) +// } +// +// kibanaAgent { +// id = "KIBANA_C2_16" +// param("source-id", "kibana-c2-16-") +// param("machineType", "c2-standard-16") +// } +// +// feature { +// id = "kibana" +// type = "CloudProfile" +// param("agentPushPreset", "") +// param("profileId", "kibana") +// param("profileServerUrl", "") +// param("name", "kibana") +// param("total-work-time", "") +// param("credentialsType", "key") +// param("description", "") +// param("next-hour", "") +// param("cloud-code", "google") +// param("terminate-after-build", "true") +// param("terminate-idle-time", "30") +// param("enabled", "true") +// param("secure:accessKey", "credentialsJSON:447fdd4d-7129-46b7-9822-2e57658c7422") +// } +// +// slackConnection { +// id = "KIBANA_SLACK" +// displayName = "Kibana Slack" +// botToken = "credentialsJSON:39eafcfc-97a6-4877-82c1-115f1f10d14b" +// clientId = "12985172978.1291178427153" +// clientSecret = "credentialsJSON:8b5901fb-fd2c-4e45-8aff-fdd86dc68f67" +// } +// } +// +// subProject { +// id("CI") +// name = "CI" +// defaultTemplate = KibanaTemplate +// +// buildType(Lint) +// buildType(Checks) +// +// subProject { +// id("Test") +// name = "Test" +// +// subProject { +// id("Jest") +// name = "Jest" +// +// buildType(Jest) +// buildType(XPackJest) +// buildType(JestIntegration) +// } +// +// buildType(ApiIntegration) +// buildType(QuickTests) +// buildType(AllTests) +// } +// +// subProject { +// id("OSS") +// name = "OSS Distro" +// +// buildType(OssBuild) +// +// subProject { +// id("OSS_Functional") +// name = "Functional" +// +// buildType(OssCiGroups) +// buildType(OssFirefox) +// buildType(OssAccessibility) +// buildType(OssPluginFunctional) +// +// subProject { +// id("CIGroups") +// name = "CI Groups" +// +// ossCiGroups.forEach { buildType(it) } +// } +// } +// } +// +// subProject { +// id("Default") +// name = "Default Distro" +// +// buildType(DefaultBuild) +// +// subProject { +// id("Default_Functional") +// name = "Functional" +// +// buildType(DefaultCiGroups) +// buildType(DefaultFirefox) +// buildType(DefaultAccessibility) +// buildType(DefaultSecuritySolution) +// buildType(DefaultSavedObjectFieldMetrics) +// +// subProject { +// id("Default_CIGroups") +// name = "CI Groups" +// +// defaultCiGroups.forEach { buildType(it) } +// } +// } +// } +// +// buildType(FullCi) +// buildType(BaselineCi) +// buildType(HourlyCi) +// buildType(PullRequestCi) +// } +// +// subProject(EsSnapshotsProject) } } From 96f8ea70f698ab23589244c757ae631557d1389f Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 29 Oct 2020 15:12:32 -0400 Subject: [PATCH 29/39] Revert "Remove Kibana project temporarily" This reverts commit c7c1e5aa6dc5a76f0679222b50df17fb03ab1506. --- .teamcity/src/projects/Kibana.kt | 280 +++++++++++++++---------------- 1 file changed, 140 insertions(+), 140 deletions(-) diff --git a/.teamcity/src/projects/Kibana.kt b/.teamcity/src/projects/Kibana.kt index 4e42020eb2205..4e1dd43b6f900 100644 --- a/.teamcity/src/projects/Kibana.kt +++ b/.teamcity/src/projects/Kibana.kt @@ -27,145 +27,145 @@ fun Kibana(config: KibanaConfiguration = KibanaConfiguration()) : Project { kibanaConfiguration = config return Project { -// params { -// param("teamcity.ui.settings.readOnly", "true") -// -// // https://github.com/JetBrains/teamcity-webhooks -// param("teamcity.internal.webhooks.enable", "true") -// param("teamcity.internal.webhooks.events", "BUILD_STARTED;BUILD_FINISHED;BUILD_INTERRUPTED;CHANGES_LOADED;BUILD_TYPE_ADDED_TO_QUEUE;BUILD_PROBLEMS_CHANGED") -// param("teamcity.internal.webhooks.url", "https://ci-stats.kibana.dev/_teamcity_webhook") -// param("teamcity.internal.webhooks.username", "automation") -// password("teamcity.internal.webhooks.password", "credentialsJSON:b2ee34c5-fc89-4596-9b47-ecdeb68e4e7a", display = ParameterDisplay.HIDDEN) -// } -// -// vcsRoot(Kibana) -// vcsRoot(Elasticsearch) -// -// template(DefaultTemplate) -// template(KibanaTemplate) -// -// defaultTemplate = DefaultTemplate -// -// features { -// val sizes = listOf("2", "4", "8", "16") -// for (size in sizes) { -// kibanaAgent(size) -// } -// -// kibanaAgent { -// id = "KIBANA_C2_16" -// param("source-id", "kibana-c2-16-") -// param("machineType", "c2-standard-16") -// } -// -// feature { -// id = "kibana" -// type = "CloudProfile" -// param("agentPushPreset", "") -// param("profileId", "kibana") -// param("profileServerUrl", "") -// param("name", "kibana") -// param("total-work-time", "") -// param("credentialsType", "key") -// param("description", "") -// param("next-hour", "") -// param("cloud-code", "google") -// param("terminate-after-build", "true") -// param("terminate-idle-time", "30") -// param("enabled", "true") -// param("secure:accessKey", "credentialsJSON:447fdd4d-7129-46b7-9822-2e57658c7422") -// } -// -// slackConnection { -// id = "KIBANA_SLACK" -// displayName = "Kibana Slack" -// botToken = "credentialsJSON:39eafcfc-97a6-4877-82c1-115f1f10d14b" -// clientId = "12985172978.1291178427153" -// clientSecret = "credentialsJSON:8b5901fb-fd2c-4e45-8aff-fdd86dc68f67" -// } -// } -// -// subProject { -// id("CI") -// name = "CI" -// defaultTemplate = KibanaTemplate -// -// buildType(Lint) -// buildType(Checks) -// -// subProject { -// id("Test") -// name = "Test" -// -// subProject { -// id("Jest") -// name = "Jest" -// -// buildType(Jest) -// buildType(XPackJest) -// buildType(JestIntegration) -// } -// -// buildType(ApiIntegration) -// buildType(QuickTests) -// buildType(AllTests) -// } -// -// subProject { -// id("OSS") -// name = "OSS Distro" -// -// buildType(OssBuild) -// -// subProject { -// id("OSS_Functional") -// name = "Functional" -// -// buildType(OssCiGroups) -// buildType(OssFirefox) -// buildType(OssAccessibility) -// buildType(OssPluginFunctional) -// -// subProject { -// id("CIGroups") -// name = "CI Groups" -// -// ossCiGroups.forEach { buildType(it) } -// } -// } -// } -// -// subProject { -// id("Default") -// name = "Default Distro" -// -// buildType(DefaultBuild) -// -// subProject { -// id("Default_Functional") -// name = "Functional" -// -// buildType(DefaultCiGroups) -// buildType(DefaultFirefox) -// buildType(DefaultAccessibility) -// buildType(DefaultSecuritySolution) -// buildType(DefaultSavedObjectFieldMetrics) -// -// subProject { -// id("Default_CIGroups") -// name = "CI Groups" -// -// defaultCiGroups.forEach { buildType(it) } -// } -// } -// } -// -// buildType(FullCi) -// buildType(BaselineCi) -// buildType(HourlyCi) -// buildType(PullRequestCi) -// } -// -// subProject(EsSnapshotsProject) + params { + param("teamcity.ui.settings.readOnly", "true") + + // https://github.com/JetBrains/teamcity-webhooks + param("teamcity.internal.webhooks.enable", "true") + param("teamcity.internal.webhooks.events", "BUILD_STARTED;BUILD_FINISHED;BUILD_INTERRUPTED;CHANGES_LOADED;BUILD_TYPE_ADDED_TO_QUEUE;BUILD_PROBLEMS_CHANGED") + param("teamcity.internal.webhooks.url", "https://ci-stats.kibana.dev/_teamcity_webhook") + param("teamcity.internal.webhooks.username", "automation") + password("teamcity.internal.webhooks.password", "credentialsJSON:b2ee34c5-fc89-4596-9b47-ecdeb68e4e7a", display = ParameterDisplay.HIDDEN) + } + + vcsRoot(Kibana) + vcsRoot(Elasticsearch) + + template(DefaultTemplate) + template(KibanaTemplate) + + defaultTemplate = DefaultTemplate + + features { + val sizes = listOf("2", "4", "8", "16") + for (size in sizes) { + kibanaAgent(size) + } + + kibanaAgent { + id = "KIBANA_C2_16" + param("source-id", "kibana-c2-16-") + param("machineType", "c2-standard-16") + } + + feature { + id = "kibana" + type = "CloudProfile" + param("agentPushPreset", "") + param("profileId", "kibana") + param("profileServerUrl", "") + param("name", "kibana") + param("total-work-time", "") + param("credentialsType", "key") + param("description", "") + param("next-hour", "") + param("cloud-code", "google") + param("terminate-after-build", "true") + param("terminate-idle-time", "30") + param("enabled", "true") + param("secure:accessKey", "credentialsJSON:447fdd4d-7129-46b7-9822-2e57658c7422") + } + + slackConnection { + id = "KIBANA_SLACK" + displayName = "Kibana Slack" + botToken = "credentialsJSON:39eafcfc-97a6-4877-82c1-115f1f10d14b" + clientId = "12985172978.1291178427153" + clientSecret = "credentialsJSON:8b5901fb-fd2c-4e45-8aff-fdd86dc68f67" + } + } + + subProject { + id("CI") + name = "CI" + defaultTemplate = KibanaTemplate + + buildType(Lint) + buildType(Checks) + + subProject { + id("Test") + name = "Test" + + subProject { + id("Jest") + name = "Jest" + + buildType(Jest) + buildType(XPackJest) + buildType(JestIntegration) + } + + buildType(ApiIntegration) + buildType(QuickTests) + buildType(AllTests) + } + + subProject { + id("OSS") + name = "OSS Distro" + + buildType(OssBuild) + + subProject { + id("OSS_Functional") + name = "Functional" + + buildType(OssCiGroups) + buildType(OssFirefox) + buildType(OssAccessibility) + buildType(OssPluginFunctional) + + subProject { + id("CIGroups") + name = "CI Groups" + + ossCiGroups.forEach { buildType(it) } + } + } + } + + subProject { + id("Default") + name = "Default Distro" + + buildType(DefaultBuild) + + subProject { + id("Default_Functional") + name = "Functional" + + buildType(DefaultCiGroups) + buildType(DefaultFirefox) + buildType(DefaultAccessibility) + buildType(DefaultSecuritySolution) + buildType(DefaultSavedObjectFieldMetrics) + + subProject { + id("Default_CIGroups") + name = "CI Groups" + + defaultCiGroups.forEach { buildType(it) } + } + } + } + + buildType(FullCi) + buildType(BaselineCi) + buildType(HourlyCi) + buildType(PullRequestCi) + } + + subProject(EsSnapshotsProject) } } From 40a728f28359ba4f1b35caa9021850617585535a Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 29 Oct 2020 15:13:44 -0400 Subject: [PATCH 30/39] Remove PR feature --- .teamcity/src/templates/KibanaTemplate.kt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.teamcity/src/templates/KibanaTemplate.kt b/.teamcity/src/templates/KibanaTemplate.kt index 117c30ddb86e3..ac89a383ee88f 100644 --- a/.teamcity/src/templates/KibanaTemplate.kt +++ b/.teamcity/src/templates/KibanaTemplate.kt @@ -28,16 +28,16 @@ object KibanaTemplate : Template({ features { perfmon { } - pullRequests { - vcsRootExtId = "${Kibana.id}" - provider = github { - authType = token { - token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" - } - filterTargetBranch = "refs/heads/master_teamcity" - filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER - } - } +// pullRequests { +// vcsRootExtId = "${Kibana.id}" +// provider = github { +// authType = token { +// token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" +// } +// filterTargetBranch = "refs/heads/master_teamcity" +// filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER +// } +// } } failureConditions { From b1b8e7f6d6aa1b688d25c29d150810cf33963220 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 29 Oct 2020 16:43:23 -0400 Subject: [PATCH 31/39] Add PR feature back in --- .teamcity/src/templates/KibanaTemplate.kt | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/.teamcity/src/templates/KibanaTemplate.kt b/.teamcity/src/templates/KibanaTemplate.kt index ac89a383ee88f..117c30ddb86e3 100644 --- a/.teamcity/src/templates/KibanaTemplate.kt +++ b/.teamcity/src/templates/KibanaTemplate.kt @@ -28,16 +28,16 @@ object KibanaTemplate : Template({ features { perfmon { } -// pullRequests { -// vcsRootExtId = "${Kibana.id}" -// provider = github { -// authType = token { -// token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" -// } -// filterTargetBranch = "refs/heads/master_teamcity" -// filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER -// } -// } + pullRequests { + vcsRootExtId = "${Kibana.id}" + provider = github { + authType = token { + token = "credentialsJSON:07d22002-12de-4627-91c3-672bdb23b55b" + } + filterTargetBranch = "refs/heads/master_teamcity" + filterAuthorRole = PullRequests.GitHubRoleFilter.MEMBER + } + } } failureConditions { From e8de1eaea34736077dbfa68f8f7fd927a5e15419 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 29 Oct 2020 17:05:51 -0400 Subject: [PATCH 32/39] Add branchFilter to triggers --- .teamcity/src/builds/BaselineCi.kt | 1 + .teamcity/src/builds/HourlyCi.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/.teamcity/src/builds/BaselineCi.kt b/.teamcity/src/builds/BaselineCi.kt index df32d59674092..ae316960acf89 100644 --- a/.teamcity/src/builds/BaselineCi.kt +++ b/.teamcity/src/builds/BaselineCi.kt @@ -21,6 +21,7 @@ object BaselineCi : BuildType({ triggers { vcs { + branchFilter = "refs/heads/master_teamcity" // perCheckinTriggering = true // TODO re-enable this later, it wreaks havoc when I merge upstream } } diff --git a/.teamcity/src/builds/HourlyCi.kt b/.teamcity/src/builds/HourlyCi.kt index 83a8242c752f6..605a22f012976 100644 --- a/.teamcity/src/builds/HourlyCi.kt +++ b/.teamcity/src/builds/HourlyCi.kt @@ -18,6 +18,7 @@ object HourlyCi : BuildType({ hours = "*" minutes = "0" } + branchFilter = "refs/heads/master_teamcity" triggerBuild = always() withPendingChangesOnly = true } From 77b352f0a14ed4f4b1c5085653f0558d7d4e6aaf Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 9 Nov 2020 11:07:09 -0500 Subject: [PATCH 33/39] Add server integration tests --- .teamcity/src/builds/es_snapshots/Verify.kt | 4 ++-- .teamcity/src/builds/test/AllTests.kt | 2 +- .../test/{ApiIntegration.kt => ApiServerIntegration.kt} | 7 ++++--- .teamcity/src/projects/Kibana.kt | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) rename .teamcity/src/builds/test/{ApiIntegration.kt => ApiServerIntegration.kt} (52%) diff --git a/.teamcity/src/builds/es_snapshots/Verify.kt b/.teamcity/src/builds/es_snapshots/Verify.kt index 0acf0dccdf33f..c778814af536c 100644 --- a/.teamcity/src/builds/es_snapshots/Verify.kt +++ b/.teamcity/src/builds/es_snapshots/Verify.kt @@ -6,7 +6,7 @@ import builds.default.defaultCiGroups import builds.oss.OssBuild import builds.oss.OssPluginFunctional import builds.oss.ossCiGroups -import builds.test.ApiIntegration +import builds.test.ApiServerIntegration import builds.test.JestIntegration import dependsOn import jetbrains.buildServer.configs.kotlin.v2019_2.* @@ -49,7 +49,7 @@ val defaultBuildsToClone = listOf( val defaultCloned = defaultBuildsToClone.map { cloneForVerify(it) } val integrationsBuildsToClone = listOf( - ApiIntegration, + ApiServerIntegration, JestIntegration ) diff --git a/.teamcity/src/builds/test/AllTests.kt b/.teamcity/src/builds/test/AllTests.kt index 2e2213d55649e..d1b5898d1a5f5 100644 --- a/.teamcity/src/builds/test/AllTests.kt +++ b/.teamcity/src/builds/test/AllTests.kt @@ -8,5 +8,5 @@ object AllTests : BuildType({ description = "All Non-Functional Tests" type = Type.COMPOSITE - dependsOn(QuickTests, Jest, XPackJest, JestIntegration, ApiIntegration) + dependsOn(QuickTests, Jest, XPackJest, JestIntegration, ApiServerIntegration) }) diff --git a/.teamcity/src/builds/test/ApiIntegration.kt b/.teamcity/src/builds/test/ApiServerIntegration.kt similarity index 52% rename from .teamcity/src/builds/test/ApiIntegration.kt rename to .teamcity/src/builds/test/ApiServerIntegration.kt index edc7817336fc1..d595840c879e6 100644 --- a/.teamcity/src/builds/test/ApiIntegration.kt +++ b/.teamcity/src/builds/test/ApiServerIntegration.kt @@ -4,12 +4,13 @@ import addTestSettings import jetbrains.buildServer.configs.kotlin.v2019_2.BuildType import runbld -object ApiIntegration : BuildType({ - name = "API Integration" - description = "Executes API Integration Tests" +object ApiServerIntegration : BuildType({ + name = "API/Server Integration" + description = "Executes API and Server Integration Tests" steps { runbld("API Integration", "yarn run grunt run:apiIntegrationTests") + runbld("Server Integration", "yarn run grunt run:serverIntegrationTests") } addTestSettings() diff --git a/.teamcity/src/projects/Kibana.kt b/.teamcity/src/projects/Kibana.kt index 4e1dd43b6f900..20c30eedf5b91 100644 --- a/.teamcity/src/projects/Kibana.kt +++ b/.teamcity/src/projects/Kibana.kt @@ -106,7 +106,7 @@ fun Kibana(config: KibanaConfiguration = KibanaConfiguration()) : Project { buildType(JestIntegration) } - buildType(ApiIntegration) + buildType(ApiServerIntegration) buildType(QuickTests) buildType(AllTests) } From 60909b731948e8cc70ac1f421e843eab92f7ae67 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 9 Nov 2020 11:07:36 -0500 Subject: [PATCH 34/39] Remove lock file symlinks check --- .ci/teamcity/checks/lock_file_symlinks.sh | 7 ------- .teamcity/src/builds/Checks.kt | 1 - 2 files changed, 8 deletions(-) delete mode 100755 .ci/teamcity/checks/lock_file_symlinks.sh diff --git a/.ci/teamcity/checks/lock_file_symlinks.sh b/.ci/teamcity/checks/lock_file_symlinks.sh deleted file mode 100755 index 1de8699012a96..0000000000000 --- a/.ci/teamcity/checks/lock_file_symlinks.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -source "$(dirname "${0}")/../util.sh" - -yarn run grunt run:checkLockfileSymlinks diff --git a/.teamcity/src/builds/Checks.kt b/.teamcity/src/builds/Checks.kt index a4da43b8c9f3e..1228ea4d94f4c 100644 --- a/.teamcity/src/builds/Checks.kt +++ b/.teamcity/src/builds/Checks.kt @@ -14,7 +14,6 @@ object Checks : BuildType({ "Check Telemetry Schema" to ".ci/teamcity/checks/telemetry.sh", "Check TypeScript Projects" to ".ci/teamcity/checks/ts_projects.sh", "Check File Casing" to ".ci/teamcity/checks/file_casing.sh", - "Check Lockfile Symlinks" to ".ci/teamcity/checks/lock_file_symlinks.sh", "Check Licenses" to ".ci/teamcity/checks/licenses.sh", "Verify NOTICE" to ".ci/teamcity/checks/verify_notice.sh", "Test Hardening" to ".ci/teamcity/checks/test_hardening.sh", From 3d7913efce03a2bbd949cac96727d5d3a67d8dcd Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 9 Nov 2020 11:11:15 -0500 Subject: [PATCH 35/39] Replace grunt call with FTR one-liner --- .ci/teamcity/oss/ci_group.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.ci/teamcity/oss/ci_group.sh b/.ci/teamcity/oss/ci_group.sh index bf6a80e88de98..3b2fb7ea912b7 100755 --- a/.ci/teamcity/oss/ci_group.sh +++ b/.ci/teamcity/oss/ci_group.sh @@ -5,7 +5,11 @@ set -euo pipefail source "$(dirname "${0}")/../util.sh" export CI_GROUP="$1" -export JOB=kibana-ciGroup${CI_GROUP} +export JOB="kibana-ciGroup$CI_GROUP" export KIBANA_INSTALL_DIR="$PARENT_DIR/build/kibana-build-oss" -checks-reporter-with-killswitch "Functional tests / Group ${CI_GROUP}" yarn run grunt "run:functionalTests_ciGroup${CI_GROUP}"; +checks-reporter-with-killswitch "Functional tests / Group $CI_GROUP" \ + node scripts/functional_tests \ + --debug --bail \ + --kibana-install-dir "$KIBANA_INSTALL_DIR" \ + --include-tag "ciGroup$CI_GROUP" From 1c681aa044305dd7e5004efd3ab02eccc9bc7107 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 16 Nov 2020 16:36:57 -0500 Subject: [PATCH 36/39] Sync up with other changes from master --- .ci/teamcity/setup_env.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.ci/teamcity/setup_env.sh b/.ci/teamcity/setup_env.sh index 85c420e4a5ec2..f662d36247a2f 100755 --- a/.ci/teamcity/setup_env.sh +++ b/.ci/teamcity/setup_env.sh @@ -24,6 +24,8 @@ tc_set_env NODE_OPTIONS "${NODE_OPTIONS:-} --max-old-space-size=4096" tc_set_env FORCE_COLOR 1 tc_set_env TEST_BROWSER_HEADLESS 1 +tc_set_env ELASTIC_APM_ENVIRONMENT ci + if [[ "${KIBANA_CI_REPORTER_KEY_BASE64-}" ]]; then tc_set_env KIBANA_CI_REPORTER_KEY "$(echo "$KIBANA_CI_REPORTER_KEY_BASE64" | base64 -d)" fi @@ -40,7 +42,7 @@ else tc_set_env CHECKS_REPORTER_ACTIVE false fi -tc_set_env INGEST_MANAGEMENT_PACKAGE_REGISTRY_PORT 6104 # Any unused port is fine, used by ingest manager tests +tc_set_env FLEET_PACKAGE_REGISTRY_PORT 6104 # Any unused port is fine, used by ingest manager tests if [[ "$(which google-chrome-stable)" || "$(which google-chrome)" ]]; then echo "Chrome detected, setting DETECT_CHROMEDRIVER_VERSION=true" From ff13a52a0d196c04afad078f10f4edd9ce6046fe Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 16 Nov 2020 17:45:32 -0500 Subject: [PATCH 37/39] Fix tc_retry return status --- .ci/teamcity/util.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.ci/teamcity/util.sh b/.ci/teamcity/util.sh index 3d1ba7d9aaf58..fe1afdf04c54c 100755 --- a/.ci/teamcity/util.sh +++ b/.ci/teamcity/util.sh @@ -72,8 +72,9 @@ tc_retry() { echo "##teamcity[setParameter name='elastic.build.flaky' value='true']" tc_end_block "Retryable Step - Attempt #2" else + status="$?" tc_end_block "Retryable Step - Attempt #2" - return "$?" + return "$status" fi } tc_end_block "Retryable Step - Attempt #1" From 5cc240d2aa4b559ce7f28ef233ed309eb83f1a29 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Wed, 18 Nov 2020 11:34:01 -0500 Subject: [PATCH 38/39] Bring over changes from master --- .ci/teamcity/default/build.sh | 1 + .ci/teamcity/default/build_plugins.sh | 1 + .ci/teamcity/oss/build.sh | 1 + .ci/teamcity/oss/build_plugins.sh | 1 + 4 files changed, 4 insertions(+) diff --git a/.ci/teamcity/default/build.sh b/.ci/teamcity/default/build.sh index 269c300f43233..af90e24ef5fe8 100755 --- a/.ci/teamcity/default/build.sh +++ b/.ci/teamcity/default/build.sh @@ -7,6 +7,7 @@ source "$(dirname "${0}")/../util.sh" tc_start_block "Build Platform Plugins" node scripts/build_kibana_platform_plugins \ --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ + --scan-dir "$KIBANA_DIR/test/common/fixtures/plugins" \ --scan-dir "$XPACK_DIR/test/plugin_functional/plugins" \ --scan-dir "$XPACK_DIR/test/functional_with_es_ssl/fixtures/plugins" \ --scan-dir "$XPACK_DIR/test/alerting_api_integration/plugins" \ diff --git a/.ci/teamcity/default/build_plugins.sh b/.ci/teamcity/default/build_plugins.sh index 19203ee3a5b10..76c553b4f8fa2 100755 --- a/.ci/teamcity/default/build_plugins.sh +++ b/.ci/teamcity/default/build_plugins.sh @@ -7,6 +7,7 @@ source "$(dirname "${0}")/../util.sh" tc_start_block "Build Platform Plugins" node scripts/build_kibana_platform_plugins \ --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ + --scan-dir "$KIBANA_DIR/test/common/fixtures/plugins" \ --scan-dir "$XPACK_DIR/test/plugin_functional/plugins" \ --scan-dir "$XPACK_DIR/test/functional_with_es_ssl/fixtures/plugins" \ --scan-dir "$XPACK_DIR/test/alerting_api_integration/plugins" \ diff --git a/.ci/teamcity/oss/build.sh b/.ci/teamcity/oss/build.sh index 0d508a5d4ec77..3ef14b1663355 100755 --- a/.ci/teamcity/oss/build.sh +++ b/.ci/teamcity/oss/build.sh @@ -10,6 +10,7 @@ node scripts/build_kibana_platform_plugins \ --filter '!alertingExample' \ --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ --scan-dir "$KIBANA_DIR/test/interpreter_functional/plugins" \ + --scan-dir "$KIBANA_DIR/test/common/fixtures/plugins" \ --verbose tc_end_block "Build Platform Plugins" diff --git a/.ci/teamcity/oss/build_plugins.sh b/.ci/teamcity/oss/build_plugins.sh index cc5525fcb0a09..28e3c9247f1d4 100755 --- a/.ci/teamcity/oss/build_plugins.sh +++ b/.ci/teamcity/oss/build_plugins.sh @@ -11,5 +11,6 @@ node scripts/build_kibana_platform_plugins \ --filter '!alertingExample' \ --scan-dir "$KIBANA_DIR/test/plugin_functional/plugins" \ --scan-dir "$KIBANA_DIR/test/interpreter_functional/plugins" \ + --scan-dir "$KIBANA_DIR/test/common/fixtures/plugins" \ --verbose tc_end_block "Build Platform Plugins - OSS" From 1c721509e988f2835652c564a2ae0b55459ef389 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Thu, 19 Nov 2020 17:28:16 -0500 Subject: [PATCH 39/39] A little bit of cleanup --- .teamcity/src/Extensions.kt | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/.teamcity/src/Extensions.kt b/.teamcity/src/Extensions.kt index c24bf9515849c..120b333d43e72 100644 --- a/.teamcity/src/Extensions.kt +++ b/.teamcity/src/Extensions.kt @@ -21,9 +21,6 @@ fun ProjectFeatures.kibanaAgent(init: ProjectFeature.() -> Unit) { param("growingId", "true") param("agent_pool_id", "-2") param("preemptible", "false") -// param("sourceProject", "elastic-kibana-184716") -// param("sourceImageFamily", "kibana-ci-elastic-dev") -// param("sourceImageFamily", "elastic-kibana-ci-ubuntu-1804-lts-nocache") param("sourceProject", "elastic-images-prod") param("sourceImageFamily", "elastic-kibana-ci-ubuntu-1804-lts") param("zone", "us-central1-a") @@ -83,34 +80,11 @@ fun BuildType.addTestSettings() { } } -fun BuildType.addTestArtifacts() { - this.artifactRules += "\n" + testArtifactRules -} - fun BuildType.addSlackNotifications(to: String = "#kibana-teamcity-testing") { params { param("elastic.slack.enabled", "true") param("elastic.slack.channels", to) } -// features { -// notifications { -// notifierSettings = slackNotifier { -// connection = "KIBANA_SLACK" -// sendTo = to -// messageFormat = verboseMessageFormat { -// addBranch = true -// addChanges = true -// addStatusText = true -// maximumNumberOfChanges = 5 -// } -// } -// buildFailedToStart = true -// buildFailed = true -// buildFinishedSuccessfully = false -// firstBuildErrorOccurs = true -// buildProbablyHanging = true -// } -// } } fun BuildType.dependsOn(buildType: BuildType, init: SnapshotDependency.() -> Unit = {}) {