Skip to content

Commit

Permalink
Run tests only on changed packages on PR/push (#2565)
Browse files Browse the repository at this point in the history
  • Loading branch information
hsubox76 committed Jan 23, 2020
1 parent d9bf41c commit ee57d26
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 4 deletions.
8 changes: 7 additions & 1 deletion .github/workflows/cross-browser-test.yml
@@ -1,11 +1,17 @@
name: Cross-Browser Test Flow

on: push
on:
pull_request:
branches:
- master
types:
- closed

jobs:
cross-browser-test:
name: Cross-Browser (Saucelabs) Tests
runs-on: ubuntu-latest
if: github.event.pull_request.merged
env:
SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }}
SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
Expand Down
@@ -1,6 +1,13 @@
name: Main Test Flow
name: Run All Tests

on: [push, pull_request]
on:
pull_request:
branches:
- master
types:
- closed
schedule:
- cron: '0 6,18 * * *'

jobs:
test:
Expand Down
23 changes: 23 additions & 0 deletions .github/workflows/test-changed.yml
@@ -0,0 +1,23 @@
name: Push/PR

on: [push, pull_request]

jobs:
test:
name: Test Packages With Changed Files
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v1
- name: Set up Node (10)
uses: actions/setup-node@v1
with:
node-version: 10.x
- name: Test setup and yarn install
run: |
cp config/ci.config.json config/project.json
yarn
- name: yarn build
run: yarn build
- name: Run tests on changed packages
run: xvfb-run yarn test:changed
1 change: 1 addition & 0 deletions package.json
Expand Up @@ -29,6 +29,7 @@
"pretest:coverage": "mkdirp coverage",
"ci:coverage": "lcov-result-merger 'packages/**/lcov.info' 'lcov-all.info'",
"test:coverage": "lcov-result-merger 'packages/**/lcov.info' | coveralls",
"test:changed": "node scripts/run_changed.js",
"test:setup": "node tools/config.js",
"test:saucelabs": "node scripts/run_saucelabs.js",
"test:saucelabs:single": "karma start config/karma.saucelabs.js --single-run",
Expand Down
89 changes: 89 additions & 0 deletions scripts/run_changed.js
@@ -0,0 +1,89 @@
/**
* @license
* Copyright 2020 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

const { resolve } = require('path');
const { spawn } = require('child-process-promise');
const simpleGit = require('simple-git/promise');
const root = resolve(__dirname, '..');
const git = simpleGit(root);

/**
* Runs tests on packages changed (in comparison to origin/master...HEAD)
*/

async function runTestsOnChangedPackages() {
const diff = await git.diff(['--name-only', 'origin/master...HEAD']);
const changedFiles = diff.split('\n');
const changedPackages = {};
for (const filename of changedFiles) {
const match = filename.match('^(packages/[a-zA-Z0-9-]+)/.*');
if (match && match[1]) {
const pkg = require(resolve(root, match[1], 'package.json'));
if (pkg && pkg.scripts.test) {
changedPackages[match[1]] = true;
}
}
}
if (changedPackages.size > 0) {
await runTests(Object.keys(changedPackages));
} else {
console.log(
'No changes detected in any package. Skipping all package-specific tests.'
);
}
}

/**
* Runs `yarn test` in all dirs in pathList.
* @param {Array<string>} pathList
*/
async function runTests(pathList) {
if (!pathList) return;
for (const testPath of pathList) {
try {
await spawn('yarn', ['--cwd', testPath, 'test'], {
stdio: 'inherit'
});
} catch (e) {
throw new Error(`Error running tests in ${testPath}.`);
}
}
}

/**
* These are short, always run them.
*/
async function runIntegrationTests() {
await runTests([
'integration/browserify',
'integration/firebase-typings',
'integration/typescript',
'integration/webpack'
]);
}

async function main() {
try {
await runIntegrationTests();
await runTestsOnChangedPackages();
} catch (e) {
console.error(e);
process.exit(1);
}
}

main();
2 changes: 1 addition & 1 deletion tools/gitHooks/license.js
Expand Up @@ -11,7 +11,7 @@ const root = resolve(__dirname, '../..');
const git = simpleGit(root);
const licenseHeader = `/**
* @license
* Copyright 2019 Google Inc.
* Copyright 2020 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down

0 comments on commit ee57d26

Please sign in to comment.