Skip to content

Commit 02fbbda

Browse files
committed
build(): First version of using SauceLabs and BrowserStack on travis.
1 parent 4674c44 commit 02fbbda

15 files changed

+747
-54
lines changed

.travis.yml

+38-4
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,55 @@
1-
sudo: false
1+
# TODO(hansl): When we're ready to test for Dart, readd every mention of Dart to this file.
2+
# Base the Dart config on the main repo travis.yml file.
3+
24
language: node_js
5+
sudo: false
36

47
node_js:
58
- '4.2.3'
69

7-
addons:
8-
firefox: "latest"
10+
cache:
11+
directories:
12+
- node_modules
13+
14+
env:
15+
global:
16+
- LOGS_DIR=/tmp/angular-material-build/logs
17+
- SAUCE_USERNAME=angular-ci
18+
- SAUCE_ACCESS_KEY=9b988f434ff8-fbca-8aa4-4ae3-35442987
19+
- BROWSER_STACK_USERNAME=angularteam1
20+
- BROWSER_STACK_ACCESS_KEY=BWCd4SynLzdDcv8xtzsB
21+
- ARCH=linux-x64
22+
# Token for tsd to increase github rate limit
23+
# See https://github.com/DefinitelyTyped/tsd#tsdrc
24+
# This does not use http://docs.travis-ci.com/user/environment-variables/#Secure-Variables
25+
# because those are not visible for pull requests, and those should also be reliable.
26+
# This SSO token belongs to github account angular-github-ratelimit-token which has no access
27+
# (password is in Valentine)
28+
- TSDRC='{"token":"ef474500309daea53d5991b3079159a29520a40b"}'
29+
# GITHUB_TOKEN_ANGULAR
30+
- secure: "fq/U7VDMWO8O8SnAQkdbkoSe2X92PVqg4d044HmRYVmcf6YbO48+xeGJ8yOk0pCBwl3ISO4Q2ot0x546kxfiYBuHkZetlngZxZCtQiFT9kyId8ZKcYdXaIW9OVdw3Gh3tQyUwDucfkVhqcs52D6NZjyE2aWZ4/d1V4kWRO/LMgo="
31+
matrix:
32+
# Order: a slower build first, so that we don't occupy an idle travis worker waiting for others to complete.
33+
- MODE=saucelabs_required
34+
- MODE=browserstack_required
35+
- MODE=saucelabs_optional
36+
- MODE=browserstack_optional
37+
38+
matrix:
39+
allow_failures:
40+
- env: "MODE=saucelabs_optional"
41+
- env: "MODE=browserstack_optional"
942

1043
install:
11-
- npm install -g angular-cli
1244
- npm install
1345

1446
before_script:
1547
# Necessary to run test on Travis CI that require a graphical interface.
1648
# See https://docs.travis-ci.com/user/gui-and-headless-browsers
1749
- "export DISPLAY=:99.0"
1850
- "sh -e /etc/init.d/xvfb start"
51+
- mkdir -p $LOGS_DIR
52+
1953

2054
script:
2155
- ./scripts/ci/build-and-test.sh ${MODE}

karma.conf.js

-46
This file was deleted.

package.json

+8-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
"url": "https://github.com/angular/material2.git"
99
},
1010
"scripts": {
11-
"demo-app": "cd src && ng serve"
11+
"build": "ng build",
12+
"demo-app": "cd src && ng serve",
13+
"test": "karma start test/karma.conf.js"
1214
},
1315
"version": "2.0.0-alpha.0",
1416
"license": "Apache-2.0",
@@ -30,11 +32,15 @@
3032
"broccoli-autoprefixer": "^4.1.0",
3133
"broccoli-merge-trees": "^1.1.1",
3234
"broccoli-sass": "^0.7.0",
35+
"browserstacktunnel-wrapper": "^1.4.2",
3336
"ember-cli-inject-live-reload": "^1.3.0",
3437
"jasmine-core": "^2.3.4",
3538
"karma": "^0.13.15",
39+
"karma-browserstack-launcher": "^0.1.7",
3640
"karma-chrome-launcher": "^0.2.1",
3741
"karma-firefox-launcher": "^0.1.7",
38-
"karma-jasmine": "^0.3.6"
42+
"karma-jasmine": "^0.3.6",
43+
"karma-sauce-launcher": "^0.2.14",
44+
"typescript": "^1.7.5"
3945
}
4046
}

