chore(ci): Migrate CI jobs to circleci (#256)

This commit is contained in:
Luca Greco 2021-01-21 13:20:11 +01:00 committed by GitHub
parent 716c90bca4
commit 614a1f3f36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 192 additions and 52 deletions

170
.circleci/config.yml Normal file
View File

@ -0,0 +1,170 @@
# These environment variables must be set in CircleCI UI
#
# NPM_TOKEN - A valid NPM token for releases
#
# NOTE:
# - to validate changes to this file locally using the circleci CLI tool:
#
# circleci config process .circleci/config.yml
#
# - to try run jobs locally:
#
# circleci config process .circleci/config.yml > tmp/processed.yml
# circleci local execute -c tmp/processed.yml --job build-nodejs-current
#
version: 2.1
references:
nodejs_current: &nodejs_current "10"
repo_path: &repo_path ~/webextension-polyfill
defaults: &defaults
working_directory: *repo_path
parameters:
nodejs_current:
type: string
default: *nodejs_current
commands:
run_npm_install:
description: install npm dependencies
steps:
- run: npm i
run_npm_build:
description: build project in << parameters.node_env >> mode
parameters:
node_env:
type: enum
default: production
enum: ["production", "test"]
steps:
- run:
command: npm run build --if-present
environment:
NODE_ENV: << parameters.node_env >>
run_test_minified:
description: rerun unit tests on minified file
steps:
- run:
command: npm run test-minified
run_test_bundlers:
description: rerun unit tests on webpack and browserify bundled files
steps:
- configure_global_npm
- run: npm install -g browserify webpack webpack-cli
- run: |
export PATH=$PATH:../.npm-global/bin
node ./scripts/run-module-bundlers-smoketests.js
run_xephyr:
description: run Xephyr on DISPLAY=:10
steps:
- run: |
sudo apt install xserver-xephyr
Xephyr -ac -br -noreset -screen 1280x1024x24 :10 &
sleep 2
run_functional_tests:
description: run integration tests on Firefox and Chrome browsers
steps:
# circleci browsers image variant does include and run Xvfb
# unfortunately Chrome seems to intermittently fail to connect
# to it successfully:
#
# ERROR:browser_main_loop.cc(1434)] Unable to open X display
#
# On the contrary it seems to don't happen with Xephyr.
- run_xephyr
- run:
command: node ./scripts/run-browsers-smoketests.js
environment:
DISPLAY: :10.0
CHROMEDRIVER_VERBOSE_LOGFILE: /tmp/chromedriver.log
- store_artifacts:
# chromedriver verbose logs stored in the artifacts to make
# it easier investigate CI jobs chromedriver issues.
path: /tmp/chromedriver.log
run_tests:
description: run tests
steps:
- run:
name: run linting check and unit tests with coverage
command: npm run test-coverage
- store_artifacts:
path: coverage
- run:
name: publish coverage data
command: npm run publish-coverage
- run_test_minified
- run_test_bundlers
- run_functional_tests
# This is required to avoid a `EACCES` when running `npm install -g` (which is
# executed in the test suite).
configure_global_npm:
description: create custom directory for global npm installs
steps:
- run: mkdir ../.npm-global
- run: npm config set prefix '../.npm-global'
attach_project_repo:
description: attach repo from workspace
steps:
- attach_workspace:
at: *repo_path
persist_project_repo:
description: persist repo in workspace
steps:
- persist_to_workspace:
root: *repo_path
paths: .
jobs:
build:
<<: *defaults
docker:
# Image variant including Firefox, Chrome and Xvfb
- image: circleci/node:<< parameters.nodejs_current >>-browsers
steps:
- attach_project_repo
- checkout
- run_npm_install
- run_npm_build:
node_env: test
- run_tests
- persist_project_repo
release-tag:
<<: *defaults
docker:
- image: circleci/node:<< parameters.nodejs_current >>
steps:
- attach_project_repo
- run_npm_build:
node_env: production
- run:
name: npm registry auth
command: echo '//registry.npmjs.org/:_authToken=${NPM_TOKEN}' > .npmrc
- run:
name: npm registry publish
command: npm publish
workflows:
default-workflow:
jobs:
- build:
name: build-nodejs-current
filters:
tags:
only: /.*/
- release-tag:
requires:
- build-nodejs-current
filters:
tags:
only: /.*/
branches:
ignore: /.*/

View File

@ -1,39 +0,0 @@
language: node_js
node_js:
## Some of the ES6 syntax used in the browser-polyfill sources is only supported on nodejs >= 6
## and the selenium-webdriver dependency used by the integration tests requires nodejs >= 8.
## and the chromedriver dependency requires Node >= 10.
- '10'
script:
- npm run build
- npm run test-coverage
- echo "RE-RUN tests on the minified file" && npm run test-minified
- echo "RE-RUN tests on the webpack and browserify bundled files" &&
npm install -g browserify webpack webpack-cli &&
node ./scripts/run-module-bundlers-smoketests.js
- export DISPLAY=:99.0
- echo "RUN integration tests on real browsers" &&
TRAVIS_CI=true node ./scripts/run-browsers-smoketests.js
## See https://docs.travis-ci.com/user/chrome
sudo: required
addons:
firefox: 'latest'
chrome: 'stable'
services: ["xvfb"]
after_script: npm run publish-coverage
deploy:
provider: npm
email: addons-dev-automation+npm@mozilla.com
skip_cleanup: true
on:
tags: true
repo: mozilla/webextension-polyfill
branch: master
api_key:
secure: K4rZPsnERK4hiVJICp2MGjLSiL64AeDc0yxmr54/ZlbAYy5OhtDrtaZ0L65eGx+HuIgVQbduSNn1zBN/Bx7w8zmYVyXdTVD1HqXuopS+vmBTrwW/d28uKdpCcMo311ODbk//AL3ylTCeOMkSsLsbb5Io6zcEpuw0VLtSNSrytaA85vcUIj2l8iurLrThN3r7iIsIEHceCzDo3KDx/o4yh7cEKs0FP9Jl8A6jm8sTt/j3jLmsxFFXp/SWOvPCQFX1hCu2uLgCtoLbFJlaDq2+RzsEXv4K5Ee5coVtc4vLRiNjC1UP7cHqfN8VZ0I2LeVT79MRmLqRAccGCSMdarFgoA2SW1laNch0vXy6hBSluh+OVJVPDrz7Xdyy70rt+57tJYFCtpZ24E6X+GNyOOMYfIsatvv59h5R6vE3hWvNZVtiOhYw9wMrKBA9rLkzyoCXeEVu4BuU834RbeeYUAg9VR6WZ1U2nD4IxGr33mSPDqsA6tOhr7tM0kEmg2eVe8qHop8BRtUAhQfkY6C+kfRkPE0OZBq4kiWcfugRJyKI7rAp9T5JNUSLW5X1KrvRv0RBaDr8SKFaWHE4N5Dbt/u2zluq+wJn/n5IxvEFDHSAzxLWBDz+LsmZ1eXRdfA+Pu4cyIKjMX1O8yPAnX8RCTc9oq8Qj74l5rXzCJtmygRdf2I=

View File

@ -63,7 +63,7 @@ The integration tests use selenium-webdriver to run a set of test extensions
supported by this library) and Firefox (to compare the polyfilled APIs with the ones natively supported by this library) and Firefox (to compare the polyfilled APIs with the ones natively
provided on Firefox). provided on Firefox).
The shell script `test/run-browsers-smoketests.sh` (executed by the Travis CI service on every The shell script `test/run-browsers-smoketests.sh` (executed by the CI service on every
pull request) runs this test suite on both the browsers. pull request) runs this test suite on both the browsers.
To run the integration tests on a single browser: To run the integration tests on a single browser:

