Skip to content

Commit

Permalink
Migrate CI to CircleCI & SauceLabs (#823)
Browse files Browse the repository at this point in the history
* Resolved race condition in golang test server

* TravisCI -> CircleCI

* BrowserStack -> SauceLabs

* Simplified local and CI test scripts
  • Loading branch information
MarcusLongmuir committed Jan 4, 2021
1 parent 7c2c243 commit f9ddeb1
Show file tree
Hide file tree
Showing 31 changed files with 1,526 additions and 1,894 deletions.
115 changes: 115 additions & 0 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
version: 2.1

executors:
test-executor:
docker:
- image: circleci/golang:1.15.2
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD
environment:
PROTOTOOL_VER: 1.7.0
working_directory: /go/src/github.com/improbable-eng/grpc-web

jobs:
# This first job in the workflow optimises test time by combining the following:
# * Linting
# * Golang unit tests
# * TypeScript unit tests
# * Builds integration testserver binary
# * Builds integration test Javascript bundles
initial-unit-test-lint-prebuild:
executor: test-executor
steps:
- checkout
- run: sudo apt-get install unzip
- run: . ./install-prototool.sh
- run: echo 'export GOBIN=/go/bin' >> $BASH_ENV
- run: go get -u golang.org/x/tools/cmd/goimports
- run: go get -u github.com/robertkrimen/godocdown/godocdown
- run: curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
- run: dep ensure
- run: go install ./vendor/github.com/golang/protobuf/protoc-gen-go
- run: export PATH=/go/src/github.com/improbable-eng/grpc-web/protobuf/bin:$PATH
- run:
command: |
set +e
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.33.5/install.sh | bash
export NVM_DIR="/home/circleci/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install
echo 'export NVM_DIR=$HOME/.nvm' >> $BASH_ENV
echo 'source $NVM_DIR/nvm.sh' >> $BASH_ENV
- run: npm install
# Lint
- run: ./lint-all.sh
# Unit Tests
- run: ./test-all.sh
# Build server binary and Javascript bundles to be used across all subsequent browser tests
- run:
name: Pre-Build Integration Test
command: npm run build:integration
# Persisting the workspace allows the built assets to be used across the fan-out tests in the subsequent step
- persist_to_workspace:
root: /go/src/github.com/improbable-eng/grpc-web
paths:
- integration_test
- client
browser-tests:
parameters:
browser-params:
type: string
executor: test-executor
steps:
- checkout
# Attaches the workspace from the previous step to retrieve the built assets for the tests
- attach_workspace:
at: /go/src/github.com/improbable-eng/grpc-web
- run: sudo apt-get install moreutils
# The two following hosts must match those in integration_test/hosts-config.ts
- run: echo 127.0.0.1 testhost | sudo tee -a /etc/hosts
- run: echo 127.0.0.1 corshost | sudo tee -a /etc/hosts
- run:
command: |
set +e
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.33.5/install.sh | bash
export NVM_DIR="/home/circleci/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
nvm install
echo 'export NVM_DIR=$HOME/.nvm' >> $BASH_ENV
echo 'source $NVM_DIR/nvm.sh' >> $BASH_ENV
- run: << parameters.browser-params >> npm run test:integration-browsers:ci
- store_test_results:
path: ./integration_test/test-results
workflows:
version: 2
test-workflow:
jobs:
- initial-unit-test-lint-prebuild
- browser-tests:
matrix:
parameters:
browser-params:
- BROWSER=firefox80_win
- BROWSER=firefox39_win
- BROWSER=firefox38_win
- BROWSER=firefox21_win
- BROWSER=chrome_85
- BROWSER=chrome_52
- BROWSER=chrome_43
- BROWSER=chrome_42
- BROWSER=chrome_41
- BROWSER=edge85_win
- BROWSER=edge16_win
- BROWSER=edge14_win
- BROWSER=edge13_win
- BROWSER=safari13_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
- BROWSER=safari12_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
- BROWSER=safari11_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
- BROWSER=safari10_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
- BROWSER=safari9_1 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
- BROWSER=safari8 SC_SSL_BUMPING=true DISABLE_WEBSOCKET_TESTS=true
- BROWSER=ie11_win DISABLE_WEBSOCKET_TESTS=true
- BROWSER=nodejs
requires:
- initial-unit-test-lint-prebuild
70 changes: 0 additions & 70 deletions .travis.yml

This file was deleted.

6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# gRPC-Web: Typed Frontend Development


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

## Node.js Support

Expand Down
2 changes: 1 addition & 1 deletion go/generate-docs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ for i in $(find . -iname 'doc.go'); do
dir="${i%/*}"
echo "- $dir"
cd "${dir}"
"${GOPATH}/bin/godocdown" -heading=Title -o DOC.md
"${GOBIN}/godocdown" -heading=Title -o DOC.md
ln -s DOC.md README.md 2> /dev/null # can fail
cd "${oldpwd}"
done;
2 changes: 1 addition & 1 deletion go/lint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ function check_gofmt {

function goimports_all {
echo "- Running goimports"
${GOPATH}/bin/goimports -l -w $(print_real_go_files)
${GOBIN}/goimports -l -w $(print_real_go_files)
if [[ $? -ne 0 ]]; then
echo "ERROR: goimports changes detected, please commit them."
exit 1
Expand Down
4 changes: 2 additions & 2 deletions install-prototool.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/bin/bash
# Installs prototool; used for managing protoc the installation and compilation flags.
# This script is intended to be run by Travis CI
# This script is intended to be run by CI

set -ex

Expand All @@ -14,4 +14,4 @@ curl -sSL \
-o ./prototool && \
chmod +x ./prototool

export PATH=$PATH:$PWD
echo 'export PATH=$PATH:$PWD' >> $BASH_ENV
2 changes: 2 additions & 0 deletions integration_test/.gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
build-node/
build/
test-results/
sauce-connect-proxy/
113 changes: 42 additions & 71 deletions integration_test/browsers.ts
Original file line number Diff line number Diff line change
@@ -1,73 +1,47 @@
import {SuiteEnum} from "./ts/suiteUtils";

function browser(browserName, browserVersion, os, osVersion) {
const browsers = [];
if (process.env.TEST_SUITE_NAME) {
browsers.push({
configName: `${os}_${osVersion}_${browserName}_${browserVersion}_${process.env.TEST_SUITE_NAME}`,
base: 'CustomWebDriver',
capabilities: {
testSuite: process.env.TEST_SUITE_NAME,
browserName: browserName,
browserVersion: browserVersion,
os: os,
os_version: osVersion
}
});
} else if (process.env.SEPARATE_TEST_SUITES) {
for (let suiteName in SuiteEnum) {
if (isNaN(Number(suiteName))) {
browsers.push({
configName: `${os}_${osVersion}_${browserName}_${browserVersion}_${suiteName}`,
base: 'CustomWebDriver',
capabilities: {
testSuite: suiteName,
browserName: browserName,
browserVersion: browserVersion,
os: os,
os_version: osVersion
}
});
}
function browser(browserName, browserVersion, os, options?: {}) {
return {
configName: `${os}_${browserName}_${browserVersion}`,
base: 'CustomWebDriver',
capabilities: {
...(options || {}),
testSuite: undefined,
browserName: browserName,
browserVersion: browserVersion,
os: os,
}
} else {
browsers.push({
configName: `${os}_${osVersion}_${browserName}_${browserVersion}_allsuites`,
base: 'CustomWebDriver',
capabilities: {
testSuite: undefined,
browserName: browserName,
browserVersion: browserVersion,
os: os,
os_version: osVersion
}
})
}
return browsers;
}

// Browser versions that should not have any Fetch/XHR differences in functionality to other (tested) versions are
// commented out.
const browsers = {
edge16_win: browser("edge", "16", "Windows", "10"),
edge15_win: browser("edge", "15", "Windows", "10"),
edge14_win: browser("edge", "14", "Windows", "10"),
edge13_win: browser('edge', "13", 'Windows', "10"),
ie11_win: browser('ie', "11", 'Windows', "7"),
firefox53_osx: browser('firefox', "53", 'OS X', "Sierra"),
firefox39_osx: browser('firefox', "39", 'OS X', "Sierra"), // Basic fetch added in 39
firefox38_osx: browser('firefox', "38", 'OS X', "Sierra"),
firefox21_osx: browser('firefox', "21", 'OS X', "Sierra"),
chrome_57: browser('chrome', "57", 'Windows', "7"),
chrome_52: browser('chrome', "52", 'Windows', "7"),
chrome_43: browser('chrome', "43", 'Windows', "7"), // Readable stream fetch support added in 43
chrome_42: browser('chrome', "42", 'Windows', "7"), // Basic fetch added in 42
chrome_41: browser('chrome', "41", 'Windows', "7"),
safari11: browser("safari", "11", "OS X", "High Sierra"),
// // Safari 10 disabled whilst investigating an issue with https requests for unresolved host hanging through Browserstack
// safari10: browser("safari", "10", "OS X", "Sierra"),
safari9_1: browser("safari", "9.1", "OS X", "El Capitan"),
safari8: browser("safari", "8", "OS X", "Yosemite"),
// Firefox
firefox80_win: browser('firefox', '80', 'Windows 10',{custom: {acceptInsecureCerts: true}}),
firefox39_win: browser('firefox', '39', 'Windows 10',{custom: {acceptInsecureCerts: true}}), // Basic fetch added in 39
firefox38_win: browser('firefox', '38', 'Windows 10',{custom: {acceptInsecureCerts: true}}),
firefox21_win: browser('firefox', '21', 'Windows 10',{custom: {acceptInsecureCerts: true}}),

// Chrome
chrome_85: browser('chrome', '85', 'Windows 10', {certOverrideJSElement: 'proceed-link'}),
chrome_52: browser('chrome', '52', 'Windows 10'),
chrome_43: browser('chrome', '43', 'Linux'), // Readable stream fetch support added in 43
chrome_42: browser('chrome', '42', 'Linux'), // Basic fetch added in 42
chrome_41: browser('chrome', '41', 'Linux'),

// Edge
edge85_win: browser('MicrosoftEdge', '85', 'Windows 10', {certOverrideJSElement: 'proceed-link'}),
edge16_win: browser('MicrosoftEdge', '16', 'Windows 10', {certOverrideJSElement: 'invalidcert_continue'}),
edge14_win: browser('MicrosoftEdge', '14', 'Windows 10', {certOverrideJSElement: 'invalidcert_continue'}),
edge13_win: browser('MicrosoftEdge', '13', 'Windows 10', {certOverrideJSElement: 'invalidcert_continue'}),

// Safari
safari13_1: browser('safari', '13.1', 'OS X 10.15', {useSslBumping: true, disableWebsocketTests: true}),
safari12_1: browser('safari', '12.0', 'OS X 10.14',{useSslBumping: true, disableWebsocketTests: true}),
safari11_1: browser('safari', '11.1', 'OS X 10.13',{useSslBumping: true, disableWebsocketTests: true}),
safari10_1: browser('safari', '10.1', 'OS X 10.12',{useSslBumping: true, disableWebsocketTests: true}),
safari9_1: browser('safari', '9.0', 'OS X 10.11',{useSslBumping: true, disableWebsocketTests: true}),
safari8: browser('safari', '8.0', 'OS X 10.10',{useSslBumping: true, disableWebsocketTests: true}),

// IE
ie11_win: browser('internet explorer', '11', 'Windows 10', {certOverrideJSElement: 'overridelink', disableWebsocketTests: true}),
};

export default () => {
Expand All @@ -79,16 +53,13 @@ export default () => {
if (!foundBrowser) {
throw new Error(`BROWSER env var set to "${browserEnv}", but there is no browser with that identifier`);
}
foundBrowser.forEach(browserConfig => {
filteredBrowsers[browserConfig.configName] = browserConfig;
});
filteredBrowsers[foundBrowser.configName] = foundBrowser;
return filteredBrowsers;
}

for(let i in browsers) {
browsers[i].forEach(browserConfig => {
filteredBrowsers[browserConfig.configName] = browserConfig;
});
const browserConfig = browsers[i]
filteredBrowsers[browserConfig.configName] = browserConfig;
}
return filteredBrowsers
};
Loading

0 comments on commit f9ddeb1

Please sign in to comment.