Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 2db0aab

Browse files
committed
chore(travis): enable both SauceLabs and BrowserStack
Setting env var `BROWSER_PROVIDER` to `browserstack` or `saucelabs` determines which browser provider will be used. This does not affect the build as all jobs are set to use SauceLabs. Switch to Karma with Socket.io 1.x, which solves some issues(*) with BS. Thus removing `config.transports` as it is not used anymore (Socket.io 1.x starts with polling and tries to upgrade if available). (*) folks from BS were fiddling with socket.io configuration to get it stable. See dhimil/karma@4c04011 This is not necessary with Socket.io 1.x.
1 parent ee42cfe commit 2db0aab

8 files changed

+118
-41
lines changed

.travis.yml

+7-5
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ branches:
88

99
env:
1010
matrix:
11-
- JOB=unit
12-
- JOB=e2e TEST_TARGET=jqlite
13-
- JOB=e2e TEST_TARGET=jquery
11+
- JOB=unit BROWSER_PROVIDER=saucelabs
12+
- JOB=e2e TEST_TARGET=jqlite BROWSER_PROVIDER=saucelabs
13+
- JOB=e2e TEST_TARGET=jquery BROWSER_PROVIDER=saucelabs
1414
global:
1515
- SAUCE_USERNAME=angular-ci
1616
- SAUCE_ACCESS_KEY=9b988f434ff8-fbca-8aa4-4ae3-35442987
17+
- BROWSER_STACK_USERNAME=VojtaJina
18+
- BROWSER_STACK_ACCESS_KEY=QCQJ1ZpWXpBkSwEdD8ev
1719
- LOGS_DIR=/tmp/angular-build/logs
18-
- BROWSER_PROVIDER_READY_FILE=/tmp/sauce-connect-ready
20+
- BROWSER_PROVIDER_READY_FILE=/tmp/browsersprovider-tunnel-ready
1921

2022
install:
2123
# - npm config set registry http://23.251.144.68
@@ -28,7 +30,7 @@ install:
2830

2931
before_script:
3032
- mkdir -p $LOGS_DIR
31-
- ./lib/sauce/sauce_connect_setup.sh
33+
- ./scripts/travis/start_browser_provider.sh
3234
- npm install -g grunt-cli
3335
- grunt package
3436
- ./scripts/travis/wait_for_browser_provider.sh

karma-shared.conf.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -114,26 +114,30 @@ module.exports = function(config, specificOptions) {
114114
var buildLabel = 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER + ' (' + process.env.TRAVIS_BUILD_ID + ')';
115115

116116
config.logLevel = config.LOG_DEBUG;
117-
config.transports = ['websocket', 'xhr-polling'];
118-
config.captureTimeout = 0; // rely on SL timeout
117+
// Karma (with socket.io 1.x) buffers by 50 and 50 tests can take a long time on IEs;-)
118+
config.browserNoActivityTimeout = 120000;
119119

120120
config.browserStack.build = buildLabel;
121121
config.browserStack.startTunnel = false;
122+
config.browserStack.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER;
122123

123124
config.sauceLabs.build = buildLabel;
124125
config.sauceLabs.startConnect = false;
125126
config.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER;
126127
config.sauceLabs.recordScreenshots = true;
127128

128-
// TODO(vojta): remove once SauceLabs supports websockets.
129-
// This speeds up the capturing a bit, as browsers don't even try to use websocket.
130-
config.transports = ['xhr-polling'];
131-
132129
// Debug logging into a file, that we print out at the end of the build.
133130
config.loggers.push({
134131
type: 'file',
135132
filename: process.env.LOGS_DIR + '/' + (specificOptions.logFile || 'karma.log')
136133
});
134+
135+
if (process.env.BROWSER_PROVIDER === 'saucelabs' || !process.env.BROWSER_PROVIDER) {
136+
// Allocating a browser can take pretty long (eg. if we are out of capacity and need to wait
137+
// for another build to finish) and so the `captureTimeout` typically kills
138+
// an in-queue-pending request, which makes no sense.
139+
config.captureTimeout = 0;
140+
}
137141
}
138142

