PoC performance tests in CI (#2474)

* PoC performance tests in CI

* Add a naive measurement

* Change in spec descriptions

* More minimal reporter and 2 tests: 1 failing, 1 succeeding

* Fix circleci config

* Fix circleci part 2

* Make performance tests a workflow

* add npm install in performance tests

* change executor

* Experimenting: Install crossenv

* Experimenting

* More experimenting

* Revert some changes

* Run update_image and cache node modules

* Sandbox e2e tests run

* fix code residual from rebase

* Add GH action for ci perf

* Use ubuntu instead of macos

* Use windows instead of ubuntu

* Fix env set command

* Use post-test script to check performance

* Use macos-latest

* Throw error when tests fail

* Use measudePerformance function instead

* Use measudePerformance function instead

* Try to run e2e on github actions

* Try headless script

* Install linux packages

* Add shell

* Use if: runner..

* ADd sudo

* Add more linux packages

* Go back to macos

* Try recursive find for main window

* Remove performance tests from circleCi

* Increase retries

* Fix

* Revert "Fix"

This reverts commit c19fc56600ada4eee3e26bf3988b27d2ce2616d1.

* Revert "Increase retries"

This reverts commit 564ac95c34def892595c17b98eec245cacb0d4a4.

* Revert "Remove performance tests from circleCi"

This reverts commit c49c73b6f811df12631036bc33dae30da2271173.

* Revert "Try recursive find for main window"

This reverts commit 19d9367f9317f6e9d7ef9aa6a5d69eccdff2df67.

* Revert "Go back to macos"

This reverts commit 72b796ad983e89940f84d53039affd867d0e7f34.

* Revert "Add more linux packages"

This reverts commit 4bd510f8ea5356c13fbc4722be874aeea32de43e.

* Revert "ADd sudo"

This reverts commit acb95e02609e7cc02b12863910d29c03694936c1.

* Revert "Use if: runner.."

This reverts commit 69beed6fe24e452b1d7f0b0e4578bbfa9ca36d2f.

* Revert "Add shell"

This reverts commit e1743664a8b01797da4112314af0b88318ad2fd7.

* Revert "Install linux packages"

This reverts commit 25195dd11c827dff0fd8cf4fbdf2dc709377d525.

* Revert "Try headless script"

This reverts commit 385be5609d5ee45363d26828f6a14c6be0ef661a.

* Revert "Try to run e2e on github actions"

This reverts commit be8f682fd8a82b265403471b5106fd5107f9fecb.

* Revert "Use measudePerformance function instead"

This reverts commit bfd46768ae845e2839e9f124735922da6301fa4e.

* Revert "Use measudePerformance function instead"

This reverts commit ab4bc22b8689ff35260b4ab55724a77dc5993426.

* Update workflow command

* Remove circleci config for perf tests

* Run on ubuntu

* Add packages for linux

* Fix order of commands

* Move env var at the beginning

* Upload test results to s3

* Update name

* Update name

* Add trigger for flag

* Add step to upload artifact to github workflow artifacts

* Update yml

* Add step to comment the results in the PR

* Fix env bug

* move constant to workflow env

* Wrap workflow env with single quotes

* Add start comment and remove label steps

* Update body of comment

* Remove unused file

* Move PR comment function into file

* Fix import

* Remove spaces from line start

* Remove label even if workflow failed

* Add logging

* Fix markdown table data

* Remove trailing semi string

---------

Co-authored-by: Tasos Boulis <tboulis@hotmail.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
This commit is contained in:
Pantelis Vratsalis 2023-01-30 17:16:10 +02:00 committed by GitHub
parent bbb29a0d1b
commit 2bb622c314
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 255 additions and 13 deletions

View file

@ -608,7 +608,6 @@ workflows:
ignore:
- /^build-pr-.*/
- nightly
- build-win-no-installer:
filters:
branches:

93
.github/workflows/e2e-performance.yml vendored Normal file
View file

@ -0,0 +1,93 @@
name: E2E Performance Tests (Desktop)
on:
pull_request:
branches: [ master ]
types:
- labeled
env:
RESULTS_PATH: e2e/performance/perf-test-report.json
jobs:
build:
if: ${{ github.event.label.name == 'Run E2E Performance Tests' }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest]
node-version: [16]
steps:
- name: Add start comment
uses: actions/github-script@v6
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `E2E Performance Tests started 🏎️`,
});
- name: Set env variable for timestamp
run: echo "NOW=$(date +'%Y-%m-%dT%H:%M:%S')" >> $GITHUB_ENV
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install packages
run: sudo apt-get install libxtst-dev libpng++-dev
- name: Install dependencies 👨🏻‍💻
run: npm ci
- name: E2E Performance Tests for Electron 🧪
run: ELECTRON_DISABLE_SANDBOX=1 xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:e2e:performance
- name: Upload artifact to Github
uses: actions/upload-artifact@v3
with:
name: perf-test-report.json
path: ${{ env.RESULTS_PATH }}
if-no-files-found: error
retention-days: 14
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_PERFORMANCE_TESTS_PUT_BUCKET }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_PERFORMANCE_TESTS_PUT_BUCKET }}
aws-region: ${{ secrets.AWS_REGION_PERFORMANCE_TESTS_PUT_BUCKET }}
mask-aws-account-id: true
- name: Upload report to S3
run: aws s3 cp ${{ env.RESULTS_PATH }} s3://${{ secrets.AWS_BUCKET_PERFORMANCE_TESTS }}/${{ github.head_ref }}-${{ github.sha }}-${{ env.NOW }}.json
- name: Add results in PR comment
uses: actions/github-script@v6
with:
script: |
const fs = require('fs');
const {generateCommentBody} = require('./e2e/utils/pr-e2e-durations-report.js');
const fileContents = fs.readFileSync('${{ env.RESULTS_PATH }}');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: generateCommentBody(fileContents),
});
- name: Remove "Run E2E Performance Tests" label
if: always()
uses: actions-ecosystem/action-remove-labels@v1
with:
labels: |
Run E2E Performance Tests

