Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jenkins pipeline with parallel cigroups #45285

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
148b8c0
Revert "Revert "Revert "[ci] compress jobs for CI stability" (#44584)""
brianseeders Sep 11, 2019
8dcfb29
Pipeline
brianseeders Aug 23, 2019
eee98f5
WIP some work for parallelization with ciGroups
brianseeders Aug 28, 2019
a4e0c50
Fix xpack kibana install dir, and add some debugging
brianseeders Aug 30, 2019
742d70d
Attempt to quick fix a few tests
brianseeders Aug 30, 2019
1ade439
Recombine test groups, and try runbld again
brianseeders Aug 30, 2019
73af6da
Mostly cleanup, and fix failed_tests reporting to hopefully work for …
brianseeders Aug 30, 2019
fd89471
Fix typo in shell script
brianseeders Aug 30, 2019
3c21164
Remove some debug code
brianseeders Aug 30, 2019
6bf5a3b
Add support for changing es transport.port during testing via TEST_ES…
brianseeders Aug 30, 2019
4cd06c1
Fix test that uses hard-coded es transport port and add it back in to…
brianseeders Aug 30, 2019
b65de1a
Disable checks reporter again for now
brianseeders Aug 30, 2019
11b41c4
Set env var for TEST_ES_TRANSPORT_PORT in pipeline
brianseeders Aug 30, 2019
dbe0d39
Update Jenkinsfile for shorter testrunner labels
brianseeders Sep 3, 2019
4c1503a
Fix another hard-coded transport port
brianseeders Sep 3, 2019
a7a8e58
Fix a new test with hard-coded URLs
brianseeders Sep 3, 2019
0253cc6
Jenkinsfile cleanup and fix one of the groups
brianseeders Sep 3, 2019
c2902df
Fix double slash
brianseeders Sep 3, 2019
e8afca9
Testing vault credentials on jenkins server
brianseeders Sep 4, 2019
6f0792d
Add a non-existent credential
brianseeders Sep 4, 2019
12ce5df
Revert "Add a non-existent credential"
brianseeders Sep 4, 2019
bfc36f2
Try github-checks-reporter again
brianseeders Sep 4, 2019
6e99023
github-checks-reporter should only run for elastic/kibana, forks won'…
brianseeders Sep 4, 2019
c921b81
Clean up some debug code
brianseeders Sep 4, 2019
061c778
Changing names around to try to make BlueOcean UI a little better
brianseeders Sep 5, 2019
ab13cea
Add more stages
brianseeders Sep 5, 2019
a848186
Make some changes to stage structure to mirror a nested example from …
brianseeders Sep 5, 2019
2c003a9
Handle TODOs, and some cleanup in Jenkinsfile
brianseeders Sep 5, 2019
d0bee6b
Pass GIT_BRANCH when started without GHPRB, fix branch check
brianseeders Sep 6, 2019
740bebe
Fix mailer problem and add code that ensures all tests are in cigroup…
brianseeders Sep 9, 2019
14db0f4
Test adding worker/job name to junit report paths
brianseeders Sep 9, 2019
d58b7b9
Remove some duplication from ci_setup scripts
brianseeders Sep 9, 2019
63f80c6
Fix unit test that uses junit path
brianseeders Sep 9, 2019
9c10400
Don't reinstall node every time setup_env is run
brianseeders Sep 9, 2019
6a0dc7a
Fix yarn install logic
brianseeders Sep 9, 2019
763ea65
Fix another unit test that uses junit output dir
brianseeders Sep 10, 2019
60717cf
Download latest ES snapshot after kibana builds
brianseeders Sep 10, 2019
b653fdc
Make sure junit reports are always processed
brianseeders Sep 10, 2019
26e55aa
Add two failing tests for testing purposes
brianseeders Sep 10, 2019
d4e2cf3
Add support to Jenkinsfile for kibana build e-mails
brianseeders Sep 10, 2019
a4cf81c
Remove some debug code for email sending
brianseeders Sep 10, 2019
8979151
Change JOB env handling in junit paths and move it to a sub-directory
brianseeders Sep 10, 2019
f7c02e3
Revert "Add two failing tests for testing purposes"
brianseeders Sep 11, 2019
0a6acc8
Fix junit report path in test
brianseeders Sep 11, 2019
2a6a838
Don't send kibana emails on build abort
brianseeders Sep 11, 2019
e0944a7
Address PR feedback, formatting and use built-in url formatting library
brianseeders Sep 11, 2019
3523893
Fix path formatting for functional test
brianseeders Sep 11, 2019
496ba75
Add email sending back in to Jenkinsfile
brianseeders Sep 11, 2019
3253cee
Fix another unit test with path problem
brianseeders Sep 11, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 17 additions & 4 deletions .ci/jobs.yml
Original file line number Diff line number Diff line change
@@ -1,21 +1,34 @@
JOB:
- intake
- firefoxSmoke
- kibana-intake
- x-pack-intake
- kibana-firefoxSmoke
- kibana-ciGroup1
- kibana-ciGroup2
- kibana-ciGroup3
- kibana-ciGroup4
- kibana-ciGroup5
- kibana-ciGroup6
# - kibana-visualRegression
- kibana-ciGroup7
- kibana-ciGroup8
- kibana-ciGroup9
- kibana-ciGroup10
- kibana-ciGroup11
- kibana-ciGroup12
- kibana-visualRegression

# make sure all x-pack-ciGroups are listed in test/scripts/jenkins_xpack_ci_group.sh
- x-pack-firefoxSmoke
- x-pack-ciGroup1
- x-pack-ciGroup2
- x-pack-ciGroup3
- x-pack-ciGroup4
- x-pack-ciGroup5
# - x-pack-visualRegression
- x-pack-ciGroup6
- x-pack-ciGroup7
- x-pack-ciGroup8
- x-pack-ciGroup9
- x-pack-ciGroup10
- x-pack-visualRegression

# `~` is yaml for `null`
exclude: ~
10 changes: 8 additions & 2 deletions .ci/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ source src/dev/ci_setup/setup.sh
source src/dev/ci_setup/checkout_sibling_es.sh

case "$JOB" in
intake)
kibana-intake)
./test/scripts/jenkins_unit.sh
;;
kibana-ciGroup*)
Expand All @@ -21,16 +21,22 @@ kibana-ciGroup*)
kibana-visualRegression*)
./test/scripts/jenkins_visual_regression.sh
;;
firefoxSmoke*)
kibana-firefoxSmoke*)
./test/scripts/jenkins_firefox_smoke.sh
;;
x-pack-intake)
./test/scripts/jenkins_xpack.sh
;;
x-pack-ciGroup*)
export CI_GROUP="${JOB##x-pack-ciGroup}"
./test/scripts/jenkins_xpack_ci_group.sh
;;
x-pack-visualRegression*)
./test/scripts/jenkins_xpack_visual_regression.sh
;;
x-pack-firefoxSmoke*)
./test/scripts/jenkins_xpack_firefox_smoke.sh
;;
*)
echo "JOB '$JOB' is not implemented."
exit 1
Expand Down
268 changes: 268 additions & 0 deletions Jenkinsfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
#!/bin/groovy