scripts/browserstack/start_tunnel.js

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
'use strict';
2+
3+
var fs = require('fs');
4+
var http = require('http');
5+
var BrowserStackTunnel = require('browserstacktunnel-wrapper');
6+
7+
var HOSTNAME = 'localhost';
8+
var PORTS = [9876, 9877];
9+
var ACCESS_KEY = process.env.BROWSER_STACK_ACCESS_KEY;
10+
var READY_FILE = process.env.BROWSER_PROVIDER_READY_FILE;
11+
var TUNNEL_IDENTIFIER = process.env.TRAVIS_JOB_NUMBER;
12+
13+
// We need to start fake servers, otherwise the tunnel does not start.
14+
var fakeServers = [];
15+
var hosts = [];
16+
17+
PORTS.forEach(function(port) {
18+
fakeServers.push(http.createServer(function() {}).listen(port));
19+
hosts.push({
20+
name: HOSTNAME,
21+
port: port,
22+
sslFlag: 0
23+
});
24+
});
25+
26+
var tunnel = new BrowserStackTunnel({
27+
key: ACCESS_KEY,
28+
localIdentifier: TUNNEL_IDENTIFIER,
29+
hosts: hosts
30+
});
31+
32+
console.log('Starting tunnel on ports', PORTS.join(', '));
33+
tunnel.start(function(error) {
34+
if (error) {
35+
console.error('Can not establish the tunnel', error);
36+
} else {
37+
console.log('Tunnel established.');
38+
fakeServers.forEach(function(server) {
39+
server.close();
40+
});
41+
42+
if (READY_FILE) {
43+
fs.writeFile(READY_FILE, '');
44+
}
45+
}
46+
});
47+
48+
tunnel.on('error', function(error) {
49+
console.error(error);
50+
});

scripts/browserstack/start_tunnel.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export BROWSER_STACK_ACCESS_KEY=`echo $BROWSER_STACK_ACCESS_KEY | rev`
2+
3+
node ./scripts/browserstack/start_tunnel.js &
+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash
2+
3+
set -e -o pipefail
4+
5+
6+
echo "Shutting down Browserstack tunnel"
7+
echo "TODO: implement me"
8+
exit 1
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/bin/bash
2+
3+
4+
# Wait for Connect to be ready before exiting
5+
# Time out if we wait for more than 2 minutes, so that we can print logs.
6+
let "counter=0"
7+
8+
while [ ! -f $BROWSER_PROVIDER_READY_FILE ]; do
9+
let "counter++"
10+
if [ $counter -gt 240 ]; then
11+
echo "Timed out after 2 minutes waiting for browser provider ready file"
12+
# We must manually print logs here because travis will not run
13+
# after_script commands if the failure occurs before the script
14+
# phase.
15+
./scripts/ci/print-logs.sh
16+
exit 5
17+
fi
18+
sleep .5
19+
done

scripts/ci/build-and-test.sh

+48-2
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,51 @@ echo "======= Starting build-and-test.sh =====================================
77
SCRIPT_DIR=$(dirname $0)
88
cd ${SCRIPT_DIR}/../..
99

10-
ng build
11-
karma start --single-run --no-auto-watch --reporters='dots'
10+
11+
start_tunnel() {
12+
case "$MODE" in
13+
saucelabs*)
14+
./scripts/sauce/sauce_connect_setup.sh
15+
;;
16+
browserstack*)
17+
./scripts/browserstack/start_tunnel.sh
18+
;;
19+
*)
20+
;;
21+
esac
22+
}
23+
24+
wait_for_tunnel() {
25+
case "$MODE" in
26+
saucelabs*)
27+
./scripts/sauce/sauce_connect_block.sh
28+
;;
29+
browserstack*)
30+
./scripts/browserstack/waitfor_tunnel.sh
31+
;;
32+
*)
33+
;;
34+
esac
35+
sleep 10
36+
}
37+
38+
teardown_tunnel() {
39+
case "$MODE" in
40+
saucelabs*)
41+
./scripts/sauce/sauce_connect_teardown.sh
42+
;;
43+
browserstack*)
44+
# ./scripts/browserstack/teardown_tunnel.sh
45+
;;
46+
*)
47+
;;
48+
esac
49+
}
50+
51+
52+
start_tunnel
53+
wait_for_tunnel
54+
npm run build
55+
karma start test/karma.conf.js --single-run --no-auto-watch --reporters='dots'
56+
teardown_tunnel
57+

