Add Dockerfile for WebPageReplay fun (#1849)
This commit is contained in:
parent
a137202a1e
commit
0c550ed106
|
|
@ -1,21 +1,22 @@
|
||||||
{
|
{
|
||||||
"root": true,
|
"root": true,
|
||||||
"env": {
|
"env": {
|
||||||
"node": true,
|
"node": true,
|
||||||
"es6": true
|
"es6": true
|
||||||
},
|
},
|
||||||
"plugins": [
|
"parserOptions": {
|
||||||
"prettier"
|
"ecmaVersion": 8
|
||||||
|
},
|
||||||
|
"plugins": ["prettier"],
|
||||||
|
"extends": "eslint:recommended",
|
||||||
|
"rules": {
|
||||||
|
"prettier/prettier": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"singleQuote": true
|
||||||
|
}
|
||||||
],
|
],
|
||||||
"extends": "eslint:recommended",
|
"no-extra-semi": 0,
|
||||||
"rules": {
|
"no-mixed-spaces-and-tabs": 0
|
||||||
"prettier/prettier": [
|
}
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"singleQuote": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"no-extra-semi": 0,
|
|
||||||
"no-mixed-spaces-and-tabs": 0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
FROM sitespeedio/webbrowsers:firefox-57.0-chrome-63.0
|
||||||
|
|
||||||
|
ENV SITESPEED_IO_BROWSERTIME__XVFB true
|
||||||
|
ENV SITESPEED_IO_BROWSERTIME__DOCKER true
|
||||||
|
ENV SITESPEED_IO_BROWSERTIME__VIDEO true
|
||||||
|
ENV SITESPEED_IO_BROWSERTIME__speedIndex true
|
||||||
|
|
||||||
|
# Install Go, WebPageReplay and the webpagereplay wrapper
|
||||||
|
|
||||||
|
WORKDIR /work
|
||||||
|
RUN sudo apt-get update && sudo apt-get install libnss3-tools \
|
||||||
|
curl \
|
||||||
|
git \
|
||||||
|
build-essential \
|
||||||
|
iproute2 -y && \
|
||||||
|
mkdir -p $HOME/.pki/nssdb && \
|
||||||
|
certutil -d $HOME/.pki/nssdb -N && \
|
||||||
|
curl -O https://storage.googleapis.com/golang/go1.9.linux-amd64.tar.gz && \
|
||||||
|
tar -xvf go1.9.linux-amd64.tar.gz && \
|
||||||
|
sudo mv go /usr/local
|
||||||
|
|
||||||
|
ENV PATH="/usr/local/go/bin:${PATH}"
|
||||||
|
|
||||||
|
RUN go get github.com/urfave/cli && \
|
||||||
|
go get golang.org/x/net/http2 && \
|
||||||
|
go get github.com/catapult-project/catapult/web_page_replay_go/src/webpagereplay && \
|
||||||
|
npm install webpagereplaywrapper -g
|
||||||
|
|
||||||
|
WORKDIR /root/go/src/github.com/catapult-project/catapult/web_page_replay_go
|
||||||
|
RUN go run src/wpr.go installroot
|
||||||
|
|
||||||
|
RUN mkdir -p /usr/src/app
|
||||||
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
|
VOLUME /sitespeed.io
|
||||||
|
|
||||||
|
COPY package.* /usr/src/app/
|
||||||
|
RUN npm install --production
|
||||||
|
COPY . /usr/src/app
|
||||||
|
|
||||||
|
## This is to avoid click the OK button
|
||||||
|
RUN mkdir -m 0750 /root/.android
|
||||||
|
ADD docker/adb/insecure_shared_adbkey /root/.android/adbkey
|
||||||
|
ADD docker/adb/insecure_shared_adbkey.pub /root/.android/adbkey.pub
|
||||||
|
|
||||||
|
VOLUME /sitespeed.io
|
||||||
|
WORKDIR /sitespeed.io
|
||||||
|
|
||||||
|
COPY docker/scripts/start.sh /start.sh
|
||||||
|
|
||||||
|
ENTRYPOINT ["/start.sh"]
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
let yargs = require('yargs'),
|
||||||
|
browsertime = require('browsertime'),
|
||||||
|
merge = require('lodash.merge'),
|
||||||
|
getURLs = require('../lib/cli/util').getURLs,
|
||||||
|
browsertimeConfig = require('../lib/plugins/browsertime/index').config;
|
||||||
|
|
||||||
|
async function testURL(engine, url) {
|
||||||
|
await engine
|
||||||
|
.start()
|
||||||
|
.then(() => engine.run(url))
|
||||||
|
.finally(() => engine.stop());
|
||||||
|
}
|
||||||
|
|
||||||
|
async function runBrowsertime() {
|
||||||
|
let parsed = yargs
|
||||||
|
.env('SITESPEED_IO')
|
||||||
|
.require(1, 'urlOrFile')
|
||||||
|
.option('browsertime.browser', {
|
||||||
|
alias: ['b', 'browser'],
|
||||||
|
default: browsertimeConfig.browser,
|
||||||
|
describe: 'Choose which Browser to use when you test.',
|
||||||
|
choices: ['chrome', 'firefox'],
|
||||||
|
group: 'Browser'
|
||||||
|
})
|
||||||
|
.option('browsertime.viewPort', {
|
||||||
|
default: browsertimeConfig.viewPort,
|
||||||
|
describe: 'The browser view port size WidthxHeight like 400x300',
|
||||||
|
group: 'Browser'
|
||||||
|
});
|
||||||
|
|
||||||
|
const defaultConfig = {
|
||||||
|
iterations: 1,
|
||||||
|
connectivity: {
|
||||||
|
profile: 'native',
|
||||||
|
downstreamKbps: undefined,
|
||||||
|
upstreamKbps: undefined,
|
||||||
|
latency: undefined,
|
||||||
|
engine: 'external'
|
||||||
|
},
|
||||||
|
viewPort: '1366x708',
|
||||||
|
delay: 0,
|
||||||
|
video: false,
|
||||||
|
speedIndex: false,
|
||||||
|
resultDir: '/tmp/browsertime'
|
||||||
|
};
|
||||||
|
|
||||||
|
const btOptions = merge({}, parsed.argv.browsertime, defaultConfig);
|
||||||
|
browsertime.logging.configure(parsed.argv);
|
||||||
|
|
||||||
|
const engine = new browsertime.Engine(btOptions);
|
||||||
|
const urls = getURLs(parsed.argv._);
|
||||||
|
|
||||||
|
for (let url of urls) {
|
||||||
|
await testURL(engine, url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
runBrowsertime();
|
||||||
|
|
@ -4,33 +4,73 @@ set -e
|
||||||
google-chrome --version
|
google-chrome --version
|
||||||
firefox --version
|
firefox --version
|
||||||
|
|
||||||
|
BROWSERTIME=/usr/src/app/bin/browsertimeWebPageReplay.js
|
||||||
|
SITESPEEDIO=/usr/src/app/bin/sitespeed.js
|
||||||
|
|
||||||
# Here's a hack for fixing the problem with Chrome not starting in time
|
# Here's a hack for fixing the problem with Chrome not starting in time
|
||||||
# See https://github.com/SeleniumHQ/docker-selenium/issues/87#issuecomment-250475864
|
# See https://github.com/SeleniumHQ/docker-selenium/issues/87#issuecomment-250475864
|
||||||
|
function chromeSetup() {
|
||||||
|
sudo rm -f /var/lib/dbus/machine-id
|
||||||
|
sudo mkdir -p /var/run/dbus
|
||||||
|
sudo service dbus restart > /dev/null
|
||||||
|
service dbus status > /dev/null
|
||||||
|
export $(dbus-launch)
|
||||||
|
export NSS_USE_SHARED_DB=ENABLED
|
||||||
|
}
|
||||||
|
|
||||||
sudo rm -f /var/lib/dbus/machine-id
|
# If we run Chrome on Android, we need to start the ADB server
|
||||||
sudo mkdir -p /var/run/dbus
|
function setupADB(){
|
||||||
sudo service dbus restart > /dev/null
|
# Start adb server and list connected devices
|
||||||
service dbus status > /dev/null
|
if [ -n "$START_ADB_SERVER" ] ; then
|
||||||
export $(dbus-launch)
|
sudo adb start-server
|
||||||
export NSS_USE_SHARED_DB=ENABLED
|
sudo adb devices
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Start adb server and list connected devices
|
function runWebPageReplay() {
|
||||||
if [ -n "$START_ADB_SERVER" ] ; then
|
|
||||||
sudo adb start-server
|
|
||||||
sudo adb devices
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Inspired by docker-selenium way of shutting down
|
LATENCY=${LATENCY:-100}
|
||||||
function shutdown {
|
HTTP_PORT=80
|
||||||
kill -s SIGTERM $PID
|
HTTPS_PORT=443
|
||||||
|
WPR_PATH=/root/go/src/github.com/catapult-project/catapult/web_page_replay_go
|
||||||
|
WPR_PARAMS="--path $WPR_PATH --http $HTTP_PORT --https $HTTPS_PORT"
|
||||||
|
|
||||||
|
webpagereplaywrapper record --start $WPR_PARAMS
|
||||||
|
|
||||||
|
$BROWSERTIME --browsertime.chrome.args host-resolver-rules="MAP *:$HTTP_PORT 127.0.0.1:$HTTP_PORT,MAP *:$HTTPS_PORT 127.0.0.1:$HTTPS_PORT,EXCLUDE localhost" --browsertime.firefox.preference network.dns.forceResolve:127.0.0.1 --browsertime.firefox.acceptInsecureCerts --browsertime.skipHar --browsertime.pageCompleteCheck "return true;" "$@"
|
||||||
|
|
||||||
|
webpagereplaywrapper record --stop $WPR_PARAMS
|
||||||
|
|
||||||
|
webpagereplaywrapper replay --start $WPR_PARAMS
|
||||||
|
|
||||||
|
$SITESPEEDIO --browsertime.firefox.acceptInsecureCerts --browsertime.firefox.preference network.dns.forceResolve:127.0.0.1 --browsertime.chrome.args host-resolver-rules="MAP *:$HTTP_PORT 127.0.0.1:$HTTP_PORT,MAP *:$HTTPS_PORT 127.0.0.1:$HTTPS_PORT,EXCLUDE localhost" --video --speedIndex --browsertime.pageCompleteCheck "return true;" --browsertime.connectivity.engine throttle --browsertime.connectivity.throttle.localhost --browsertime.connectivity.profile custom --browsertime.connectivity.latency $LATENCY "$@"
|
||||||
|
|
||||||
|
webpagereplaywrapper replay --stop $WPR_PARAMS
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function runSitespeedio(){
|
||||||
|
|
||||||
|
# Inspired by docker-selenium way of shutting down
|
||||||
|
function shutdown {
|
||||||
|
kill -s SIGTERM ${PID}
|
||||||
|
wait $PID
|
||||||
|
}
|
||||||
|
|
||||||
|
exec $SITESPEEDIO "$@" &
|
||||||
|
|
||||||
|
PID=$!
|
||||||
|
|
||||||
|
trap shutdown SIGTERM SIGINT
|
||||||
wait $PID
|
wait $PID
|
||||||
}
|
}
|
||||||
|
|
||||||
MAX_OLD_SPACE_SIZE="${MAX_OLD_SPACE_SIZE:-2048}"
|
chromeSetup
|
||||||
|
setupADB
|
||||||
|
|
||||||
exec node --max-old-space-size=$MAX_OLD_SPACE_SIZE /usr/src/app/bin/sitespeed.js "$@" &
|
if [ $REPLAY ]
|
||||||
|
then
|
||||||
PID=$!
|
runWebPageReplay $@
|
||||||
|
else
|
||||||
trap shutdown SIGTERM SIGINT
|
runSitespeedio $@
|
||||||
wait $PID
|
fi
|
||||||
|
|
|
||||||
|
|
@ -25,3 +25,6 @@ bin/sitespeed.js --version > docs/version/sitespeed.io.txt
|
||||||
|
|
||||||
# Generate the help for the docs
|
# Generate the help for the docs
|
||||||
bin/sitespeed.js --help > docs/documentation/sitespeed.io/configuration/config.md
|
bin/sitespeed.js --help > docs/documentation/sitespeed.io/configuration/config.md
|
||||||
|
|
||||||
|
docker build -f Dockerfile.wpr --no-cache -t sitespeedio/sitespeed.io:${PACKAGE_VERSION}-wpr .
|
||||||
|
docker push sitespeedio/sitespeed.io:${PACKAGE_VERSION}-wpr
|
||||||
Loading…
Reference in New Issue