From 65d19102957369bba13112d86f33da8d79f9383f Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Wed, 14 Mar 2018 11:22:50 -0700 Subject: [PATCH 1/3] Add Status Tracking Jobs --- perf.groovy | 52 ++++++++++++ scripts/getjenkinsstatus.py | 160 ++++++++++++++++++++++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 perf.groovy create mode 100644 scripts/getjenkinsstatus.py diff --git a/perf.groovy b/perf.groovy new file mode 100644 index 00000000000..70dcf132296 --- /dev/null +++ b/perf.groovy @@ -0,0 +1,52 @@ +// Import the utility functionality. + +import jobs.generation.*; + +def project = GithubProject +def branch = GithubBranchName +def projectName = Utilities.getFolderName(project) +def projectFolder = projectName + '/' + Utilities.getFolderName(branch) + +['Windows', 'Linux'].each { os -> + ['perf','illink','rwc','throughput'].each { jobType -> + def jobName = "perf_monitoring_coreclr_${os}_${jobType}" + + def newJob = job(Utilities.getFullJobName(project, jobName, false)) { + steps { + batchFile("py scripts\\getjenkinsstatus.py -repo coreclr -os ${os} -jobType ${jobType}") + } + + Utilities.setMachineAffinity(newJob, "Windows_NT", '20170427-elevated') + Utilities.standardJobSetup(newJob, project, false, "*/${branch}") + + Utilities.addPeriodicTrigger(newJob, "@hourly", true /*always run*/) + newJob.with { + wrappers { + timeout { + absolute(240) + } + } + } + } + } + + def jobName = "performance_monitoring_corefx_${os}" + def newJob = job(Utilities.getFullJobName(project, jobName, false)) { + steps { + batchFile("py scripts\\getjenkinsstatus.py -repo corefx -os ${os}") + } + + Utilities.setMachineAffinity(newJob, "Windows_NT", '20170427-elevated') + Utilities.standardJobSetup(newJob, project, false, "*/${branch}") + + Utilities.addPeriodicTrigger(newJob, "@hourly", true /*always run*/) + newJob.with { + wrappers { + timeout { + absolute(240) + } + } + } + } +} + diff --git a/scripts/getjenkinsstatus.py b/scripts/getjenkinsstatus.py new file mode 100644 index 00000000000..5c8a1899499 --- /dev/null +++ b/scripts/getjenkinsstatus.py @@ -0,0 +1,160 @@ +import urllib.request +import sys +import subprocess +import argparse + +########################################################################## +# Argument Parser +########################################################################## + +description = 'Tool to get job status' + +parser = argparse.ArgumentParser(description=description) + +parser.add_argument('-os', dest='operatingSystem', default='Windows', choices=['Windows', 'Linux']) +parser.add_argument('-jobType', dest='jobType', default='all', choices=['all','perf','illink','scenarios','throughput']) +parser.add_argument('-arch', dest='arch', default='all', choices=['all','x86','x64']) +parser.add_argument('-repo', dest='repo', default='', choices=['coreclr','corefx']) + +def parseStatusPage(url, job): + source = 'test.txt' + p = subprocess.Popen("powershell [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; [io.file]::WriteAllText(\\\"{}\\\", (Invoke-WebRequest -Uri {}).content)".format(source, url), shell=True) + p.communicate() + + failing = False + passing = False + running = False + aborted = False + + status = "" + + f = open(source, "r") + + for line in f.readlines(): + if "failing" in line: + status = "failing" + failing = True + if "passing" in line: + status = "passing" + passing = True + if "running" in line: + status = "running" + running = True + if "aborted" in line: + status = "aborted" + aborted = True + + print("{}: {}".format(job, status)) + return failing or aborted + +def main(args): + operatingSystem = args.operatingSystem + jobType = args.jobType + arch = args.arch + repo = args.repo + + if operatingSystem == 'Linux': + if not (jobType == 'all' or jobType == 'perf' or jobType == 'throughput'): + raise ValueError('Linux only has perf and throughput jobs. JobType %s is invalid.', jobType) + if not (arch == 'all' or arch == 'x64'): + raise ValueError('Linux only supports x64. Arch %s is invalid.', arch) + + urlPrefix = "https://ci2.dot.net/job/" + urlJobPath = "/job/perf/job/master/job/" + urlSuffix = "/lastCompletedBuild/badge/icon" + + coreclrJobs = { + 'Windows' : { + 'illink' : { + 'x64' : [ + 'perf_illink_Windows_NT_x64_full_opt_ryujit' + ] + }, + 'perf' : { + 'x64' : [ + 'perf_perflab_Windows_NT_x64_full_opt_ryujit', + 'perf_perflab_Windows_NT_x64_min_opt_ryujit' + ], + 'x86' : [ + 'perf_perflab_Windows_NT_x86_full_opt_ryujit', + 'perf_perflab_Windows_NT_x86_min_opt_ryujit' + ] + }, + 'scenarios' : { + 'x64' : [ + 'perf_illink_Windows_NT_x64_full_opt_ryujit' + 'perf_scenarios_Windows_NT_x64_full_opt_ryujit', + 'perf_scenarios_Windows_NT_x64_min_opt_ryujit', + 'perf_scenarios_Windows_NT_x64_tiered_ryujit' + ], + 'x86' : [ + 'perf_scenarios_Windows_NT_x86_full_opt_ryujit', + 'perf_scenarios_Windows_NT_x86_min_opt_ryujit', + 'perf_scenarios_Windows_NT_x86_tiered_ryujit' + ] + }, + 'throughput' : { + 'x64' : [ + 'perf_throughput_perflab_Windows_NT_x64_full_opt_ryujit_nopgo', + 'perf_throughput_perflab_Windows_NT_x64_full_opt_ryujit_pgo', + 'perf_throughput_perflab_Windows_NT_x64_min_opt_ryujit_nopgo', + 'perf_throughput_perflab_Windows_NT_x64_min_opt_ryujit_pgo' + ], + 'x86' : [ + 'perf_throughput_perflab_Windows_NT_x86_full_opt_ryujit_nopgo', + 'perf_throughput_perflab_Windows_NT_x86_full_opt_ryujit_pgo', + 'perf_throughput_perflab_Windows_NT_x86_min_opt_ryujit_nopgo', + 'perf_throughput_perflab_Windows_NT_x86_min_opt_ryujit_pgo' + ] + } + }, + 'Linux' : { + 'perf' : { + 'x64': [ + 'perf_linux_flow' + ] + }, + 'throughput' : { + 'x64': [ + 'perf_throughput_linux_flow' + ] + } + } + } + + corefxJobs = { + 'Windows' : [ 'perf_windows_nt_release'], + 'Linux' : ['perf_ubuntu16.04_release'] + } + + overallStatus = "passing" + + + if repo == 'coreclr' or repo == '': + urlRepo = 'dotnet_coreclr' + for jobChoice in coreclrJobs[operatingSystem]: + if jobChoice == jobType or jobType == 'all': + for archChoice in coreclrJobs[operatingSystem][jobChoice]: + if archChoice == arch or arch == 'all': + for job in coreclrJobs[operatingSystem][jobChoice][archChoice]: + url = urlPrefix + urlRepo + urlJobPath + job + urlSuffix + + if parseStatusPage(url, job): + overallStatus = 'failing' + if repo == 'corefx' or repo == '': + urlRepo = 'dotnet_corefx' + for job in corefxJobs[operatingSystem]: + url = urlPrefix + urlRepo + urlJobPath + job + urlSuffix + + if parseStatusPage(url, job): + overallStatus = 'failing' + + + print(overallStatus) + if overallStatus == 'failing': + return -1 + return 0 + +if __name__ == "__main__": + Args = parser.parse_args(sys.argv[1:]) + sys.exit(main(Args)) From 3382f30235bdc3c7cb3520e59b1139f9f6f24eb6 Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Wed, 14 Mar 2018 11:29:36 -0700 Subject: [PATCH 2/3] fix --- scripts/getjenkinsstatus.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/scripts/getjenkinsstatus.py b/scripts/getjenkinsstatus.py index 5c8a1899499..871fcd04f30 100644 --- a/scripts/getjenkinsstatus.py +++ b/scripts/getjenkinsstatus.py @@ -12,7 +12,7 @@ parser = argparse.ArgumentParser(description=description) parser.add_argument('-os', dest='operatingSystem', default='Windows', choices=['Windows', 'Linux']) -parser.add_argument('-jobType', dest='jobType', default='all', choices=['all','perf','illink','scenarios','throughput']) +parser.add_argument('-jobType', dest='jobType', default='all', choices=['all','perf','size','rwc','throughput']) parser.add_argument('-arch', dest='arch', default='all', choices=['all','x86','x64']) parser.add_argument('-repo', dest='repo', default='', choices=['coreclr','corefx']) @@ -65,9 +65,13 @@ def main(args): coreclrJobs = { 'Windows' : { - 'illink' : { + 'size' : { 'x64' : [ - 'perf_illink_Windows_NT_x64_full_opt_ryujit' + 'perf_illink_Windows_NT_x64_full_opt_ryujit', + 'sizeondisk_x64' + ], + 'x86' : [ + 'sizeondisk_x86' ] }, 'perf' : { @@ -129,7 +133,6 @@ def main(args): overallStatus = "passing" - if repo == 'coreclr' or repo == '': urlRepo = 'dotnet_coreclr' for jobChoice in coreclrJobs[operatingSystem]: @@ -150,7 +153,7 @@ def main(args): overallStatus = 'failing' - print(overallStatus) + print('%s %s %s %s jobs are %s' % (repo, operatingSystem, arch, jobType, overallStatus)) if overallStatus == 'failing': return -1 return 0 From cb7f8a15c1b5dfb11e70eed1ef850256e35872a5 Mon Sep 17 00:00:00 2001 From: Michelle McDaniel Date: Thu, 15 Mar 2018 09:33:41 -0700 Subject: [PATCH 3/3] Make getjenkinsstatus executable --- scripts/getjenkinsstatus.py | 2 ++ 1 file changed, 2 insertions(+) mode change 100644 => 100755 scripts/getjenkinsstatus.py diff --git a/scripts/getjenkinsstatus.py b/scripts/getjenkinsstatus.py old mode 100644 new mode 100755 index 871fcd04f30..ae4b0457eb8 --- a/scripts/getjenkinsstatus.py +++ b/scripts/getjenkinsstatus.py @@ -1,3 +1,5 @@ +#!/usr/bin/env python3 + import urllib.request import sys import subprocess