1
.gitignore vendored
View file

@ -13,6 +13,7 @@ dist/
mochawesome-report/
test-results.xml
/e2e/performance/perf-test-report.json
test_config.json
.idea
testUserData

17
.vscode/launch.json vendored
View file

@ -49,6 +49,23 @@
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": "prepare-e2e"
},
{
"type": "node",
"request": "launch",
"name": "E2E Performance Tests",
"program": "${workspaceRoot}/node_modules/electron-mocha/bin/electron-mocha",
"args": [
"-r",
"@babel/register",
"--recursive",
"--timeout",
"999999",
"--colors",
"${workspaceRoot}/dist/tests/e2e_bundle.js"
],
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": "prepare-e2e-performance",
},
{
"type": "node",
"request": "launch",

View file

@ -24,6 +24,7 @@
"gsettings",
"ICONNAME",
"inputflash",
"libxtst",
"loadscreen",
"mailhost",
"mailserver",
@ -37,6 +38,7 @@
"officedocument",
"openxmlformats",
"presentationml",
"servernum",
"showunreadbadge",
"spreadsheetml",
"textbox",
@ -45,6 +47,7 @@
"Unreads",
"webcontents",
"wordprocessingml",
"xvfb",
"Yuya"
],
"i18n-ally.keystyle": "nested"

6
.vscode/tasks.json vendored
View file

@ -14,6 +14,12 @@
"type": "shell",
"command": "npm run build; npm run build-robotjs; npm run test:e2e:build",
"problemMatcher": []
},
{
"label": "prepare-e2e-performance",
"type": "shell",
"command": "cross-env NODE_ENV=test PERFORMANCE=true npm run build; npm run build-robotjs; npm run test:e2e:build-performance",
"problemMatcher": []
}
]
}

View file

