diff options
author | Samson <16504129+sagudev@users.noreply.github.com> | 2024-12-06 08:32:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-06 07:32:26 +0000 |
commit | faefed9869d3e2718cb33fa7e0e1f6443f81c814 (patch) | |
tree | 8719ac8ff30ea91492e64bb0c29a2db1441665d0 | |
parent | 61ca2dde2966bb5cca9f2e9bcd815cee4c409ee5 (diff) | |
download | servo-faefed9869d3e2718cb33fa7e0e1f6443f81c814.tar.gz servo-faefed9869d3e2718cb33fa7e0e1f6443f81c814.zip |
Add linux-pref job (#33261)
Job will do some performance benchmarks (Dromeo, Speedometer) and mesure binary size and will report results to bencher.dev
Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
Co-authored-by: DK Liao <dklassic@gmail.com>
-rw-r--r-- | .github/workflows/dispatch-workflow.yml | 4 | ||||
-rw-r--r-- | .github/workflows/linux-bencher.yml | 85 | ||||
-rw-r--r-- | .github/workflows/linux.yml | 15 | ||||
-rw-r--r-- | .github/workflows/main.yml | 1 | ||||
-rw-r--r-- | .github/workflows/try-label.yml | 1 | ||||
-rw-r--r-- | .github/workflows/try.yml | 4 | ||||
-rwxr-xr-x | etc/ci/bencher.py | 58 | ||||
-rw-r--r-- | python/servo/try_parser.py | 12 |
8 files changed, 180 insertions, 0 deletions
diff --git a/.github/workflows/dispatch-workflow.yml b/.github/workflows/dispatch-workflow.yml index d66ea68f94b..aa7c5e3a30f 100644 --- a/.github/workflows/dispatch-workflow.yml +++ b/.github/workflows/dispatch-workflow.yml @@ -17,6 +17,9 @@ on: unit-tests: required: true type: boolean + bencher: + required: true + type: boolean jobs: win: @@ -49,6 +52,7 @@ jobs: wpt-layout: ${{ inputs.wpt-layout }} unit-tests: ${{ inputs.unit-tests }} wpt-args: ${{ inputs.wpt-args }} + bencher: ${{ inputs.bencher }} lint: if: ${{ inputs.workflow == 'lint' }} diff --git a/.github/workflows/linux-bencher.yml b/.github/workflows/linux-bencher.yml new file mode 100644 index 00000000000..e7b98608bb9 --- /dev/null +++ b/.github/workflows/linux-bencher.yml @@ -0,0 +1,85 @@ +name: Linux WPT Tests +on: + workflow_call: + +permissions: + checks: write + pull-requests: write + +env: + RUST_BACKTRACE: 1 + SHELL: /bin/bash + # allows overriding bencher project for pushes + BENCHER_PROJECT: ${{ vars.BENCHER_PROJECT || 'servo' }} + +jobs: + linux-bencher: + name: Bencher + # keep this in sync with testbed + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + if: github.event_name != 'pull_request_target' + with: + fetch-depth: 0 + # This is necessary to checkout the pull request if this run was triggered via a + # `pull_request_target` event. + - uses: actions/checkout@v4 + if: github.event_name == 'pull_request_target' + with: + ref: refs/pull/${{ github.event.number }}/head + fetch-depth: 0 + - uses: actions/download-artifact@v4 + with: + name: release-binary-linux + path: release-binary-linux + - name: unPackage binary + run: tar -xzf release-binary-linux/target.tar.gz + - name: Bootstrap dependencies + run: | + python3 -m pip install --upgrade pip + sudo apt update + sudo apt install -qy --no-install-recommends mesa-vulkan-drivers + python3 ./mach bootstrap --skip-lints + - uses: bencherdev/bencher@main + - name: File size + run: ./etc/ci/bencher.py filesize target/release/servo --bmf-output size.json + - name: Speedometer + run: | + python3 ./mach test-speedometer -r --bmf-output speedometer.json + - name: Dromaeo + run: | + python3 ./mach test-dromaeo -r dom --bmf-output dromaeo.json + # set options + - name: Set bencher opts for PRs (label try run) + if: github.event_name == 'pull_request_target' + run: | + echo "RUN_BENCHER_OPTIONS=--branch ${{ github.event.number }}/PR \ + --branch-start-point ${{ github.base_ref }} \ + --branch-start-point-hash ${{ github.event.pull_request.base.sha }} \ + --branch-reset \ + --github-actions ${{ secrets.GITHUB_TOKEN }}" >> "$GITHUB_ENV" + - name: Set bencher opts for main + if: ${{ github.event_name == 'push' && github.ref_name == 'main' }} + run: | + echo "RUN_BENCHER_OPTIONS=--branch main \ + --github-actions ${{ secrets.GITHUB_TOKEN }}" >> "$GITHUB_ENV" + - name: Set bencher opts for try branch + if: ${{ github.event_name == 'push' && github.ref_name == 'try' }} + run: | + git remote add upstream https://github.com/servo/servo + git fetch upstream main + echo "RUN_BENCHER_OPTIONS=--branch try \ + --github-actions ${{ secrets.GITHUB_TOKEN }} \ + --hash $(git rev-parse HEAD~1) \ + --branch-start-point main \ + --branch-start-point-hash $(git merge-base upstream/main HEAD) \ + --branch-reset" >> "$GITHUB_ENV" + # we join results and send all data once to have it all in one report + - name: Send results + continue-on-error: true + run: | + ./etc/ci/bencher.py merge size.json speedometer.json dromaeo.json --bmf-output b.json + bencher run --adapter json --file b.json \ + --project ${{ env.BENCHER_PROJECT }} --token ${{ secrets.BENCHER_API_TOKEN }} --testbed ubuntu-22.04 \ + $RUN_BENCHER_OPTIONS diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 02ed12e9598..cfced0395c5 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -32,6 +32,10 @@ on: required: false type: boolean default: false + bencher: + required: false + default: false + type: boolean workflow_dispatch: inputs: profile: @@ -63,6 +67,10 @@ on: required: false type: boolean default: false + bencher: + required: false + default: false + type: boolean env: RUST_BACKTRACE: 1 @@ -219,3 +227,10 @@ jobs: wpt-sync-from-upstream: ${{ inputs.wpt-sync-from-upstream }} wpt-layout: "layout-2013" secrets: inherit + + bencher: + needs: ["build"] + # benches must be release (we will do benches for production profile in servo/servo-nightly-builds) + if: ${{ inputs.bencher && inputs.profile == 'release' && github.event_name != 'workflow_dispatch' && github.event_name != 'merge_queue' }} + uses: ./.github/workflows/linux-bencher.yml + secrets: inherit diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 6208d661354..83e09cd3977 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -54,6 +54,7 @@ jobs: profile: ${{ matrix.profile }} unit-tests: ${{ matrix.unit_tests }} wpt-args: ${{ matrix.wpt_args }} + bencher: ${{ matrix.bencher }} build-result: name: Result diff --git a/.github/workflows/try-label.yml b/.github/workflows/try-label.yml index 49000da8466..610aeb883c9 100644 --- a/.github/workflows/try-label.yml +++ b/.github/workflows/try-label.yml @@ -137,6 +137,7 @@ jobs: profile: ${{ matrix.profile }} unit-tests: ${{ matrix.unit_tests }} wpt-args: ${{ matrix.wpt_args }} + bencher: ${{ matrix.bencher }} results: name: Results diff --git a/.github/workflows/try.yml b/.github/workflows/try.yml index 8e1879dfc7b..ca81a8f91cd 100644 --- a/.github/workflows/try.yml +++ b/.github/workflows/try.yml @@ -21,6 +21,9 @@ on: unit-tests: required: false type: boolean + bencher: + required: false + type: boolean jobs: decision: @@ -104,6 +107,7 @@ jobs: profile: ${{ matrix.profile }} unit-tests: ${{ matrix.unit_tests }} wpt-args: ${{ matrix.wpt_args }} + bencher: ${{ matrix.bencher }} build-result: name: Result diff --git a/etc/ci/bencher.py b/etc/ci/bencher.py new file mode 100755 index 00000000000..e7da7e8f6f4 --- /dev/null +++ b/etc/ci/bencher.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +# Copyright 2024 The Servo Project Developers. See the COPYRIGHT +# file at the top-level directory of this distribution. +# +# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. + +import argparse +import json +import os + + +def size(args): + size = os.path.getsize(args.binary) + print(size) + with open(args.bmf_output, 'w', encoding='utf-8') as f: + json.dump({ + 'servo': { + 'file-size': { + 'value': float(size), + } + } + }, f, indent=4) + + +def merge(args): + output: dict[str, object] = dict() + for input_file in args.inputs: + with open(input_file, 'r', encoding='utf-8') as f: + data = json.load(f) + diff = set(data) & set(output) + if diff: + print("Duplicated keys:", diff) + output = data | output + + with open(args.bmf_output, 'w', encoding='utf-8') as f: + json.dump(output, f, indent=4) + + +parser = argparse.ArgumentParser("Helper commands for bencher") + +subparser = parser.add_subparsers() +size_parser = subparser.add_parser("filesize", help="Returns BMF for filesize") +size_parser.add_argument("binary", help="Servo binary file") +size_parser.add_argument("--bmf-output", help="BMF JSON output file", default=None) +size_parser.set_defaults(func=size) + +merge_parser = subparser.add_parser("merge", help="Merges BMF JSONs") +merge_parser.add_argument("--bmf-output", help="BMF JSON output file") +merge_parser.add_argument("inputs", help="BMF JSON files to merge", nargs="+") +merge_parser.set_defaults(func=merge) + +args = parser.parse_args() +args.func(args) diff --git a/python/servo/try_parser.py b/python/servo/try_parser.py index 026dc7b0873..a50d890af43 100644 --- a/python/servo/try_parser.py +++ b/python/servo/try_parser.py @@ -57,6 +57,7 @@ class JobConfig(object): wpt_layout: Layout = Layout.none profile: str = "release" unit_tests: bool = False + bencher: bool = False wpt_args: str = "" # These are the fields that must match in between two JobConfigs for them to be able to be # merged. If you modify any of the fields above, make sure to update this line as well. @@ -74,6 +75,7 @@ class JobConfig(object): # to join "Linux" and "Linux WPT" into "Linux WPT" if len(other.name) > len(self.name): self.name = other.name + self.bencher |= other.bencher return True @@ -82,6 +84,8 @@ def handle_preset(s: str) -> Optional[JobConfig]: if s == "linux": return JobConfig("Linux", Workflow.LINUX, unit_tests=True) + elif s in ["perf", "linux-perf", "bencher"]: + return JobConfig("Linux perf", Workflow.LINUX, bencher=True) elif s in ["mac", "macos"]: return JobConfig("MacOS", Workflow.MACOS, unit_tests=True) elif s in ["win", "windows"]: @@ -175,6 +179,7 @@ class TestParser(unittest.TestCase): self.assertDictEqual(json.loads(Config("linux fail-fast").to_json()), {'fail_fast': True, 'matrix': [{ + 'bencher': False, 'name': 'Linux', 'profile': 'release', 'unit_tests': True, @@ -188,6 +193,7 @@ class TestParser(unittest.TestCase): self.assertDictEqual(json.loads(Config("").to_json()), {"fail_fast": False, "matrix": [ { + 'bencher': False, "name": "Linux WPT", "workflow": "linux", "wpt_layout": "2020", @@ -196,6 +202,7 @@ class TestParser(unittest.TestCase): "wpt_args": "" }, { + 'bencher': False, "name": "MacOS", "workflow": "macos", "wpt_layout": "none", @@ -204,6 +211,7 @@ class TestParser(unittest.TestCase): "wpt_args": "" }, { + 'bencher': False, "name": "Windows", "workflow": "windows", "wpt_layout": "none", @@ -212,6 +220,7 @@ class TestParser(unittest.TestCase): "wpt_args": "" }, { + 'bencher': False, "name": "Android", "workflow": "android", "wpt_layout": "none", @@ -220,6 +229,7 @@ class TestParser(unittest.TestCase): "wpt_args": "" }, { + 'bencher': False, "name": "OpenHarmony", "workflow": "ohos", "wpt_layout": "none", @@ -228,6 +238,7 @@ class TestParser(unittest.TestCase): "wpt_args": "" }, { + 'bencher': False, "name": "Lint", "workflow": "lint", "wpt_layout": "none", @@ -240,6 +251,7 @@ class TestParser(unittest.TestCase): self.assertDictEqual(json.loads(Config("wpt-2020 wpt-2013").to_json()), {'fail_fast': False, 'matrix': [{ + 'bencher': False, 'name': 'Linux WPT', 'profile': 'release', 'unit_tests': False, |