chore(build): Make PRs 15m faster.

Don't precompile Dart2JS for pull requests, instead serve the dart
sources with pub serve. We were already testing with Dartium so
all we lose is some test coverage of defects exposed only by the
Dart2JS transpiler.
This still runs the dart transformer.

Fixes #3030
This commit is contained in:
Alex Eagle 2015-07-20 15:54:30 -07:00
parent 476988876c
commit 51e6f33d32
11 changed files with 128 additions and 32 deletions

View File

@ -187,7 +187,7 @@ rights to built them in your operating system.
### E2E tests ### E2E tests
1. `$(npm bin)/gulp build.js.cjs` (builds benchpress and tests into `dist/js/cjs` folder). 1. `$(npm bin)/gulp build.js.cjs` (builds benchpress and tests into `dist/js/cjs` folder).
2. `$(npm bin)/gulp serve.js.prod serve.js.dart2js` (runs a local webserver). 2. `$(npm bin)/gulp serve.js.prod serve.dart` (runs a local webserver).
3. `$(npm bin)/protractor protractor-js.conf.js`: JS e2e tests. 3. `$(npm bin)/protractor protractor-js.conf.js`: JS e2e tests.
4. `$(npm bin)/protractor protractor-dart2js.conf.js`: dart2js e2e tests. 4. `$(npm bin)/protractor protractor-dart2js.conf.js`: dart2js e2e tests.
@ -197,7 +197,7 @@ Angular specific command line options when running protractor:
### Performance tests ### Performance tests
1. `$(npm bin)/gulp build.js.cjs` (builds benchpress and tests into `dist/js/cjs` folder) 1. `$(npm bin)/gulp build.js.cjs` (builds benchpress and tests into `dist/js/cjs` folder)
2. `$(npm bin)/gulp serve.js.prod serve.js.dart2js` (runs a local webserver) 2. `$(npm bin)/gulp serve.js.prod serve.dart` (runs a local webserver)
3. `$(npm bin)/protractor protractor-js.conf.js --benchmark`: JS performance tests 3. `$(npm bin)/protractor protractor-js.conf.js --benchmark`: JS performance tests
4. `$(npm bin)/protractor protractor-dart2js.conf.js --benchmark`: dart2js performance tests 4. `$(npm bin)/protractor protractor-dart2js.conf.js --benchmark`: dart2js performance tests

View File

