Skip to content

Commit f9ddeb1

Browse files
Migrate CI to CircleCI & SauceLabs (#823)
* Resolved race condition in golang test server * TravisCI -> CircleCI * BrowserStack -> SauceLabs * Simplified local and CI test scripts
1 parent 7c2c243 commit f9ddeb1

31 files changed

+1526
-1894
lines changed

.circleci/config.yml

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
version: 2.1
2+
3+
executors:
4+
test-executor:
5+
docker:
6+
- image: circleci/golang:1.15.2
7+
auth:
8+
username: mydockerhub-user
9+
password: $DOCKERHUB_PASSWORD
10+
environment:
11+
PROTOTOOL_VER: 1.7.0
12+
working_directory: /go/src/github.com/improbable-eng/grpc-web
13+
14+
jobs:
15+
# This first job in the workflow optimises test time by combining the following:
16+
# * Linting
17+
# * Golang unit tests
18+
# * TypeScript unit tests
19+
# * Builds integration testserver binary
20+
# * Builds integration test Javascript bundles
21+
initial-unit-test-lint-prebuild:
22+
executor: test-executor
23+
steps:
24+
- checkout
25+
- run: sudo apt-get install unzip
26+
- run: . ./install-prototool.sh
27+
- run: echo 'export GOBIN=/go/bin' >> $BASH_ENV
28+
- run: go get -u golang.org/x/tools/cmd/goimports
29+
- run: go get -u github.com/robertkrimen/godocdown/godocdown
30+
- run: curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
31+
- run: dep ensure
32+
- run: go install ./vendor/github.com/golang/protobuf/protoc-gen-go
33+
- run: export PATH=/go/src/github.com/improbable-eng/grpc-web/protobuf/bin:$PATH
34+
- run:
35+
command: |
36+
set +e
37+
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.33.5/install.sh | bash
38+
export NVM_DIR="/home/circleci/.nvm"
39+
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
40+
nvm install
41+
echo 'export NVM_DIR=$HOME/.nvm' >> $BASH_ENV
42+
echo 'source $NVM_DIR/nvm.sh' >> $BASH_ENV
43+
- run: npm install
44+
# Lint
45+
- run: ./lint-all.sh
46+
# Unit Tests
47+
- run: ./test-all.sh
48+
# Build server binary and Javascript bundles to be used across all subsequent browser tests
49+
- run:
50+
name: Pre-Build Integration Test
51+
command: npm run build:integration
52+
# Persisting the workspace allows the built assets to be used across the fan-out tests in the subsequent step
53+
- persist_to_workspace:
54+
root: /go/src/github.com/improbable-eng/grpc-web
55+
paths:
56+
- integration_test
57+
- client
58+
browser-tests:
59+
parameters:
60+
browser-params:
61+
type: string
62+
executor: test-executor
63+
steps:
64+
- checkout
65+
# Attaches the workspace from the previous step to retrieve the built assets for the tests
66+
- attach_workspace:
67+
at: /go/src/github.com/improbable-eng/grpc-web
68+
- run: sudo apt-get install moreutils
69+
# The two following hosts must match those in integration_test/hosts-config.ts
70+
- run: echo 127.0.0.1 testhost | sudo tee -a /etc/hosts
71+
- run: echo 127.0.0.1 corshost | sudo tee -a /etc/hosts
72+
- run:
73+
command: |
74+
set +e
75+
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.33.5/install.sh | bash
76+
export NVM_DIR="/home/circleci/.nvm"
77+
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
78+
nvm install
79+
echo 'export NVM_DIR=$HOME/.nvm' >> $BASH_ENV
80+
echo 'source $NVM_DIR/nvm.sh' >> $BASH_ENV
81+
- run: << parameters.browser-params >> npm run test:integration-browsers:ci
82+
- store_test_results:
83+
path: ./integration_test/test-results
84+
workflows:
85+
version: 2
86+
test-workflow:
87+
jobs:
88+
- initial-unit-test-lint-prebuild
89+
- browser-tests:
90+
matrix:
91+
parameters:
92+
browser-params:
93+
- BROWSER=firefox80_win
94+
- BROWSER=firefox39_win
95+
- BROWSER=firefox38_win
96+
- BROWSER=firefox21_win
97+
- BROWSER=chrome_85
98+
- BROWSER=chrome_52
99+
- BROWSER=chrome_43
100+
- BROWSER=chrome_42
101+
- BROWSER=chrome_41
102+
- BROWSER=edge85_win
103+
- BROWSER=edge16_win
104+
- BROWSER=edge14_win
105+
- BROWSER=edge13_win
106+
- BROWSER=safari13_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
107+
- BROWSER=safari12_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
108+
- BROWSER=safari11_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
109+
- BROWSER=safari10_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
110+
- BROWSER=safari9_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
111+
- BROWSER=safari8 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
112+
- BROWSER=ie11_win DISABLE_WEBSOCKET_TESTS=true
113+
- BROWSER=nodejs
114+
requires:
115+
- initial-unit-test-lint-prebuild

.travis.yml

Lines changed: 0 additions & 70 deletions
This file was deleted.

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# gRPC-Web: Typed Frontend Development
22

33

4-
[![Master Build](https://travis-ci.org/improbable-eng/grpc-web.svg?branch=master)](https://travis-ci.org/improbable-eng/grpc-web)
5-
![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=L0k3QjhiNnByd3hWVVhtS0FxTmNrZERwbDBqR053OFJKV01veUpkL1FqOD0tLXZyS0d2WC9TaGEzeTBjbXZ6L1JNa2c9PQ==--b460187586f63fc2a48f557a515f9900f5639d10)
4+
[![CircleCI](https://circleci.com/gh/improbable-eng/grpc-web/tree/master.svg?style=svg)](https://circleci.com/gh/improbable-eng/grpc-web/tree/master)
5+
[![Sauce Test Status](https://app.saucelabs.com/buildstatus/ImprobableEngBot)](https://app.saucelabs.com/u/ImprobableEngBot)
66
[![NPM](https://img.shields.io/npm/v/@improbable-eng/grpc-web.svg)](https://www.npmjs.com/package/@improbable-eng/grpc-web)
77
[![GoDoc](http://img.shields.io/badge/GoDoc-Reference-blue.svg)](https://godoc.org/github.com/improbable-eng/grpc-web/go/grpcweb)
88
[![Apache 2.0 License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)
@@ -140,7 +140,7 @@ This library is tested against:
140140
* Firefox >= 21
141141
* Edge >= 13
142142
* IE >= 11
143-
* Safari >= 6
143+
* Safari >= 8
144144

145145
## Node.js Support
146146

go/generate-docs.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ for i in $(find . -iname 'doc.go'); do
66
dir="${i%/*}"
77
echo "- $dir"
88
cd "${dir}"
9-
"${GOPATH}/bin/godocdown" -heading=Title -o DOC.md
9+
"${GOBIN}/godocdown" -heading=Title -o DOC.md
1010
ln -s DOC.md README.md 2> /dev/null # can fail
1111
cd "${oldpwd}"
1212
done;

go/lint.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function check_gofmt {
3434

3535
function goimports_all {
3636
echo "- Running goimports"
37-
${GOPATH}/bin/goimports -l -w $(print_real_go_files)
37+
${GOBIN}/goimports -l -w $(print_real_go_files)
3838
if [[ $? -ne 0 ]]; then
3939
echo "ERROR: goimports changes detected, please commit them."
4040
exit 1

install-prototool.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/bash
22
# Installs prototool; used for managing protoc the installation and compilation flags.
3-
# This script is intended to be run by Travis CI
3+
# This script is intended to be run by CI
44

55
set -ex
66

@@ -14,4 +14,4 @@ curl -sSL \
1414
-o ./prototool && \
1515
chmod +x ./prototool
1616

17-
export PATH=$PATH:$PWD
17+
echo 'export PATH=$PATH:$PWD' >> $BASH_ENV

integration_test/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
build-node/
22
build/
3+
test-results/
4+
sauce-connect-proxy/

integration_test/browsers.ts

Lines changed: 42 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,47 @@
1-
import {SuiteEnum} from "./ts/suiteUtils";
2-
3-
function browser(browserName, browserVersion, os, osVersion) {
4-
const browsers = [];
5-
if (process.env.TEST_SUITE_NAME) {
6-
browsers.push({
7-
configName: `${os}_${osVersion}_${browserName}_${browserVersion}_${process.env.TEST_SUITE_NAME}`,
8-
base: 'CustomWebDriver',
9-
capabilities: {
10-
testSuite: process.env.TEST_SUITE_NAME,
11-
browserName: browserName,
12-
browserVersion: browserVersion,
13-
os: os,
14-
os_version: osVersion
15-
}
16-
});
17-
} else if (process.env.SEPARATE_TEST_SUITES) {
18-
for (let suiteName in SuiteEnum) {
19-
if (isNaN(Number(suiteName))) {
20-
browsers.push({
21-
configName: `${os}_${osVersion}_${browserName}_${browserVersion}_${suiteName}`,
22-
base: 'CustomWebDriver',
23-
capabilities: {
24-
testSuite: suiteName,
25-
browserName: browserName,
26-
browserVersion: browserVersion,
27-
os: os,
28-
os_version: osVersion
29-
}
30-
});
31-
}
1+
function browser(browserName, browserVersion, os, options?: {}) {
2+
return {
3+
configName: `${os}_${browserName}_${browserVersion}`,
4+
base: 'CustomWebDriver',
5+
capabilities: {
6+
...(options || {}),
7+
testSuite: undefined,
8+
browserName: browserName,
9+
browserVersion: browserVersion,
10+
os: os,
3211
}
33-
} else {
34-
browsers.push({
35-
configName: `${os}_${osVersion}_${browserName}_${browserVersion}_allsuites`,
36-
base: 'CustomWebDriver',
37-
capabilities: {
38-
testSuite: undefined,
39-
browserName: browserName,
40-
browserVersion: browserVersion,
41-
os: os,
42-
os_version: osVersion
43-
}
44-
})
4512
}
46-
return browsers;
4713
}
4814

49-
// Browser versions that should not have any Fetch/XHR differences in functionality to other (tested) versions are
50-
// commented out.
5115
const browsers = {
52-
edge16_win: browser("edge", "16", "Windows", "10"),
53-
edge15_win: browser("edge", "15", "Windows", "10"),
54-
edge14_win: browser("edge", "14", "Windows", "10"),
55-
edge13_win: browser('edge', "13", 'Windows', "10"),
56-
ie11_win: browser('ie', "11", 'Windows', "7"),
57-
firefox53_osx: browser('firefox', "53", 'OS X', "Sierra"),
58-
firefox39_osx: browser('firefox', "39", 'OS X', "Sierra"), // Basic fetch added in 39
59-
firefox38_osx: browser('firefox', "38", 'OS X', "Sierra"),
60-
firefox21_osx: browser('firefox', "21", 'OS X', "Sierra"),
61-
chrome_57: browser('chrome', "57", 'Windows', "7"),
62-
chrome_52: browser('chrome', "52", 'Windows', "7"),
63-
chrome_43: browser('chrome', "43", 'Windows', "7"), // Readable stream fetch support added in 43
64-
chrome_42: browser('chrome', "42", 'Windows', "7"), // Basic fetch added in 42
65-
chrome_41: browser('chrome', "41", 'Windows', "7"),
66-
safari11: browser("safari", "11", "OS X", "High Sierra"),
67-
// // Safari 10 disabled whilst investigating an issue with https requests for unresolved host hanging through Browserstack
68-
// safari10: browser("safari", "10", "OS X", "Sierra"),
69-
safari9_1: browser("safari", "9.1", "OS X", "El Capitan"),
70-
safari8: browser("safari", "8", "OS X", "Yosemite"),
16+
// Firefox
17+
firefox80_win: browser('firefox', '80', 'Windows 10',{custom: {acceptInsecureCerts: true}}),
18+
firefox39_win: browser('firefox', '39', 'Windows 10',{custom: {acceptInsecureCerts: true}}), // Basic fetch added in 39
19+
firefox38_win: browser('firefox', '38', 'Windows 10',{custom: {acceptInsecureCerts: true}}),
20+
firefox21_win: browser('firefox', '21', 'Windows 10',{custom: {acceptInsecureCerts: true}}),
21+
22+
// Chrome
23+
chrome_85: browser('chrome', '85', 'Windows 10', {certOverrideJSElement: 'proceed-link'}),
24+
chrome_52: browser('chrome', '52', 'Windows 10'),
25+
chrome_43: browser('chrome', '43', 'Linux'), // Readable stream fetch support added in 43
26+
chrome_42: browser('chrome', '42', 'Linux'), // Basic fetch added in 42
27+
chrome_41: browser('chrome', '41', 'Linux'),
28+
29+
// Edge
30+
edge85_win: browser('MicrosoftEdge', '85', 'Windows 10', {certOverrideJSElement: 'proceed-link'}),
31+
edge16_win: browser('MicrosoftEdge', '16', 'Windows 10', {certOverrideJSElement: 'invalidcert_continue'}),
32+
edge14_win: browser('MicrosoftEdge', '14', 'Windows 10', {certOverrideJSElement: 'invalidcert_continue'}),
33+
edge13_win: browser('MicrosoftEdge', '13', 'Windows 10', {certOverrideJSElement: 'invalidcert_continue'}),
34+
35+
// Safari
36+
safari13_1: browser('safari', '13.1', 'OS X 10.15', {useSslBumping: true, disableWebsocketTests: true}),
37+
safari12_1: browser('safari', '12.0', 'OS X 10.14',{useSslBumping: true, disableWebsocketTests: true}),
38+
safari11_1: browser('safari', '11.1', 'OS X 10.13',{useSslBumping: true, disableWebsocketTests: true}),
39+
safari10_1: browser('safari', '10.1', 'OS X 10.12',{useSslBumping: true, disableWebsocketTests: true}),
40+
safari9_1: browser('safari', '9.0', 'OS X 10.11',{useSslBumping: true, disableWebsocketTests: true}),
41+
safari8: browser('safari', '8.0', 'OS X 10.10',{useSslBumping: true, disableWebsocketTests: true}),
42+
43+
// IE
44+
ie11_win: browser('internet explorer', '11', 'Windows 10', {certOverrideJSElement: 'overridelink', disableWebsocketTests: true}),
7145
};
7246

7347
export default () => {
@@ -79,16 +53,13 @@ export default () => {
7953
if (!foundBrowser) {
8054
throw new Error(`BROWSER env var set to "${browserEnv}", but there is no browser with that identifier`);
8155
}
82-
foundBrowser.forEach(browserConfig => {
83-
filteredBrowsers[browserConfig.configName] = browserConfig;
84-
});
56+
filteredBrowsers[foundBrowser.configName] = foundBrowser;
8557
return filteredBrowsers;
8658
}
8759

8860
for(let i in browsers) {
89-
browsers[i].forEach(browserConfig => {
90-
filteredBrowsers[browserConfig.configName] = browserConfig;
91-
});
61+
const browserConfig = browsers[i]
62+
filteredBrowsers[browserConfig.configName] = browserConfig;
9263
}
9364
return filteredBrowsers
9465
};

0 commit comments

Comments
 (0)