From 359a662c148bc2be270408f5d879dd5f1f821ebc Mon Sep 17 00:00:00 2001 From: Erik Onarheim Date: Fri, 1 Jul 2022 13:43:04 -0500 Subject: [PATCH] fix: [#2374] M1 Mac tests, add test runner container (#2373) Closes #2374 This PR attempts to add a dev container build to address cross platform development In addition this revs our puppeteer to the latest build Mac Prerequisites: * Docker for Mac https://docs.docker.com/desktop/mac/install/ * In the root, run `docker-compose build` (setup build environment and installs dependencies, only needed once) * To run tests in watch mode `docker-compose run --rm dev npm run test:watch` * To run a build `docker-compose run --rm dev npm run all` --- README.md | 8 ++ docker-compose.yml | 12 ++ docker/Dockerfile | 20 ++++ karma.conf.js | 16 +-- package-lock.json | 104 +++++++++--------- package.json | 2 +- .../Context/ExcaliburGraphicsContextWebGL.ts | 5 +- wallaby.js | 2 +- 8 files changed, 105 insertions(+), 64 deletions(-) create mode 100644 docker-compose.yml create mode 100644 docker/Dockerfile diff --git a/README.md b/README.md index dcd883fb3..44bcefda4 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,14 @@ Compiled examples can be found [in the Excalibur Samples collection](http://exca Please read our [Contributing Guidelines](.github/CONTRIBUTING.md) and our [Code of Conduct](.github/CODE_OF_CONDUCT.md). Whether you've spotted a bug, have a question, or think of a new feature, we thank you for your help! +## Mac + +Prerequisites +* Docker for Mac https://docs.docker.com/desktop/mac/install/ +* In the root, run `docker-compose build` (setup build environment and installs dependencies, only needed once) +* To run tests in watch mode `docker-compose run --rm dev npm run test:watch` +* To run a build `docker-compose run --rm dev npm run all` + # Writing Documentation We love when people help improve our documentation. You can contribute to the docs in [this repository](https://github.com/excaliburjs/excaliburjs.github.io). diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..f78cd4c2a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,12 @@ +version: '3' + +services: + dev: + build: + context: . + dockerfile: docker/Dockerfile + working_dir: /opt/app + container_name: "dev" + volumes: + - "./:/opt/app" + - /opt/app/node_modules \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 000000000..37120cabf --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,20 @@ +from ubuntu:20.04 +# Referenced https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md +# ubuntu-latest https://github.com/actions/virtual-environments + +# Chrome wants a timezone +ENV TZ=America/Chicago +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN apt update +# Install Chromium Shared Deps (puppeteer in npm comes with chromium binary) +RUN apt install -y wget curl gnupg libnss3-dev libgdk-pixbuf2.0-dev libgtk-3-dev libxss-dev libasound2 + +# Install node +RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - +RUN apt-get -y install nodejs + + +WORKDIR /opt/app +ADD package.json package-lock.json /opt/app/ +RUN npm install \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index d2b5fd624..6753bda0a 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -2,7 +2,7 @@ const process = require('process'); const path = require('path'); const webpack = require('webpack'); -process.env.CHROME_BIN = require('puppeteer').executablePath(); +process.env.CHROMIUM_BIN = require('puppeteer').executablePath(); const isAppveyor = process.env.APPVEYOR_BUILD_NUMBER ? true : false; const karmaJasmineSeedReporter = function(baseReporterDecorator) { @@ -134,21 +134,21 @@ module.exports = (config) => { // base output directory. If you include %browser% in the path it will be replaced with the karma browser name dir: path.join(__dirname, 'coverage') }, - browsers: ['ChromeHeadless_with_audio'], + browsers: ['ChromiumHeadless_with_audio'], browserDisconnectTolerance : 1, browserDisconnectTimeout: 10000, browserNoActivityTimeout: 60000, // appveyor is slow :( customLaunchers: { - ChromeHeadless_with_audio: { - base: 'ChromeHeadless', + ChromiumHeadless_with_audio: { + base: 'ChromiumHeadless', flags: ['--autoplay-policy=no-user-gesture-required', '--mute-audio', '--disable-gpu', '--no-sandbox'] }, - ChromeHeadless_with_debug: { - base: 'ChromeHeadless', + ChromiumHeadless_with_debug: { + base: 'ChromiumHeadless', flags: ['--remote-debugging-port=9334', '--no-sandbox', '--disable-web-security'] }, - Chrome_with_debug: { - base: 'Chrome', + Chromium_with_debug: { + base: 'Chromium', flags: ['--remote-debugging-port=9334', '--no-sandbox'] } } diff --git a/package-lock.json b/package-lock.json index 7f531352a..9bafee369 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "karma-jasmine": "4.0.2", "karma-summary-reporter": "3.1.1", "karma-webpack": "5.0.0", - "puppeteer": "13.3.2", + "puppeteer": "15.2.0", "react": "17.0.2", "react-dom": "17.0.2", "replace-in-file": "6.3.5", @@ -9478,9 +9478,9 @@ } }, "node_modules/agent-base/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -13440,9 +13440,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.960912", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.960912.tgz", - "integrity": "sha512-I3hWmV9rWHbdnUdmMKHF2NuYutIM2kXz2mdXW8ha7TbRlGTVs+PF+PsB5QWvpCek4Fy9B+msiispCfwlhG5Sqg==", + "version": "0.0.1011705", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1011705.tgz", + "integrity": "sha512-OKvTvu9n3swmgYshvsyVHYX0+aPzCoYUnyXUacfQMmFtBtBKewV/gT4I9jkAbpTqtTi2E4S9MXLlvzBDUlqg0Q==", "dev": true }, "node_modules/di": { @@ -16900,9 +16900,9 @@ "dev": true }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { "agent-base": "6", @@ -16913,9 +16913,9 @@ } }, "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -21331,33 +21331,33 @@ "dev": true }, "node_modules/puppeteer": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.3.2.tgz", - "integrity": "sha512-TIt8/R0eaUwY1c0/O0sCJpSglvGEWVoWFfGZ2dNtxX3eHuBo1ln9abaWfxTjZfsrkYATLSs8oqEdRZpMNnCsvg==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-15.2.0.tgz", + "integrity": "sha512-6Mzj5pbq4J4DxJE5o6V+arrOB9Gma0CxOLP1zKYMrMR7AYuNaPzsK7pBrpDwI64W6Mxk5G7NqiLSFTrgSzR1zg==", "dev": true, "hasInstallScript": true, "dependencies": { "cross-fetch": "3.1.5", - "debug": "4.3.3", - "devtools-protocol": "0.0.960912", + "debug": "4.3.4", + "devtools-protocol": "0.0.1011705", "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", + "https-proxy-agent": "5.0.1", "pkg-dir": "4.2.0", "progress": "2.0.3", "proxy-from-env": "1.1.0", "rimraf": "3.0.2", "tar-fs": "2.1.1", "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "ws": "8.8.0" }, "engines": { - "node": ">=10.18.1" + "node": ">=14.1.0" } }, "node_modules/puppeteer/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -26946,9 +26946,9 @@ } }, "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -34073,9 +34073,9 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -37171,9 +37171,9 @@ } }, "devtools-protocol": { - "version": "0.0.960912", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.960912.tgz", - "integrity": "sha512-I3hWmV9rWHbdnUdmMKHF2NuYutIM2kXz2mdXW8ha7TbRlGTVs+PF+PsB5QWvpCek4Fy9B+msiispCfwlhG5Sqg==", + "version": "0.0.1011705", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1011705.tgz", + "integrity": "sha512-OKvTvu9n3swmgYshvsyVHYX0+aPzCoYUnyXUacfQMmFtBtBKewV/gT4I9jkAbpTqtTi2E4S9MXLlvzBDUlqg0Q==", "dev": true }, "di": { @@ -39822,9 +39822,9 @@ "dev": true }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "requires": { "agent-base": "6", @@ -39832,9 +39832,9 @@ }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -43292,29 +43292,29 @@ "dev": true }, "puppeteer": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.3.2.tgz", - "integrity": "sha512-TIt8/R0eaUwY1c0/O0sCJpSglvGEWVoWFfGZ2dNtxX3eHuBo1ln9abaWfxTjZfsrkYATLSs8oqEdRZpMNnCsvg==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-15.2.0.tgz", + "integrity": "sha512-6Mzj5pbq4J4DxJE5o6V+arrOB9Gma0CxOLP1zKYMrMR7AYuNaPzsK7pBrpDwI64W6Mxk5G7NqiLSFTrgSzR1zg==", "dev": true, "requires": { "cross-fetch": "3.1.5", - "debug": "4.3.3", - "devtools-protocol": "0.0.960912", + "debug": "4.3.4", + "devtools-protocol": "0.0.1011705", "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", + "https-proxy-agent": "5.0.1", "pkg-dir": "4.2.0", "progress": "2.0.3", "proxy-from-env": "1.1.0", "rimraf": "3.0.2", "tar-fs": "2.1.1", "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "ws": "8.8.0" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -47653,9 +47653,9 @@ } }, "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 7160b8a40..b0ccebfb6 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "karma-jasmine": "4.0.2", "karma-summary-reporter": "3.1.1", "karma-webpack": "5.0.0", - "puppeteer": "13.3.2", + "puppeteer": "15.2.0", "react": "17.0.2", "react-dom": "17.0.2", "replace-in-file": "6.3.5", diff --git a/src/engine/Graphics/Context/ExcaliburGraphicsContextWebGL.ts b/src/engine/Graphics/Context/ExcaliburGraphicsContextWebGL.ts index 2eda267da..a6487ab84 100644 --- a/src/engine/Graphics/Context/ExcaliburGraphicsContextWebGL.ts +++ b/src/engine/Graphics/Context/ExcaliburGraphicsContextWebGL.ts @@ -180,8 +180,9 @@ export class ExcaliburGraphicsContextWebGL implements ExcaliburGraphicsContext { premultipliedAlpha: false, alpha: enableTransparency ?? true, depth: true, - powerPreference: 'high-performance', - failIfMajorPerformanceCaveat: true + powerPreference: 'high-performance' + // TODO Chromium fixed the bug where this didn't work now it breaks CI :( + // failIfMajorPerformanceCaveat: true }); if (!this.__gl) { throw Error('Failed to retrieve webgl context from browser'); diff --git a/wallaby.js b/wallaby.js index 62b628a69..b08ba43ff 100644 --- a/wallaby.js +++ b/wallaby.js @@ -19,7 +19,7 @@ module.exports = function (wallaby) { env: { kind: 'chrome', // This is tied to the puppeteer install - runner: './node_modules/puppeteer/.local-chromium/win64-961656/chrome-win/chrome.exe', + runner: './node_modules/puppeteer/.local-chromium/win64-1011831/chrome-win/chrome.exe', params: { runner: '--headless --mute-audio --autoplay-policy=no-user-gesture-required' }