139143

lib/browser-stack/start-tunnel.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ var http = require('http');
55
var BrowserStackTunnel = require('browserstacktunnel-wrapper');
66

77
var HOSTNAME = 'localhost';
8-
var PORTS = require('../grunt/utils').availablePorts;
8+
var PORTS = [9876, 8000];
99
var ACCESS_KEY = process.env.BROWSER_STACK_ACCESS_KEY;
10-
var READY_FILE = process.env.SAUCE_CONNECT_READY_FILE;
10+
var READY_FILE = process.env.BROWSER_PROVIDER_READY_FILE;
11+
var TUNNEL_IDENTIFIER = process.env.TRAVIS_JOB_NUMBER;
1112

1213
// We need to start fake servers, otherwise the tunnel does not start.
1314
var fakeServers = [];
@@ -24,6 +25,7 @@ PORTS.forEach(function(port) {
2425

2526
var tunnel = new BrowserStackTunnel({
2627
key: ACCESS_KEY,
28+
tunnelIdentifier: TUNNEL_IDENTIFIER,
2729
hosts: hosts
2830
});
2931

lib/browser-stack/start-tunnel.sh

+2
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1+
export BROWSER_STACK_ACCESS_KEY=`echo $BROWSER_STACK_ACCESS_KEY | rev`
2+
13
node ./lib/browser-stack/start-tunnel.js &

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@
3838
"jasmine-node": "~1.14.5",
3939
"jasmine-reporters": "~1.0.1",
4040
"jshint-stylish": "~1.0.0",
41-
"karma": "^0.12.0",
42-
"karma-browserstack-launcher": "0.1.1",
41+
"karma": "vojtajina/karma#socketio_10",
42+
"karma-browserstack-launcher": "0.1.2",
4343
"karma-chrome-launcher": "0.1.5",
4444
"karma-firefox-launcher": "0.1.3",
4545
"karma-jasmine": "0.1.5",

protractor-travis-conf.js

+73-24
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,81 @@
22

33
var config = require('./protractor-shared-conf').config;
44

5-
config.sauceUser = process.env.SAUCE_USERNAME;
6-
config.sauceKey = process.env.SAUCE_ACCESS_KEY;
7-
8-
config.multiCapabilities = [{
9-
'browserName': 'chrome',
10-
'platform': 'OS X 10.9',
11-
'name': 'Angular E2E',
12-
'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER,
13-
'build': process.env.TRAVIS_BUILD_NUMBER,
14-
'version': '34'
15-
}, {
16-
'browserName': 'firefox',
17-
'name': 'Angular E2E',
18-
'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER,
19-
'build': process.env.TRAVIS_BUILD_NUMBER,
20-
'version': '28'
21-
}, {
22-
browserName: 'safari',
23-
'platform': 'OS X 10.9',
24-
'version': '7',
25-
'name': 'Angular E2E',
26-
'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER,
27-
'build': process.env.TRAVIS_BUILD_NUMBER
28-
}];
5+
if (process.env.BROWSER_PROVIDER === 'browserstack') {
6+
// Using BrowserStack.
7+
config.seleniumAddress = 'http://hub.browserstack.com/wd/hub';
8+
config.multiCapabilities = [
9+
capabilitiesForBrowserStack({
10+
browserName: 'chrome',
11+
platform: 'MAC',
12+
version: '34'
13+
}),
14+
capabilitiesForBrowserStack({
15+
browserName: 'firefox',
16+
version: '28'
17+
}),
18+
capabilitiesForBrowserStack({
19+
browserName: 'safari',
20+
platform: 'MAC',
21+
version: '7'
22+
})
23+
];
24+
} else {
25+
// Using SauceLabs.
26+
config.sauceUser = process.env.SAUCE_USERNAME;
27+
config.sauceKey = process.env.SAUCE_ACCESS_KEY;
28+
config.multiCapabilities = [
29+
capabilitiesForSauceLabs({
30+
browserName: 'chrome',
31+
platform: 'OS X 10.9',
32+
version: '34'
33+
}),
34+
capabilitiesForSauceLabs({
35+
browserName: 'firefox',
36+
version: '28'
37+
}),
38+
capabilitiesForSauceLabs({
39+
browserName: 'safari',
40+
platform: 'OS X 10.9',
41+
version: '7'
42+
})
43+
];
44+
}
45+
2946

3047
config.allScriptsTimeout = 30000;
3148
config.getPageTimeout = 30000;
3249

3350
exports.config = config;
51+
52+
53+
function capabilitiesForBrowserStack(capabilities) {
54+
return {
55+
'browserstack.user': process.env.BROWSER_STACK_USERNAME,
56+
'browserstack.key': process.env.BROWSER_STACK_ACCESS_KEY,
57+
'browserstack.local' : 'true',
58+
'browserstack.debug': 'true',
59+
'browserstack.tunnelIdentifier': process.env.TRAVIS_JOB_NUMBER,
60+
'tunnelIdentifier': process.env.TRAVIS_JOB_NUMBER,
61+
62+
'name': 'Angular E2E',
63+
'build': process.env.TRAVIS_BUILD_NUMBER,
64+
65+
'browserName': capabilities.browserName,
66+
'platform': capabilities.platform,
67+
'version': capabilities.version
68+
};
69+
}
70+
71+
function capabilitiesForSauceLabs(capabilities) {
72+
return {
73+
'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER,
74+
75+
'name': 'Angular E2E',
76+
'build': process.env.TRAVIS_BUILD_NUMBER,
77+
78+
'browserName': capabilities.browserName,
79+
'platform': capabilities.platform,
80+
'version': capabilities.version
81+
};
82+
}

scripts/travis/build.sh

+9-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@
22

33
set -e
44

5+
export BROWSER_STACK_ACCESS_KEY=`echo $BROWSER_STACK_ACCESS_KEY | rev`
56
export SAUCE_ACCESS_KEY=`echo $SAUCE_ACCESS_KEY | rev`
67

78
if [ $JOB = "unit" ]; then
9+
if [ "$BROWSER_PROVIDER" == "browserstack" ]; then
10+
BROWSERS="BS_Chrome,BS_Safari,BS_Firefox,BS_IE_9,BS_IE_10,BS_IE_11"
11+
else
12+
BROWSERS="SL_Chrome,SL_Safari,SL_Firefox,SL_IE_9,SL_IE_10,SL_IE_11"
13+
fi
14+
815
grunt test:promises-aplus
9-
grunt test:unit --browsers SL_Chrome,SL_Safari,SL_Firefox,SL_IE_9,SL_IE_10,SL_IE_11 --reporters dots
16+
grunt test:unit --browsers $BROWSERS --reporters dots
1017
grunt ci-checks
11-
grunt tests:docs --browsers SL_Chrome,SL_Safari,SL_Firefox,SL_IE_9,SL_IE_10,SL_IE_11 --reporters dots
18+
grunt tests:docs --browsers $BROWSERS --reporters dots
1219
grunt test:travis-protractor --specs "docs/app/e2e/**/*.scenario.js"
1320
elif [ $JOB = "e2e" ]; then
1421
if [ $TEST_TARGET = "jquery" ]; then
+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/bin/bash
2+
# Has to be run from project root directory.
3+
4+
# TODO(vojta): normalize paths to lib/$BROWSER_PROVIDER
5+
if [ "$BROWSER_PROVIDER" == "browserstack" ]; then
6+
echo "Using BrowserStack"
7+
./lib/browser-stack/start-tunnel.sh
8+
else
9+
echo "Using SauceLabs"
10+
./lib/sauce/sauce_connect_setup.sh
11+
fi

0 commit comments

Comments
 (0)