scripts/sauce/sauce_connect_block.sh

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/bin/bash
2+
3+
# Wait for Connect to be ready before exiting
4+
printf "Connecting to Sauce."
5+
while [ ! -f $BROWSER_PROVIDER_READY_FILE ]; do
6+
printf "."
7+
#dart2js takes longer than the travis 10 min timeout to complete
8+
sleep .5
9+
done
10+
echo "Connected"

scripts/sauce/sauce_connect_setup.sh

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#!/bin/bash
2+
3+
set -e -o pipefail
4+
5+
# Setup and start Sauce Connect for your TravisCI build
6+
# This script requires your .travis.yml to include the following two private env variables:
7+
# SAUCE_USERNAME
8+
# SAUCE_ACCESS_KEY
9+
# Follow the steps at https://saucelabs.com/opensource/travis to set that up.
10+
#
11+
# Curl and run this script as part of your .travis.yml before_script section:
12+
# before_script:
13+
# - curl https://gist.github.com/santiycr/5139565/raw/sauce_connect_setup.sh | bash
14+
15+
CONNECT_URL="https://saucelabs.com/downloads/sc-4.3.11-linux.tar.gz"
16+
CONNECT_DIR="/tmp/sauce-connect-$RANDOM"
17+
CONNECT_DOWNLOAD="sc-latest-linux.tar.gz"
18+
19+
CONNECT_LOG="$LOGS_DIR/sauce-connect"
20+
CONNECT_STDOUT="$LOGS_DIR/sauce-connect.stdout"
21+
CONNECT_STDERR="$LOGS_DIR/sauce-connect.stderr"
22+
23+
# Get Connect and start it
24+
mkdir -p $CONNECT_DIR
25+
cd $CONNECT_DIR
26+
curl $CONNECT_URL -o $CONNECT_DOWNLOAD 2> /dev/null 1> /dev/null
27+
mkdir sauce-connect
28+
tar --extract --file=$CONNECT_DOWNLOAD --strip-components=1 --directory=sauce-connect > /dev/null
29+
rm $CONNECT_DOWNLOAD
30+
31+
SAUCE_ACCESS_KEY=`echo $SAUCE_ACCESS_KEY | rev`
32+
33+
ARGS=""
34+
35+
# Set tunnel-id only on Travis, to make local testing easier.
36+
if [ ! -z "$TRAVIS_JOB_NUMBER" ]; then
37+
ARGS="$ARGS --tunnel-identifier $TRAVIS_JOB_NUMBER"
38+
fi
39+
if [ ! -z "$BROWSER_PROVIDER_READY_FILE" ]; then
40+
ARGS="$ARGS --readyfile $BROWSER_PROVIDER_READY_FILE"
41+
fi
42+
43+
44+
echo "Starting Sauce Connect in the background, logging into:"
45+
echo " $CONNECT_LOG"
46+
echo " $CONNECT_STDOUT"
47+
echo " $CONNECT_STDERR"
48+
sauce-connect/bin/sc -u $SAUCE_USERNAME -k $SAUCE_ACCESS_KEY $ARGS \
49+
--logfile $CONNECT_LOG 2> $CONNECT_STDERR 1> $CONNECT_STDOUT &
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/bin/bash
2+
3+
set -e -o pipefail
4+
5+
6+
echo "Shutting down Sauce Connect tunnel"
7+
8+
killall sc
9+
10+
while [[ -n `ps -ef | grep "sauce-connect-" | grep -v "grep"` ]]; do
11+
printf "."
12+
sleep .5
13+
done
14+
15+
echo ""
16+
echo "Sauce Connect tunnel has been shut down"

0 commit comments

Comments
 (0)