@ -0,0 +1,29 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
'use strict';
const env = require('../modules/environment');
describe('startup/app', function desc() {
this.timeout(30000);
beforeEach(async () => {
env.createTestUserDataDir();
env.cleanTestConfig();
this.app = await env.getApp();
});
afterEach(async () => {
if (this.app) {
await this.app.close();
}
await env.clearElectronInstances();
});
it('should show the welcome screen modal when no servers exist', async () => {
const welcomeScreenModal = this.app.windows().find((window) => window.url().includes('welcomeScreen'));
const modalButton = await welcomeScreenModal.innerText('.WelcomeScreen .WelcomeScreen__button');
modalButton.should.equal('Get Started');
});
});

View file

@ -2,7 +2,9 @@
// See LICENSE.txt for license information.
const MOCHAWESOME_REPORT_DIR = './mochawesome-report';
const PERFORMANCE_REPORT_DIR = './e2e/performance';
module.exports = {
MOCHAWESOME_REPORT_DIR,
PERFORMANCE_REPORT_DIR,
};

View file

@ -0,0 +1,36 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
function generateCommentBody(fileContents) {
const data = JSON.parse(fileContents);
return `
E2E Performance Test results:
| Test | Duration |
| --- | --- |
${data?.passes?.reduce((acc, pass) => {
return `${acc}| ${pass.fullTitle || 'title'} | ${pass.duration}ms |\n`;
}, '')
}
${data?.failures?.length > 0 ? `
Some tests failed:
| Test | Duration |
| --- | --- |
${data.failures.forEach((failure) => `| ${failure.fullTitle} | ${failure.duration}`)}
` : ''}
<details>
<summary>Raw results</summary>
\`\`\`js
${fileContents}
\`\`\`
</details>
`;
}
module.exports = {
generateCommentBody,
};

View file

@ -42,8 +42,11 @@
"test": "npm-run-all lint:js test:unit test:e2e",
"test:docker": "node scripts/setup_e2e_docker.js",
"test:e2e": "cross-env NODE_ENV=test npm-run-all build build-robotjs test:e2e:build test:e2e:run",
"test:e2e:performance": "cross-env NODE_ENV=test PERFORMANCE=true npm-run-all build build-robotjs test:e2e:build-performance test:e2e:run-performance",
"test:e2e:nobuild": "cross-env NODE_ENV=test npm-run-all test:e2e:build test:e2e:run",
"test:e2e:build": "webpack-cli --config webpack.config.test.js",
"test:e2e:build-performance": "webpack-cli --config webpack.config.performance.test.js",
"test:e2e:run-performance": "electron-mocha -r @babel/register --reporter json --reporter-option output=./e2e/performance/perf-test-report.json dist/tests/e2e_bundle.js",
"test:e2e:run": "electron-mocha -r @babel/register --reporter mochawesome dist/tests/e2e_bundle.js",
"test:e2e:send-report": "node ./e2e/save_report.js",
"test:unit": "cross-env NODE_ENV=jest jest",

View file

@ -0,0 +1,53 @@
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
// This file uses CommonJS.
/* eslint-disable import/no-commonjs */
'use strict';
const path = require('path');
const glob = require('glob');
const {merge} = require('webpack-merge');
const base = require('./webpack.config.base');
const WEBSERVER_PORT = process.env.WEBSERVER_PORT ?? 9001;
module.exports = merge(base, {
entry: {
e2e: glob.sync('./e2e/performance/**/*.test.js'),
},
output: {
path: path.resolve(__dirname, 'dist/tests'),
filename: '[name]_bundle.js',
},
module: {
rules: [{
test: /\.(js|jsx|ts|tsx)?$/,
use: ['babel-loader', 'shebang-loader'],
}],
},
externals: {
fs: 'require("fs")',
ws: 'require("ws")',
child_process: 'require("child_process")',
dns: 'require("dns")',
http2: 'require("http2")',
net: 'require("net")',
repl: 'require("repl")',
tls: 'require("tls")',
playwright: 'require("playwright")',
robotjs: 'require("robotjs")',
},
node: {
__filename: false,
__dirname: false,
},
devServer: {
port: WEBSERVER_PORT,
},
target: 'electron-main',
});
/* eslint-enable import/no-commonjs */