properties([
durabilityHint('PERFORMANCE_OPTIMIZED'),
])

stage("Kibana Pipeline") { // This stage is just here to help the BlueOcean UI a little bit
timeout(time: 180, unit: 'MINUTES') {
timestamps {
ansiColor('xterm') {
catchError {
parallel([
'kibana-intake-agent': legacyJobRunner('kibana-intake'),
'x-pack-intake-agent': legacyJobRunner('x-pack-intake'),
'kibana-oss-agent': withWorkers('kibana-oss-tests', { buildOss() }, [
'oss-ciGroup1': getOssCiGroupWorker(1),
'oss-ciGroup2': getOssCiGroupWorker(2),
'oss-ciGroup3': getOssCiGroupWorker(3),
'oss-ciGroup4': getOssCiGroupWorker(4),
'oss-ciGroup5': getOssCiGroupWorker(5),
'oss-ciGroup6': getOssCiGroupWorker(6),
'oss-ciGroup7': getOssCiGroupWorker(7),
'oss-ciGroup8': getOssCiGroupWorker(8),
'oss-ciGroup9': getOssCiGroupWorker(9),
'oss-ciGroup10': getOssCiGroupWorker(10),
'oss-ciGroup11': getOssCiGroupWorker(11),
'oss-ciGroup12': getOssCiGroupWorker(12),
'oss-visualRegression': getPostBuildWorker('visualRegression', { runbld './test/scripts/jenkins_visual_regression.sh' }),
'oss-firefoxSmoke': getPostBuildWorker('firefoxSmoke', { runbld './test/scripts/jenkins_firefox_smoke.sh' }),
]),
'kibana-xpack-agent': withWorkers('kibana-xpack-tests', { buildXpack() }, [
'xpack-ciGroup1': getXpackCiGroupWorker(1),
'xpack-ciGroup2': getXpackCiGroupWorker(2),
'xpack-ciGroup3': getXpackCiGroupWorker(3),
'xpack-ciGroup4': getXpackCiGroupWorker(4),
'xpack-ciGroup5': getXpackCiGroupWorker(5),
'xpack-ciGroup6': getXpackCiGroupWorker(6),
'xpack-ciGroup7': getXpackCiGroupWorker(7),
'xpack-ciGroup8': getXpackCiGroupWorker(8),
'xpack-ciGroup9': getXpackCiGroupWorker(9),
'xpack-ciGroup10': getXpackCiGroupWorker(10),
'xpack-firefoxSmoke': getPostBuildWorker('xpack-firefoxSmoke', { runbld './test/scripts/jenkins_xpack_firefox_smoke.sh' }),
'xpack-visualRegression': getPostBuildWorker('xpack-visualRegression', { runbld './test/scripts/jenkins_xpack_visual_regression.sh' }),
]),
])
}
node('flyweight') {
sendMail()
}
}
}
}
}