View File

@ -12,12 +12,6 @@ module.exports = function(grunt) {
grunt.initConfig({ grunt.initConfig({
pkg: grunt.file.readJSON("package.json"), pkg: grunt.file.readJSON("package.json"),
coveralls: {
all: {
src: "coverage/lcov.info",
},
},
eslint: { eslint: {
src: ["src/browser-polyfill.js", "Gruntfile.js"], src: ["src/browser-polyfill.js", "Gruntfile.js"],
test: ["test/**/*.js", "scripts/**/*.js"], test: ["test/**/*.js", "scripts/**/*.js"],
@ -99,7 +93,6 @@ module.exports = function(grunt) {
grunt.loadNpmTasks("gruntify-eslint"); grunt.loadNpmTasks("gruntify-eslint");
grunt.loadNpmTasks("grunt-replace"); grunt.loadNpmTasks("grunt-replace");
grunt.loadNpmTasks("grunt-coveralls");
grunt.loadNpmTasks("grunt-contrib-concat"); grunt.loadNpmTasks("grunt-contrib-concat");
grunt.loadNpmTasks("grunt-babel"); grunt.loadNpmTasks("grunt-babel");

View File

@ -1,8 +1,13 @@
# WebExtension `browser` API Polyfill [![Build Status](https://travis-ci.org/mozilla/webextension-polyfill.svg?branch=master)](https://travis-ci.org/mozilla/webextension-polyfill) [![npm version](https://badge.fury.io/js/webextension-polyfill.svg)](https://www.npmjs.com/package/webextension-polyfill) # WebExtension `browser` API Polyfill
This library allows extensions that use the Promise-based WebExtension/BrowserExt API being standardized by the This library allows extensions that use the Promise-based WebExtension/BrowserExt API being standardized by the
[W3 Browser Extensions][w3-browserext] group to run on Google Chrome with minimal or no changes. [W3 Browser Extensions][w3-browserext] group to run on Google Chrome with minimal or no changes.
[![CircleCI](https://circleci.com/gh/mozilla/webextension-polyfill.svg?style=svg)](https://circleci.com/gh/mozilla/webextension-polyfill)
[![codecov](https://codecov.io/gh/mozilla/webextension-polyfill/branch/master/graph/badge.svg)](https://codecov.io/gh/mozilla/webextension-polyfill)
[![devDependency Status](https://david-dm.org/mozilla/webextension-polyfill/dev-status.svg)](https://david-dm.org/mozilla/webextension-polyfill#info=devDependencies)
[![npm version](https://badge.fury.io/js/webextension-polyfill.svg)](https://badge.fury.io/js/webextension-polyfill)
> This library doesn't (and it is not going to) polyfill API methods or options that are missing on Chrome but natively provided > This library doesn't (and it is not going to) polyfill API methods or options that are missing on Chrome but natively provided
> on Firefox, and so the extension has to do its own "runtime feature detection" in those cases (and then eventually polyfill the > on Firefox, and so the extension has to do its own "runtime feature detection" in those cases (and then eventually polyfill the
> missing feature on its own or enable/disable some of the features accordingly). > missing feature on its own or enable/disable some of the features accordingly).

View File

@ -26,6 +26,7 @@
"browserify": "^16.2.2", "browserify": "^16.2.2",
"chai": "^4.2.0", "chai": "^4.2.0",
"chromedriver": "^87.0.2", "chromedriver": "^87.0.2",
"codecov": "^3.8.1",
"cross-env": "^6.0.3", "cross-env": "^6.0.3",
"eslint": "^6.6.0", "eslint": "^6.6.0",
"finalhandler": "^1.1.0", "finalhandler": "^1.1.0",
@ -34,7 +35,6 @@
"grunt": "^1.0.1", "grunt": "^1.0.1",
"grunt-babel": "^8.0.0", "grunt-babel": "^8.0.0",
"grunt-contrib-concat": "^1.0.1", "grunt-contrib-concat": "^1.0.1",
"grunt-coveralls": "^2.0.0",
"grunt-replace": "^1.0.1", "grunt-replace": "^1.0.1",
"gruntify-eslint": "^5.0.0", "gruntify-eslint": "^5.0.0",
"istanbul-lib-instrument": "^3.3.0", "istanbul-lib-instrument": "^3.3.0",
@ -61,7 +61,7 @@
"scripts": { "scripts": {
"build": "grunt", "build": "grunt",
"prepublish": "npm run build && npm run test", "prepublish": "npm run build && npm run test",
"publish-coverage": "grunt coveralls", "publish-coverage": "codecov",
"test": "mocha", "test": "mocha",
"test-coverage": "cross-env COVERAGE=y nyc mocha", "test-coverage": "cross-env COVERAGE=y nyc mocha",
"test-minified": "cross-env TEST_MINIFIED_POLYFILL=1 mocha", "test-minified": "cross-env TEST_MINIFIED_POLYFILL=1 mocha",

View File

@ -34,7 +34,7 @@ const launchBrowser = async (launchOptions) => {
const options = new chrome.Options(); const options = new chrome.Options();
options.addArguments([ options.addArguments([
`--load-extension=${extensionPath}`, `--load-extension=${extensionPath}`,
// See https://docs.travis-ci.com/user/chrome and issue #85 for a rationale. // See issue #85 for a rationale.
"--no-sandbox", "--no-sandbox",
]); ]);
@ -49,10 +49,21 @@ const launchBrowser = async (launchOptions) => {
]); ]);
} }
const service = new chrome.ServiceBuilder(chromedriver.path);
if (process.env.CHROMEDRIVER_VERBOSE_LOGFILE) {
// Prevent intermittent failures due to limited resources while running
// in small VMs / docker containers (See #256 for a rationale).
const logsPath = process.env.CHROMEDRIVER_VERBOSE_LOGFILE;
console.warn(`NOTE: Verbose chromedriver logs: ${logsPath}`);
service.loggingTo(logsPath);
service.enableVerboseLogging();
}
driver = await new Builder() driver = await new Builder()
.forBrowser("chrome") .forBrowser("chrome")
.setChromeOptions(options) .setChromeOptions(options)
.setChromeService(new chrome.ServiceBuilder(chromedriver.path)) .setChromeService(service)
.build(); .build();
} else if (browser === "firefox") { } else if (browser === "firefox") {
const firefox = require("selenium-webdriver/firefox"); const firefox = require("selenium-webdriver/firefox");