diff options
Diffstat (limited to 'scripts/oe-build-perf-test')
| -rwxr-xr-x | scripts/oe-build-perf-test | 118 |
1 files changed, 114 insertions, 4 deletions
diff --git a/scripts/oe-build-perf-test b/scripts/oe-build-perf-test index 4ec9f1403e..fc4ab3135d 100755 --- a/scripts/oe-build-perf-test +++ b/scripts/oe-build-perf-test | |||
| @@ -17,8 +17,10 @@ | |||
| 17 | import argparse | 17 | import argparse |
| 18 | import errno | 18 | import errno |
| 19 | import fcntl | 19 | import fcntl |
| 20 | import json | ||
| 20 | import logging | 21 | import logging |
| 21 | import os | 22 | import os |
| 23 | import re | ||
| 22 | import shutil | 24 | import shutil |
| 23 | import sys | 25 | import sys |
| 24 | import unittest | 26 | import unittest |
| @@ -27,11 +29,13 @@ from datetime import datetime | |||
| 27 | sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '/lib') | 29 | sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '/lib') |
| 28 | import scriptpath | 30 | import scriptpath |
| 29 | scriptpath.add_oe_lib_path() | 31 | scriptpath.add_oe_lib_path() |
| 32 | scriptpath.add_bitbake_lib_path() | ||
| 30 | import oeqa.buildperf | 33 | import oeqa.buildperf |
| 31 | from oeqa.buildperf import (BuildPerfTestLoader, BuildPerfTestResult, | 34 | from oeqa.buildperf import (BuildPerfTestLoader, BuildPerfTestResult, |
| 32 | BuildPerfTestRunner, KernelDropCaches) | 35 | BuildPerfTestRunner, KernelDropCaches) |
| 33 | from oeqa.utils.commands import runCmd | 36 | from oeqa.utils.commands import runCmd |
| 34 | from oeqa.utils.git import GitRepo, GitError | 37 | from oeqa.utils.git import GitRepo, GitError |
| 38 | from oeqa.utils.metadata import metadata_from_bb, write_metadata_file | ||
| 35 | 39 | ||
| 36 | 40 | ||
| 37 | # Set-up logging | 41 | # Set-up logging |
| @@ -115,6 +119,100 @@ def archive_build_conf(out_dir): | |||
| 115 | shutil.copytree(src_dir, tgt_dir) | 119 | shutil.copytree(src_dir, tgt_dir) |
| 116 | 120 | ||
| 117 | 121 | ||
| 122 | def git_commit_results(repo_dir, results_dir, branch, tag, metadata): | ||
| 123 | """Commit results into a Git repository""" | ||
| 124 | repo = GitRepo(repo_dir, is_topdir=True) | ||
| 125 | distro_branch = metadata['layers']['meta']['branch'] | ||
| 126 | distro_commit = metadata['layers']['meta']['commit'] | ||
| 127 | distro_commit_count = metadata['layers']['meta']['commit_count'] | ||
| 128 | |||
| 129 | # Replace keywords | ||
| 130 | branch = branch.format(git_branch=distro_branch, | ||
| 131 | tester_host=metadata['hostname']) | ||
| 132 | |||
| 133 | log.info("Committing test results into %s %s", repo_dir, branch) | ||
| 134 | tmp_index = os.path.join(repo_dir, '.git', 'index.oe-build-perf') | ||
| 135 | try: | ||
| 136 | # Create new commit object from the new results | ||
| 137 | env_update = {'GIT_INDEX_FILE': tmp_index, | ||
| 138 | 'GIT_WORK_TREE': results_dir} | ||
| 139 | repo.run_cmd('add .', env_update) | ||
| 140 | tree = repo.run_cmd('write-tree', env_update) | ||
| 141 | parent = repo.rev_parse(branch) | ||
| 142 | msg = "Results of {}:{}\n".format(distro_branch, distro_commit) | ||
| 143 | git_cmd = ['commit-tree', tree, '-m', msg] | ||
| 144 | if parent: | ||
| 145 | git_cmd += ['-p', parent] | ||
| 146 | commit = repo.run_cmd(git_cmd, env_update) | ||
| 147 | |||
| 148 | # Update branch head | ||
| 149 | git_cmd = ['update-ref', 'refs/heads/' + branch, commit] | ||
| 150 | if parent: | ||
| 151 | git_cmd.append(parent) | ||
| 152 | repo.run_cmd(git_cmd) | ||
| 153 | |||
| 154 | # Update current HEAD, if we're on branch 'branch' | ||
| 155 | if repo.get_current_branch() == branch: | ||
| 156 | log.info("Updating %s HEAD to latest commit", repo_dir) | ||
| 157 | repo.run_cmd('reset --hard') | ||
| 158 | |||
| 159 | # Create (annotated) tag | ||
| 160 | if tag: | ||
| 161 | # Find tags matching the pattern | ||
| 162 | tag_keywords = dict(git_branch=distro_branch, | ||
| 163 | git_commit=distro_commit, | ||
| 164 | git_commit_count=distro_commit_count, | ||
| 165 | tester_host=metadata['hostname'], | ||
| 166 | tag_num='[0-9]{1,5}') | ||
| 167 | tag_re = re.compile(tag.format(**tag_keywords) + '$') | ||
| 168 | tag_keywords['tag_num'] = 0 | ||
| 169 | for existing_tag in repo.run_cmd('tag').splitlines(): | ||
| 170 | if tag_re.match(existing_tag): | ||
| 171 | tag_keywords['tag_num'] += 1 | ||
| 172 | |||
| 173 | tag = tag.format(**tag_keywords) | ||
| 174 | msg = "Test run #{} of {}:{}\n".format(tag_keywords['tag_num'], | ||
| 175 | distro_branch, | ||
| 176 | distro_commit) | ||
| 177 | repo.run_cmd(['tag', '-a', '-m', msg, tag, commit]) | ||
| 178 | |||
| 179 | finally: | ||
| 180 | if os.path.exists(tmp_index): | ||
| 181 | os.unlink(tmp_index) | ||
| 182 | |||
| 183 | |||
| 184 | def update_globalres_file(result_obj, filename, metadata): | ||
| 185 | """Write results to globalres csv file""" | ||
| 186 | # Map test names to time and size columns in globalres | ||
| 187 | # The tuples represent index and length of times and sizes | ||
| 188 | # respectively | ||
| 189 | gr_map = {'test1': ((0, 1), (8, 1)), | ||
| 190 | 'test12': ((1, 1), (None, None)), | ||
| 191 | 'test13': ((2, 1), (9, 1)), | ||
| 192 | 'test2': ((3, 1), (None, None)), | ||
| 193 | 'test3': ((4, 3), (None, None)), | ||
| 194 | 'test4': ((7, 1), (10, 2))} | ||
| 195 | |||
| 196 | values = ['0'] * 12 | ||
| 197 | for status, test, _ in result_obj.all_results(): | ||
| 198 | if status in ['ERROR', 'SKIPPED']: | ||
| 199 | continue | ||
| 200 | (t_ind, t_len), (s_ind, s_len) = gr_map[test.name] | ||
| 201 | if t_ind is not None: | ||
| 202 | values[t_ind:t_ind + t_len] = test.times | ||
| 203 | if s_ind is not None: | ||
| 204 | values[s_ind:s_ind + s_len] = test.sizes | ||
| 205 | |||
| 206 | log.debug("Writing globalres log to %s", filename) | ||
| 207 | rev_info = metadata['layers']['meta'] | ||
| 208 | with open(filename, 'a') as fobj: | ||
| 209 | fobj.write('{},{}:{},{},'.format(metadata['hostname'], | ||
| 210 | rev_info['branch'], | ||
| 211 | rev_info['commit'], | ||
| 212 | rev_info['commit'])) | ||
| 213 | fobj.write(','.join(values) + '\n') | ||
| 214 | |||
| 215 | |||
| 118 | def parse_args(argv): | 216 | def parse_args(argv): |
| 119 | """Parse command line arguments""" | 217 | """Parse command line arguments""" |
| 120 | parser = argparse.ArgumentParser( | 218 | parser = argparse.ArgumentParser( |
| @@ -183,7 +281,19 @@ def main(argv=None): | |||
| 183 | else: | 281 | else: |
| 184 | suite = loader.loadTestsFromModule(oeqa.buildperf) | 282 | suite = loader.loadTestsFromModule(oeqa.buildperf) |
| 185 | 283 | ||
| 284 | # Save test metadata | ||
| 285 | metadata = metadata_from_bb() | ||
| 286 | log.info("Testing Git revision branch:commit %s:%s (%s)", | ||
| 287 | metadata['layers']['meta']['branch'], | ||
| 288 | metadata['layers']['meta']['commit'], | ||
| 289 | metadata['layers']['meta']['commit_count']) | ||
| 290 | if args.xml: | ||
| 291 | write_metadata_file(os.path.join(out_dir, 'metadata.xml'), metadata) | ||
| 292 | else: | ||
| 293 | with open(os.path.join(out_dir, 'metadata.json'), 'w') as fobj: | ||
| 294 | json.dump(metadata, fobj, indent=2) | ||
| 186 | archive_build_conf(out_dir) | 295 | archive_build_conf(out_dir) |
| 296 | |||
| 187 | runner = BuildPerfTestRunner(out_dir, verbosity=2) | 297 | runner = BuildPerfTestRunner(out_dir, verbosity=2) |
| 188 | 298 | ||
| 189 | # Suppress logger output to stderr so that the output from unittest | 299 | # Suppress logger output to stderr so that the output from unittest |
| @@ -201,11 +311,11 @@ def main(argv=None): | |||
| 201 | else: | 311 | else: |
| 202 | result.write_results_json() | 312 | result.write_results_json() |
| 203 | if args.globalres_file: | 313 | if args.globalres_file: |
| 204 | result.update_globalres_file(args.globalres_file) | 314 | update_globalres_file(result, args.globalres_file, metadata) |
| 205 | if args.commit_results: | 315 | if args.commit_results: |
| 206 | result.git_commit_results(args.commit_results, | 316 | git_commit_results(args.commit_results, out_dir, |
| 207 | args.commit_results_branch, | 317 | args.commit_results_branch, args.commit_results_tag, |
| 208 | args.commit_results_tag) | 318 | metadata) |
| 209 | if result.wasSuccessful(): | 319 | if result.wasSuccessful(): |
| 210 | return 0 | 320 | return 0 |
| 211 | 321 | ||