def withWorkers(name, preWorkerClosure = {}, workerClosures = [:]) {
return {
jobRunner('tests-xl') {
try {
doSetup()
preWorkerClosure()

def nextWorker = 1
def worker = { workerClosure ->
def workerNumber = nextWorker
nextWorker++

return {
workerClosure(workerNumber)
}
}

def workers = [:]
workerClosures.each { workerName, workerClosure ->
workers[workerName] = worker(workerClosure)
}

parallel(workers)
} finally {
catchError {
uploadAllGcsArtifacts(name)
}

catchError {
publishJunit()
}
}
}
}
}

def getPostBuildWorker(name, closure) {
return { workerNumber ->
def kibanaPort = "61${workerNumber}1"
def esPort = "61${workerNumber}2"
def esTransportPort = "61${workerNumber}3"

withEnv([
"CI_WORKER_NUMBER=${workerNumber}",
"TEST_KIBANA_HOST=localhost",
"TEST_KIBANA_PORT=${kibanaPort}",
"TEST_KIBANA_URL=http://elastic:changeme@localhost:${kibanaPort}",
"TEST_ES_URL=http://elastic:changeme@localhost:${esPort}",
"TEST_ES_TRANSPORT_PORT=${esTransportPort}",
"IS_PIPELINE_JOB=1",
]) {
closure()
}
}
}

def getOssCiGroupWorker(ciGroup) {
return getPostBuildWorker("ciGroup" + ciGroup, {
withEnv([
"CI_GROUP=${ciGroup}",
"JOB=kibana-ciGroup${ciGroup}",
]) {
runbld "./test/scripts/jenkins_ci_group.sh"
}
})
}

def getXpackCiGroupWorker(ciGroup) {
return getPostBuildWorker("xpack-ciGroup" + ciGroup, {
withEnv([
"CI_GROUP=${ciGroup}",
"JOB=xpack-kibana-ciGroup${ciGroup}",
]) {
runbld "./test/scripts/jenkins_xpack_ci_group.sh"
}
})
}

def legacyJobRunner(name) {
return {
parallel([
"${name}": {
withEnv([
"JOB=${name}",
]) {
jobRunner('linux && immutable') {
try {
runbld '.ci/run.sh'
} finally {
catchError {
uploadAllGcsArtifacts(name)
}
catchError {
publishJunit()
}
}
}
}
}
])
}
}

def jobRunner(label, closure) {
node(label) {
def scmVars = checkout scm

withEnv([
"CI=true",
"HOME=${env.JENKINS_HOME}",
"PR_SOURCE_BRANCH=${env.ghprbSourceBranch}",
"PR_TARGET_BRANCH=${env.ghprbTargetBranch}",
"PR_AUTHOR=${env.ghprbPullAuthorLogin}",
"TEST_BROWSER_HEADLESS=1",
"GIT_BRANCH=${scmVars.GIT_BRANCH}",
]) {
withCredentials([
string(credentialsId: 'vault-addr', variable: 'VAULT_ADDR'),
string(credentialsId: 'vault-role-id', variable: 'VAULT_ROLE_ID'),
string(credentialsId: 'vault-secret-id', variable: 'VAULT_SECRET_ID'),
]) {
// scm is configured to check out to the ./kibana directory
dir('kibana') {
closure()
}
}
}
}
}

// TODO what should happen if GCS, Junit, or email publishing fails? Unstable build? Failed build?