@ -150,7 +150,7 @@ var BENCHPRESS_BUNDLE_CONFIG = {
'rx' 'rx'
], ],
dest: CONFIG.dest.benchpress_bundle dest: CONFIG.dest.benchpress_bundle
} };
// ------------ // ------------
// clean // clean
@ -245,6 +245,7 @@ gulp.task('build/analyze.dart', dartanalyzer(gulp, gulpPlugins, {
// ------------ // ------------
// pubbuild // pubbuild
// WARNING: this task is very slow (~15m as of July 2015)
gulp.task('build/pubbuild.dart', pubbuild(gulp, gulpPlugins, { gulp.task('build/pubbuild.dart', pubbuild(gulp, gulpPlugins, {
src: CONFIG.dest.dart, src: CONFIG.dest.dart,
@ -330,6 +331,17 @@ function jsServeDartJs() {
})(); })();
} }
function proxyServeDart() {
return jsserve(gulp, gulpPlugins, {
port: 8002,
proxies: [
{route: '/examples', url: 'http://localhost:8004'},
{route: '/benchmarks_external', url: 'http://localhost:8008'},
{route: '/benchmarks', url: 'http://localhost:8006'}
]
})();
}
// ------------------ // ------------------
// web servers // web servers
gulp.task('serve.js.dev', ['build.js.dev'], function(neverDone) { gulp.task('serve.js.dev', ['build.js.dev'], function(neverDone) {
@ -351,19 +363,33 @@ gulp.task('serve.e2e.prod', ['build.js.prod', 'build.js.cjs', 'build.css.materia
gulp.task('serve.js.dart2js', jsServeDartJs); gulp.task('serve.js.dart2js', jsServeDartJs);
gulp.task('!proxyServeDart', proxyServeDart);
gulp.task('serve.dart', function(done) {
runSequence([
'!proxyServeDart',
'serve/examples.dart',
'serve/benchmarks.dart',
'serve/benchmarks_external.dart'
], done);
});
gulp.task('serve/examples.dart', pubserve(gulp, gulpPlugins, { gulp.task('serve/examples.dart', pubserve(gulp, gulpPlugins, {
command: DART_SDK.PUB, command: DART_SDK.PUB,
path: CONFIG.dest.dart + '/examples' path: CONFIG.dest.dart + '/examples',
port: 8004
})); }));
gulp.task('serve/benchmarks.dart', pubserve(gulp, gulpPlugins, { gulp.task('serve/benchmarks.dart', pubserve(gulp, gulpPlugins, {
command: DART_SDK.PUB, command: DART_SDK.PUB,
path: CONFIG.dest.dart + '/benchmarks' path: CONFIG.dest.dart + '/benchmarks',
port: 8006
})); }));
gulp.task('serve/benchmarks_external.dart', pubserve(gulp, gulpPlugins, { gulp.task('serve/benchmarks_external.dart', pubserve(gulp, gulpPlugins, {
command: DART_SDK.PUB, command: DART_SDK.PUB,
path: CONFIG.dest.dart + '/benchmarks_external' path: CONFIG.dest.dart + '/benchmarks_external',
port: 8008
})); }));
// -------------- // --------------
@ -751,7 +777,6 @@ gulp.task('build.dart', function(done) {
'build/packages.dart', 'build/packages.dart',
'build/pubspec.dart', 'build/pubspec.dart',
'build/analyze.dart', 'build/analyze.dart',
'build/pubbuild.dart',
'build.dart.material.css', 'build.dart.material.css',
sequenceComplete(done) sequenceComplete(done)
); );

View File

@ -56,33 +56,33 @@ createTemplate(String html) {
return div; return div;
} }
@Directive(selector: '[dir0]', map: const {'attr0': '=>prop'}) @Decorator(selector: '[dir0]', map: const {'attr0': '=>prop'})
class Dir0 { class Dir0 {
Object prop; Object prop;
} }
@Directive(selector: '[dir1]', map: const {'attr1': '=>prop'}) @Decorator(selector: '[dir1]', map: const {'attr1': '=>prop'})
class Dir1 { class Dir1 {
Object prop; Object prop;
constructor(Dir0 dir0) {} constructor(Dir0 dir0) {}
} }
@Directive(selector: '[dir2]', map: const {'attr2': '=>prop'}) @Decorator(selector: '[dir2]', map: const {'attr2': '=>prop'})
class Dir2 { class Dir2 {
Object prop; Object prop;
constructor(Dir1 dir1) {} constructor(Dir1 dir1) {}
} }
@Directive(selector: '[dir3]', map: const {'attr3': '=>prop'}) @Decorator(selector: '[dir3]', map: const {'attr3': '=>prop'})
class Dir3 { class Dir3 {
Object prop; Object prop;
constructor(Dir2 dir2) {} constructor(Dir2 dir2) {}
} }
@Directive(selector: '[dir4]', map: const {'attr4': '=>prop'}) @Decorator(selector: '[dir4]', map: const {'attr4': '=>prop'})
class Dir4 { class Dir4 {
Object prop; Object prop;

View File

@ -9382,6 +9382,9 @@
"node-uuid": { "node-uuid": {
"version": "1.4.3" "version": "1.4.3"
}, },
"on-headers": {
"version": "1.0.0"
},
"parse5": { "parse5": {
"version": "1.3.2" "version": "1.3.2"
}, },
@ -9533,6 +9536,9 @@
} }
} }
}, },
"proxy-middleware": {
"version": "0.13.0"
},
"q": { "q": {
"version": "1.3.0" "version": "1.3.0"
}, },

24
npm-shrinkwrap.json generated
View File

@ -3355,7 +3355,7 @@
}, },
"clang-format": { "clang-format": {
"version": "1.0.28", "version": "1.0.28",
"from": "clang-format@1.0.28", "from": "https://registry.npmjs.org/clang-format/-/clang-format-1.0.28.tgz",
"resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.0.28.tgz", "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.0.28.tgz",
"dependencies": { "dependencies": {
"resolve": { "resolve": {
@ -14506,6 +14506,11 @@
"from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz", "from": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz",
"resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz" "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz"
}, },
"on-headers": {
"version": "1.0.0",
"from": "on-headers@*",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.0.tgz"
},
"parse5": { "parse5": {
"version": "1.3.2", "version": "1.3.2",
"from": "https://registry.npmjs.org/parse5/-/parse5-1.3.2.tgz", "from": "https://registry.npmjs.org/parse5/-/parse5-1.3.2.tgz",
@ -14743,6 +14748,11 @@
} }
} }
}, },
"proxy-middleware": {
"version": "0.13.0",
"from": "proxy-middleware@*",
"resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.13.0.tgz"
},
"q": { "q": {
"version": "1.3.0", "version": "1.3.0",
"from": "https://registry.npmjs.org/q/-/q-1.3.0.tgz", "from": "https://registry.npmjs.org/q/-/q-1.3.0.tgz",
@ -15390,29 +15400,29 @@
"dependencies": { "dependencies": {
"source-map": { "source-map": {
"version": "0.4.4", "version": "0.4.4",
"from": "source-map@>=0.4.2 <0.5.0", "from": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
"dependencies": { "dependencies": {
"amdefine": { "amdefine": {
"version": "1.0.0", "version": "1.0.0",
"from": "amdefine@>=0.0.4", "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz"
} }
} }
}, },
"source-map-support": { "source-map-support": {
"version": "0.3.2", "version": "0.3.2",
"from": "source-map-support@>=0.3.1 <0.4.0", "from": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.3.2.tgz",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.3.2.tgz", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.3.2.tgz",
"dependencies": { "dependencies": {
"source-map": { "source-map": {
"version": "0.1.32", "version": "0.1.32",
"from": "source-map@0.1.32", "from": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz",
"dependencies": { "dependencies": {
"amdefine": { "amdefine": {
"version": "1.0.0", "version": "1.0.0",
"from": "amdefine@>=0.0.4", "from": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz",
"resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz" "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz"
} }
} }
@ -15421,7 +15431,7 @@
}, },
"typescript": { "typescript": {
"version": "1.5.3", "version": "1.5.3",
"from": "microsoft/TypeScript#release-1.5", "from": "git://github.com/microsoft/TypeScript.git#a24aa6f57d281bafd3535f0f4c3f492364a8b4d6",
"resolved": "git://github.com/microsoft/TypeScript.git#a24aa6f57d281bafd3535f0f4c3f492364a8b4d6" "resolved": "git://github.com/microsoft/TypeScript.git#a24aa6f57d281bafd3535f0f4c3f492364a8b4d6"
} }
} }

View File

@ -103,8 +103,10 @@
"mock-fs": "^2.5.0", "mock-fs": "^2.5.0",
"node-html-encoder": "0.0.2", "node-html-encoder": "0.0.2",
"node-uuid": "1.4.x", "node-uuid": "1.4.x",
"on-headers": "^1.0.0",
"parse5": "1.3.2", "parse5": "1.3.2",
"protractor": "2.1.0", "protractor": "2.1.0",
"proxy-middleware": "^0.13.0",
"q": "^1.0.1", "q": "^1.0.1",
"react": "^0.13.2", "react": "^0.13.2",
"rewire": "^2.3.3", "rewire": "^2.3.3",

View File

@ -12,8 +12,17 @@ function killServer () {
kill $serverPid kill $serverPid
} }
./node_modules/.bin/gulp serve.js.dart2js& # Serving pre-compiled dart JS takes an extra 15m.
serverPid=$! # So we do this only for post-commit testing.
# Pull requests test with Dartium and pub serve
if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then
./node_modules/.bin/gulp build/pubbuild.dart
./node_modules/.bin/gulp serve.js.dart2js&
serverPid=$!
else
./node_modules/.bin/gulp serve.dart&
serverPid=$!
fi
./node_modules/.bin/gulp build.css.material& ./node_modules/.bin/gulp build.css.material&

View File

@ -13,8 +13,17 @@ function killServer () {
kill $serverPid kill $serverPid
} }
./node_modules/.bin/gulp serve.js.prod serve.js.dart2js& # Serving pre-compiled dart JS takes an extra 15m.
serverPid=$! # So we do this only for post-commit testing.
# Pull requests test with Dartium and pub serve
if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then
./node_modules/.bin/gulp build/pubbuild.dart
./node_modules/.bin/gulp serve.js.prod serve.js.dart2js&
serverPid=$!
else
./node_modules/.bin/gulp serve.js.prod serve.dart&
serverPid=$!
fi
trap killServer EXIT trap killServer EXIT

View File

@ -11,8 +11,17 @@ cd $SCRIPT_DIR/../..
webdriverServerPid=$! webdriverServerPid=$!
ps -ef | grep webdriver-manager ps -ef | grep webdriver-manager
./node_modules/.bin/gulp serve.js.dart2js& # Serving pre-compiled dart JS takes an extra 15m.
serverPid=$! # So we do this only for post-commit testing.
# Pull requests test with Dartium and pub serve
if [ "${TRAVIS_PULL_REQUEST}" = "false" ]; then
./node_modules/.bin/gulp build/pubbuild.dart
./node_modules/.bin/gulp serve.js.dart2js&
serverPid=$!
else
./node_modules/.bin/gulp serve.dart&
serverPid=$!
fi
function killAllServers () { function killAllServers () {
kill $serverPid kill $serverPid

View File

@ -1,15 +1,40 @@
var onHeaders = require('on-headers');
var proxy = require('proxy-middleware');
var url = require('url');
module.exports = function(gulp, plugins, config) { module.exports = function(gulp, plugins, config) {
return function() { return function() {
plugins.connect.server({ plugins.connect.server({
root: [__dirname+'/../../'+config.path], root: [__dirname + '/../../' + config.path],
port: config.port, port: config.port,
livereload: false, livereload: false,
open: false, open: false,
middleware: function(connect, opt) { middleware: function(connect, opt) {
return [ config.proxies = config.proxies || [];
connect.favicon() var middlewares =
] config.proxies.map(function(entry) { return makeProxy(entry.route, entry.url); });
middlewares.push(connect.favicon());
// pub serve can't give the right content-type header for jsonp requests
// so we must turn off Chromium strict MIME type checking
// see https://github.com/angular/angular/issues/3030#issuecomment-123453168
middlewares.unshift(stripHeader('x-content-type-options'));
return middlewares;
} }
})(); })();
}; };
}; };
function makeProxy(route, urlParam) {
var options = url.parse(urlParam);
options.route = route;
return proxy(options);
}
function stripHeader(toStrip) {
return function(req, res, next) {
onHeaders(res, function onHeaders() {
res.removeHeader(toStrip);
});
next();
};
}

View File

@ -3,11 +3,12 @@ var spawn = require('child_process').spawn;
module.exports = function(gulp, plugins, config, module) { module.exports = function(gulp, plugins, config, module) {
return function() { return function() {
config.port = config.port || 8080;
var pubMode = config.mode || 'debug'; var pubMode = config.mode || 'debug';
var pubArgs = ['serve', '--mode', pubMode]; var pubArgs = ['serve', '--mode', pubMode, '--port', config.port];
return util.streamToPromise(spawn(config.command, pubArgs, { return util.streamToPromise(spawn(config.command, pubArgs, {
cwd: config.path, stdio: 'inherit' // pub serve is very spammy, and --verbosity flag doesn't fix it
cwd: config.path, stdio: 'ignore'
})); }));
}; };
}; };