We are currently in the process of setting up a CI/CD pipeline for our SCP CF environment based on Project Piper. After a lot of trial & error, we have made significant process, however we are still not able to run our karma tests.
We understood that we need to use the karma-webdriver-launcher, however we are not able to start/connect to Chrome in the sidecar container.
Relevant logs:
[Pipeline] sh
+ cd ./nodejs
+ npm test
> nodejs#1.0.0 test /var/jenkins_home/workspace/CICD_Multibranch_master/nodejs
> karma start ./karma.conf.js
10 07 2019 14:42:53.897:DEBUG [config]: Loading config /var/jenkins_home/workspace/CICD_Multibranch_master/nodejs/karma.conf.js
10 07 2019 14:42:53.906:DEBUG [karma-server]: Final config [{"LOG_DISABLE":"1","LOG_ERROR":"2","LOG_WARN":"3","LOG_INFO":"4","LOG_DEBUG":"5","frameworks":"6","protocol":"7","port":9876,"listenAddress":"8","hostname":"9","httpsServerConfig":"10","basePath":"11","files":"12","browserConsoleLogOptions":"13","customContextFile":null,"customDebugFile":null,"customClientContextFile":null,"exclude":"14","logLevel":"5","colors":false,"autoWatch":false,"autoWatchBatchDelay":250,"restartOnFileChange":false,"usePolling":true,"reporters":"15","singleRun":true,"browsers":"16","captureTimeout":60000,"proxies":"17","proxyValidateSSL":true,"preprocessors":"18","urlRoot":"19","reportSlowerThan":0,"loggers":"20","transports":"21","forceJSONP":false,"plugins":"22","client":"23","defaultClient":"23","browserDisconnectTimeout":2000,"browserDisconnectTolerance":0,"browserNoActivityTimeout":30000,"processKillTimeout":2000,"concurrency":null,"failOnEmptyTestSuite":true,"retryLimit":2,"detached":false,"crossOriginAttribute":true,"browserSocketTimeout":20000,"cmd":"24","configFile":"25","customLaunchers":"26","junitReporter":"27"},"OFF","ERROR","WARN","INFO","DEBUG",["28"],"http:","0.0.0.0","localhost",{},"/var/jenkins_home/workspace/CICD_Multibranch_master/nodejs",["29","30"],{"level":"31","format":"32","terminal":true},["25"],["33"],["34"],{},{},"/",["35"],["36","37"],["38","39","40","41","42"],{"args":"43","useIframe":true,"runInParent":false,"captureConsole":true,"clearContext":true},"start","/var/jenkins_home/workspace/CICD_Multibranch_master/nodejs/karma.conf.js",{"chromeSel":"44"},{"outputFile":"45","suite":"46"},"qunit",{"pattern":"47","served":true,"included":true,"watched":true,"nocache":false,"weight":"48"},{"pattern":"49","served":true,"included":true,"watched":true,"nocache":false,"weight":"50"},"debug","%b %T: %m","junit","chromeSel",{"type":"51","layout":"52"},"polling","websocket","karma-qunit","karma-junit-reporter","karma-chrome-launcher","karma-webdriver-launcher",{"launcher:chromeSel":"53"},[],{"base":"54","config":"55","browserName":"56"},"test-results-karma.xml","","/var/jenkins_home/workspace/CICD_Multibranch_master/nodejs/server.js",[1,0,0,0,0,0],"/var/jenkins_home/workspace/CICD_Multibranch_master/nodejs/tests/sampleTest.spec.js",[1,0,0,0,0,0],"console",{"type":"57","pattern":"58"},["59",null],"WebDriver",{"hostname":"60","port":4444},"chrome","pattern","%d{DATE}:%p [%c]: %m","factory","selenium"]
10 07 2019 14:42:53.907:DEBUG [plugin]: Loading plugin karma-qunit.
10 07 2019 14:42:53.908:DEBUG [plugin]: Loading plugin karma-junit-reporter.
10 07 2019 14:42:53.923:DEBUG [plugin]: Loading plugin karma-chrome-launcher.
10 07 2019 14:42:53.931:DEBUG [plugin]: Loading plugin karma-webdriver-launcher.
10 07 2019 14:42:54.179:DEBUG [plugin]: Loading inlined plugin (defining launcher:chromeSel).
10 07 2019 14:42:54.193:DEBUG [web-server]: Instantiating middleware
10 07 2019 14:42:54.194:DEBUG [reporter]: Trying to load reporter: junit
10 07 2019 14:42:54.195:DEBUG [reporter]: Trying to load color-version of reporter: junit (junit_color)
10 07 2019 14:42:54.195:DEBUG [reporter]: Couldn't load color-version.
10 07 2019 14:42:54.224:INFO [karma-server]: Karma v4.1.0 server started at http://0.0.0.0:9876/
10 07 2019 14:42:54.225:INFO [launcher]: Launching browsers chromeSel with concurrency unlimited
10 07 2019 14:42:54.231:INFO [launcher]: Starting browser chrome via Remote WebDriver
10 07 2019 14:42:54.232:DEBUG [launcher]: null -> BEING_CAPTURED
10 07 2019 14:42:54.232:DEBUG [temp-dir]: Creating temp dir at /tmp/karma-89562642
10 07 2019 14:42:54.235:DEBUG [WebDriver]: WebDriver config: {"hostname":"selenium","port":4444}
10 07 2019 14:42:54.235:DEBUG [WebDriver]: Browser capabilities: {"platform":"ANY","testName":"Karma test","tags":[],"version":"","base":"WebDriver","browserName":"chrome"}
10 07 2019 14:43:54.281:WARN [launcher]: chrome via Remote WebDriver have not captured in 60000 ms, killing.
10 07 2019 14:43:54.286:DEBUG [launcher]: BEING_CAPTURED -> BEING_KILLED
10 07 2019 14:43:54.355:INFO [WebDriver]: Killed Karma test.
10 07 2019 14:43:54.355:DEBUG [launcher]: Process chrome via Remote WebDriver exited with code -1 and signal timeout
10 07 2019 14:43:54.356:DEBUG [temp-dir]: Cleaning temp dir /tmp/karma-89562642
10 07 2019 14:43:54.358:INFO [launcher]: Trying to start chrome via Remote WebDriver again (1/2).
karma.conf.js:
// Karma configuration
module.exports = function(config) {
var webdriverConfig = {
hostname: 'selenium',
port: 4444
}
config.set({
// base path that will be used to resolve all patterns (eg. files, exclude)
basePath: '',
// frameworks to use
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
frameworks: ['qunit'],
plugins: ['karma-qunit','karma-junit-reporter','karma-chrome-launcher', 'karma-webdriver-launcher'],
// list of files / patterns to load in the browser
files: [
'server.js',
'tests/sampleTest.spec.js'
],
// list of files to exclude
exclude: [
],
// preprocess matching files before serving them to the browser
// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
preprocessors: {
},
// test results reporter to use
// possible values: 'dots', 'progress'
// available reporters: https://npmjs.org/browse/keyword/karma-reporter
reporters: ['junit'],
// web server port
//port: 9876,
//hostname: localhost,
// enable / disable colors in the output (reporters and logs)
colors: false,
// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_DEBUG,
// enable / disable watching file and executing tests whenever any file changes
autoWatch: false,
customLaunchers: {
'chromeSel': {
base: 'WebDriver',
config: webdriverConfig,
browserName: 'chrome'
}
},
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['chromeSel'],
// Continuous Integration mode
// if true, Karma captures browsers, runs the tests and exits
singleRun: true,
junitReporter: {
outputFile: 'test-results-karma.xml',
suite: ''
}
});
};
Jenkinsfile:
#!groovy
#Library('piper-lib-os') _
node(){
stage('Prepare') {
deleteDir()
checkout scm
setupCommonPipelineEnvironment
}
stage('Build') {
karmaExecuteTests script: this, modules: ['./nodejs'],
installCommand: "npm install karma karma-qunit karma-junit-reporter karma-chrome-launcher qunit karma-webdriver-launcher",
runCommand: 'npm test'
mtaBuild script:this, buildTarget: 'CF', applicationName: 'appLibrary'
}
stage('Deploy to QA') {
testsPublishResults script: this, junit: [updateResults: true, archive: true]
cloudFoundryDeploy(
script: this,
cloudFoundry: [apiEndpoint: 'https://api.cf.eu10.hana.ondemand.com', manifest: 'manifest.yml', org:'xxx', space:'xxx', credentialsId: 'xxx'],
deployTool: 'mtaDeployPlugin'
)
}
}
Thanks a lot,
Nico
To run the karmaExecuteTests step on your Jenkins, you need a Docker deamon installed. I assume this is the case.
In the Docker sidecar pattern the containers can talk to each other using their container names (karma & selenium). So for the browser (config.customLaunchers.chromeSel.config.hostname) you set the hostname correctly to selenium but you also need to set config.hostname to karma.
I have 2 rabbitmq box named : centos (192.168.1.115) and devserver (192.168.1.126)
in 'centos' I have :
I have queue named : toshovel bound to a topic exchange with routing key '#'
I test posting to the exchange and messages transfered to that queue.
In 'devserver' I have :
1. topic exchange named bino.topic
2. queue named : bino.nms.idc3d bound to bino.topic
This also tested. including using pika to publish message from 'centos' to 'devserver' so that I'm sure there is no firewall nor permition nor authentication (user/password : esx/esx) problem
Now I want to shovel from 'centos' to 'devserver'
I tried adding shovel in 'centos' per https://www.rabbitmq.com/shovel-dynamic.html
rabbitmqctl set_parameter shovel my-shovel '{"src-protocol": "amqp091", "src-uri": "amqp://esx:esx#192.168.1.115", "src-queue": "toshovel", "dest-protocol": "amqp091", "dest-uri": "amqp://esx:esx#192.168.126/", "dest-queue": "bino.nms.idc3d"}'
but the centos log said
from : /var/log/rabbitmq/rabbit\#centos.log
2018-06-20 14:03:21.800 [info] <0.735.0> terminating static worker with {timeout,{gen_server,call,[<0.763.0>,connect,60000]}}
2018-06-20 14:03:21.800 [error] <0.735.0> ** Generic server <0.735.0> terminating
** Last message in was {'$gen_cast',init}
** When Server state == {state,undefined,undefined,undefined,undefined,{<<"/">>,<<"my-shovel">>},dynamic,#{ack_mode => on_confirm,dest => #{dest_queue => <<"bino.nms.idc3d">>,fields_fun => #Fun<rabbit_shovel_parameters.11.26683091>,module => rabbit_amqp091_shovel,props_fun => #Fun<rabbit_shovel_parameters.12.26683091>,resource_decl => #Fun<rabbit_shovel_parameters.10.26683091>,uris => ["amqp://esx:esx#192.168.126/"]},name => <<"my-shovel">>,reconnect_delay => 5,shovel_type => dynamic,source => #{delete_after => never,module => rabbit_amqp091_shovel,prefetch_count => 1000,queue => <<"toshovel">>,resource_decl => #Fun<rabbit_shovel_parameters.14.26683091>,source_exchange_key => <<>>,uris => ["amqp://esx:esx#192.168.1.115"]}},undefined,undefined,undefined,undefined,undefined}
** Reason for termination ==
** {timeout,{gen_server,call,[<0.763.0>,connect,60000]}}
2018-06-20 14:03:21.800 [warning] <0.743.0> closing AMQP connection <0.743.0> (192.168.1.115:48223 -> 192.168.1.115:5672 - Shovel my-shovel, vhost: '/', user: 'esx'):
client unexpectedly closed TCP connection
2018-06-20 14:03:21.800 [error] <0.735.0> CRASH REPORT Process <0.735.0> with 1 neighbours exited with reason: {timeout,{gen_server,call,[<0.763.0>,connect,60000]}} in gen_server2:terminate/3 line 1166
2018-06-20 14:03:21.801 [error] <0.410.0> Supervisor {<0.410.0>,rabbit_shovel_dyn_worker_sup} had child {<<"/">>,<<"my-shovel">>} started with rabbit_shovel_worker:start_link(dynamic, {<<"/">>,<<"my-shovel">>}, [{<<"dest-protocol">>,<<"amqp091">>},{<<"dest-queue">>,<<"bino.nms.idc3d">>},{<<"dest-uri">>,<<"a...">>},...]) at <0.735.0> exit with reason {timeout,{gen_server,call,[<0.763.0>,connect,60000]}} in context child_terminated
2018-06-20 14:03:21.802 [error] <0.738.0> ** Generic server <0.738.0> terminating
** Last message in was {'EXIT',<0.735.0>,{timeout,{gen_server,call,[<0.763.0>,connect,60000]}}}
** When Server state == {state,amqp_network_connection,{state,#Port<0.29325>,<<"client 192.168.1.115:48223 -> 192.168.1.115:5672">>,10,<0.744.0>,131072,<0.737.0>,undefined,false},<0.742.0>,{amqp_params_network,<<"esx">>,<<"esx">>,<<"/">>,"192.168.1.115",5672,2047,0,10,60000,none,[#Fun<amqp_uri.12.90191702>,#Fun<amqp_uri.12.90191702>],[{<<"connection_name">>,longstr,<<"Shovel my-shovel">>}],[]},2047,[{<<"capabilities">>,table,[{<<"publisher_confirms">>,bool,true},{<<"exchange_exchange_bindings">>,bool,true},{<<"basic.nack">>,bool,true},{<<"consumer_cancel_notify">>,bool,true},{<<"connection.blocked">>,bool,true},{<<"consumer_priorities">>,bool,true},{<<"authentication_failure_close">>,bool,true},{<<"per_consumer_qos">>,bool,true},{<<"direct_reply_to">>,bool,true}]},{<<"cluster_name">>,longstr,<<"rabbit#centos">>},{<<"copyright">>,longstr,<<"Copyright (C) 2007-2018 Pivotal Software, Inc.">>},{<<"information">>,longstr,<<"Licensed under the MPL. See http://www.rabbitmq.com/">>},{<<"platform">>,longstr,<<"Erlang/OTP 20.3.4">>},{<<"product">>,longstr,<<"RabbitMQ">>},{<<"version">>,longstr,<<"3.7.5">>}],none,false}
** Reason for termination ==
** "stopping because dependent process <0.735.0> died: {timeout,\n {gen_server,call,\n [<0.763.0>,connect,\n 60000]}}"
2018-06-20 14:03:21.802 [error] <0.738.0> CRASH REPORT Process <0.738.0> with 0 neighbours exited with reason: "stopping because dependent process <0.735.0> died: {timeout,\n {gen_server,call,\n [<0.763.0>,connect,\n 60000]}}" in gen_server:handle_common_reply/8 line 726
2018-06-20 14:03:21.802 [error] <0.752.0> Supervisor {<0.752.0>,amqp_channel_sup} had child channel started with amqp_channel:start_link(network, <0.738.0>, 1, <0.753.0>, {<<"client 192.168.1.115:48223 -> 192.168.1.115:5672">>,1}) at <0.755.0> exit with reason {timeout,{gen_server,call,[<0.763.0>,connect,60000]}} in context child_terminated
2018-06-20 14:03:21.802 [error] <0.752.0> Supervisor {<0.752.0>,amqp_channel_sup} had child channel started with amqp_channel:start_link(network, <0.738.0>, 1, <0.753.0>, {<<"client 192.168.1.115:48223 -> 192.168.1.115:5672">>,1}) at <0.755.0> exit with reason reached_max_restart_intensity in context shutdown
2018-06-20 14:03:21.803 [error] <0.736.0> Supervisor {<0.736.0>,amqp_connection_sup} had child connection started with amqp_gen_connection:start_link(<0.737.0>, {amqp_params_network,<<"esx">>,<<"esx">>,<<"/">>,"192.168.1.115",5672,2047,0,10,60000,none,[#Fun<am..>,...],...}) at <0.738.0> exit with reason "stopping because dependent process <0.735.0> died: {timeout,\n {gen_server,call,\n [<0.763.0>,connect,\n 60000]}}" in context child_terminated
2018-06-20 14:03:21.803 [error] <0.736.0> Supervisor {<0.736.0>,amqp_connection_sup} had child connection started with amqp_gen_connection:start_link(<0.737.0>, {amqp_params_network,<<"esx">>,<<"esx">>,<<"/">>,"192.168.1.115",5672,2047,0,10,60000,none,[#Fun<am..>,...],...}) at <0.738.0> exit with reason reached_max_restart_intensity in context shutdown
2018-06-20 14:03:26.865 [info] <0.835.0> accepting AMQP connection <0.835.0> (192.168.1.115:47801 -> 192.168.1.115:5672)
2018-06-20 14:03:26.934 [info] <0.835.0> Connection <0.835.0> (192.168.1.115:47801 -> 192.168.1.115:5672) has a client-provided name: Shovel my-shovel
2018-06-20 14:03:26.935 [info] <0.835.0> connection <0.835.0> (192.168.1.115:47801 -> 192.168.1.115:5672 - Shovel my-shovel): user 'esx' authenticated and granted access to vhost '/'
2018-06-20 14:04:26.938 [info] <0.827.0> terminating static worker with {timeout,{gen_server,call,[<0.855.0>,connect,60000]}}
2018-06-20 14:04:26.938 [error] <0.827.0> ** Generic server <0.827.0> terminating
** Last message in was {'$gen_cast',init}
** When Server state == {state,undefined,undefined,undefined,undefined,{<<"/">>,<<"my-shovel">>},dynamic,#{ack_mode => on_confirm,dest => #{dest_queue => <<"bino.nms.idc3d">>,fields_fun => #Fun<rabbit_shovel_parameters.11.26683091>,module => rabbit_amqp091_shovel,props_fun => #Fun<rabbit_shovel_parameters.12.26683091>,resource_decl => #Fun<rabbit_shovel_parameters.10.26683091>,uris => ["amqp://esx:esx#192.168.126/"]},name => <<"my-shovel">>,reconnect_delay => 5,shovel_type => dynamic,source => #{delete_after => never,module => rabbit_amqp091_shovel,prefetch_count => 1000,queue => <<"toshovel">>,resource_decl => #Fun<rabbit_shovel_parameters.14.26683091>,source_exchange_key => <<>>,uris => ["amqp://esx:esx#192.168.1.115"]}},undefined,undefined,undefined,undefined,undefined}
** Reason for termination ==
** {timeout,{gen_server,call,[<0.855.0>,connect,60000]}}
2018-06-20 14:04:26.939 [warning] <0.835.0> closing AMQP connection <0.835.0> (192.168.1.115:47801 -> 192.168.1.115:5672 - Shovel my-shovel, vhost: '/', user: 'esx'):
client unexpectedly closed TCP connection
2018-06-20 14:04:26.939 [error] <0.827.0> CRASH REPORT Process <0.827.0> with 1 neighbours exited with reason: {timeout,{gen_server,call,[<0.855.0>,connect,60000]}} in gen_server2:terminate/3 line 1166
2018-06-20 14:04:26.939 [error] <0.410.0> Supervisor {<0.410.0>,rabbit_shovel_dyn_worker_sup} had child {<<"/">>,<<"my-shovel">>} started with rabbit_shovel_worker:start_link(dynamic, {<<"/">>,<<"my-shovel">>}, [{<<"dest-protocol">>,<<"amqp091">>},{<<"dest-queue">>,<<"bino.nms.idc3d">>},{<<"dest-uri">>,<<"a...">>},...]) at <0.827.0> exit with reason {timeout,{gen_server,call,[<0.855.0>,connect,60000]}} in context child_terminated
2018-06-20 14:04:26.940 [error] <0.830.0> ** Generic server <0.830.0> terminating
** Last message in was {'EXIT',<0.827.0>,{timeout,{gen_server,call,[<0.855.0>,connect,60000]}}}
** When Server state == {state,amqp_network_connection,{state,#Port<0.29425>,<<"client 192.168.1.115:47801 -> 192.168.1.115:5672">>,10,<0.836.0>,131072,<0.829.0>,undefined,false},<0.834.0>,{amqp_params_network,<<"esx">>,<<"esx">>,<<"/">>,"192.168.1.115",5672,2047,0,10,60000,none,[#Fun<amqp_uri.12.90191702>,#Fun<amqp_uri.12.90191702>],[{<<"connection_name">>,longstr,<<"Shovel my-shovel">>}],[]},2047,[{<<"capabilities">>,table,[{<<"publisher_confirms">>,bool,true},{<<"exchange_exchange_bindings">>,bool,true},{<<"basic.nack">>,bool,true},{<<"consumer_cancel_notify">>,bool,true},{<<"connection.blocked">>,bool,true},{<<"consumer_priorities">>,bool,true},{<<"authentication_failure_close">>,bool,true},{<<"per_consumer_qos">>,bool,true},{<<"direct_reply_to">>,bool,true}]},{<<"cluster_name">>,longstr,<<"rabbit#centos">>},{<<"copyright">>,longstr,<<"Copyright (C) 2007-2018 Pivotal Software, Inc.">>},{<<"information">>,longstr,<<"Licensed under the MPL. See http://www.rabbitmq.com/">>},{<<"platform">>,longstr,<<"Erlang/OTP 20.3.4">>},{<<"product">>,longstr,<<"RabbitMQ">>},{<<"version">>,longstr,<<"3.7.5">>}],none,false}
** Reason for termination ==
** "stopping because dependent process <0.827.0> died: {timeout,\n {gen_server,call,\n [<0.855.0>,connect,\n 60000]}}"
2018-06-20 14:04:26.940 [error] <0.830.0> CRASH REPORT Process <0.830.0> with 0 neighbours exited with reason: "stopping because dependent process <0.827.0> died: {timeout,\n {gen_server,call,\n [<0.855.0>,connect,\n 60000]}}" in gen_server:handle_common_reply/8 line 726
2018-06-20 14:04:26.941 [error] <0.844.0> Supervisor {<0.844.0>,amqp_channel_sup} had child channel started with amqp_channel:start_link(network, <0.830.0>, 1, <0.846.0>, {<<"client 192.168.1.115:47801 -> 192.168.1.115:5672">>,1}) at <0.847.0> exit with reason {timeout,{gen_server,call,[<0.855.0>,connect,60000]}} in context child_terminated
2018-06-20 14:04:26.941 [error] <0.844.0> Supervisor {<0.844.0>,amqp_channel_sup} had child channel started with amqp_channel:start_link(network, <0.830.0>, 1, <0.846.0>, {<<"client 192.168.1.115:47801 -> 192.168.1.115:5672">>,1}) at <0.847.0> exit with reason reached_max_restart_intensity in context shutdown
2018-06-20 14:04:26.941 [error] <0.828.0> Supervisor {<0.828.0>,amqp_connection_sup} had child connection started with amqp_gen_connection:start_link(<0.829.0>, {amqp_params_network,<<"esx">>,<<"esx">>,<<"/">>,"192.168.1.115",5672,2047,0,10,60000,none,[#Fun<am..>,...],...}) at <0.830.0> exit with reason "stopping because dependent process <0.827.0> died: {timeout,\n {gen_server,call,\n [<0.855.0>,connect,\n 60000]}}" in context child_terminated
2018-06-20 14:04:26.942 [error] <0.828.0> Supervisor {<0.828.0>,amqp_connection_sup} had child connection started with amqp_gen_connection:start_link(<0.829.0>, {amqp_params_network,<<"esx">>,<<"esx">>,<<"/">>,"192.168.1.115",5672,2047,0,10,60000,none,[#Fun<am..>,...],...}) at <0.830.0> exit with reason reached_max_restart_intensity in context shutdown
from /var/log/rabbitmq/log/crash.log
2018-06-20 14:04:40 =SUPERVISOR REPORT====
Supervisor: {<0.914.0>,amqp_connection_sup}
Context: shutdown
Reason: reached_max_restart_intensity
Offender: [{pid,<0.916.0>},{name,connection},{mfargs,{amqp_gen_connection,start_link,[<0.915.0>,{amqp_params_network,<<"esx">>,<<"esx">>,<<"/">>,"192.168.1.115",5672,2047,0,10,60000,none,[#Fun<amqp_uri.12.90191702>,#Fun<amqp_uri.12.90191702>],[{<<"connection_name">>,longstr,<<"Shovel my-shovel">>}],[]}]}},{restart_type,intrinsic},{shutdown,brutal_kill},{child_type,worker}]
Kindly please give me some clue