def uploadGcsArtifact(workerName, pattern) {
def storageLocation = "gs://kibana-ci-artifacts/jobs/${env.JOB_NAME}/${BUILD_NUMBER}/${workerName}" // TODO
// def storageLocation = "gs://kibana-pipeline-testing/jobs/pipeline-test/${BUILD_NUMBER}/${workerName}"

googleStorageUpload(
credentialsId: 'kibana-ci-gcs-plugin',
bucket: storageLocation,
pattern: pattern,
sharedPublicly: true,
showInline: true,
)
}

def uploadAllGcsArtifacts(workerName) {
def ARTIFACT_PATTERNS = [
'target/kibana-*',
'target/junit/**/*',
'test/**/screenshots/**/*.png',
'test/functional/failure_debug/html/*.html',
'x-pack/test/**/screenshots/**/*.png',
'x-pack/test/functional/failure_debug/html/*.html',
'x-pack/test/functional/apps/reporting/reports/session/*.pdf',
]

ARTIFACT_PATTERNS.each { pattern ->
uploadGcsArtifact(workerName, pattern)
}
}

def publishJunit() {
junit(testResults: 'target/junit/**/*.xml', allowEmptyResults: true, keepLongStdio: true)
}

def sendMail() {
sendInfraMail()
sendKibanaMail()
}

def sendInfraMail() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wonder if infra still wants these emails.

catchError {
step([
$class: 'Mailer',
notifyEveryUnstableBuild: true,
recipients: '[email protected]',
sendToIndividuals: false
])
}
}

def sendKibanaMail() {
catchError {
if(params.NOTIFY_ON_FAILURE && currentBuild.result != 'SUCCESS' && currentBuild.result != 'ABORTED') {
emailext(
// to: '[email protected]',
to: '[email protected]', // TODO switch this out after testing
subject: "${env.PROJECT_NAME} - Build # ${env.BUILD_NUMBER} - ${currentBuild.result}",
body: '${SCRIPT,template="groovy-html.template"}',
mimeType: 'text/html',
)
}
}
}

def runbld(script) {
sh '#!/usr/local/bin/runbld\n' + script
}

def bash(script) {
sh "#!/bin/bash -x\n${script}"
}

def doSetup() {
runbld "./test/scripts/jenkins_setup.sh"
}

def buildOss() {
runbld "./test/scripts/jenkins_build_kibana.sh"
}

def buildXpack() {
runbld "./test/scripts/jenkins_xpack_build_kibana.sh"
}
2 changes: 2 additions & 0 deletions packages/kbn-test/src/es/es_test_cluster.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ export function createEsTestCluster(options = {}) {
basePath,
esArgs,
};
const transportPort = esTestConfig.getTransportPort();

const cluster = new Cluster({ log, ssl });

Expand Down Expand Up @@ -88,6 +89,7 @@ export function createEsTestCluster(options = {}) {
`cluster.name=${clusterName}`,
`http.port=${port}`,
'discovery.type=single-node',
`transport.port=${transportPort}`,
...esArgs,
],
esEnvVars,
Expand Down
4 changes: 4 additions & 0 deletions packages/kbn-test/src/es/es_test_config.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ export const esTestConfig = new (class EsTestConfig {
return process.env.TEST_ES_FROM || 'snapshot';
}

getTransportPort() {
return process.env.TEST_ES_TRANSPORT_PORT || '9300-9400';
}

getUrlParts() {
// Allow setting one complete TEST_ES_URL for Es like https://elastic:changeme@myCloudInstance:9200
if (process.env.TEST_ES_URL) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,10 @@ describe('dev/mocha/junit report generation', () => {
mocha.addFile(resolve(PROJECT_DIR, 'test.js'));
await new Promise(resolve => mocha.run(resolve));
const report = await fcb(cb =>
parseString(readFileSync(resolve(PROJECT_DIR, 'target/junit/TEST-test.xml')), cb)
parseString(
readFileSync(resolve(PROJECT_DIR, 'target/junit', process.env.JOB || '.', 'TEST-test.xml')),
cb
)
);

// test case results are wrapped in <testsuites></testsuites>
Expand Down
8 changes: 7 additions & 1 deletion packages/kbn-test/src/mocha/junit_report_generation.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,13 @@ export function setupJUnitReportGeneration(runner, options = {}) {
}
});

const reportPath = resolve(rootDirectory, `target/junit/TEST-${reportName}.xml`);
const reportPath = resolve(
rootDirectory,
'target/junit',
process.env.JOB || '.',
tylersmalley marked this conversation as resolved.
Show resolved Hide resolved
`TEST-${reportName}.xml`
);

const reportXML = builder.end({
pretty: true,
indent: ' ',
Expand Down
Loading