diff --git a/tools/.gitignore b/tools/.gitignore index b56099f23..491476a82 100644 --- a/tools/.gitignore +++ b/tools/.gitignore @@ -28,12 +28,6 @@ state.sqlite-wal twistd.log* twistd.pid -# Output by buildbot into public_html: -bg_gradient.jpg -default.css -favicon.ico.new -robots.txt - # Chrome buildbot scripts /continuous_build/build @@ -51,6 +45,7 @@ robots.txt /continuous_build/build_internal/masters/master.webrtc/linux-valgrind /continuous_build/build_internal/masters/master.webrtc/mac-slave-2 /continuous_build/build_internal/masters/master.webrtc/mac-slave-3 +/continuous_build/build_internal/masters/master.webrtc/public_html /continuous_build/build_internal/masters/master.webrtc/win-32-dbg /continuous_build/build_internal/masters/master.webrtc/win-32-release /continuous_build/build_internal/masters/master.webrtc/video @@ -58,6 +53,7 @@ robots.txt /continuous_build/build_internal/masters/master.tryserver.webrtc/linux-trybot-2 /continuous_build/build_internal/masters/master.tryserver.webrtc/mac-trybot-1 /continuous_build/build_internal/masters/master.tryserver.webrtc/mac-trybot-2 +/continuous_build/build_internal/masters/master.tryserver.webrtc/public_html /continuous_build/build_internal/masters/master.tryserver.webrtc/win-trybot-1 /continuous_build/build_internal/masters/master.tryserver.webrtc/win-trybot-2 diff --git a/tools/continuous_build/build_internal/masters/master.webrtc/master.cfg b/tools/continuous_build/build_internal/masters/master.webrtc/master.cfg index 093c4f6f6..236f9a44b 100755 --- a/tools/continuous_build/build_internal/masters/master.webrtc/master.cfg +++ b/tools/continuous_build/build_internal/masters/master.webrtc/master.cfg @@ -7,7 +7,7 @@ # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. -__author__ = 'ivinnichenko@webrtc.org (Illya Vinnichenko)' +__author__ = 'kjellander@webrtc.org (Henrik Kjellander)' c = BuildmasterConfig = {} @@ -164,7 +164,18 @@ chromeos_factory.EnableBuild(chrome_os=True) chromeos_factory.EnableTests(linux_normal_tests) linux_chrome_factory = utils.WebRTCChromeFactory( - utils.BuildStatusOracle('linux_chrome')) + utils.BuildStatusOracle('linux_chrome'), + gclient_solution_name='src', + svn_url='http://src.chromium.org/svn/trunk/src', + custom_deps_list=[ + ('src/third_party/webrtc', + 'http://webrtc.googlecode.com/svn/stable/src'), + ('src/third_party/WebKit/LayoutTests', + None), + ('src/chrome/tools/test/reference_build', + None), + ], + safesync_url='http://chromium-status.appspot.com/lkgr') linux_chrome_factory.EnableBuild() linux_clang = utils.WebRTCLinuxFactory( @@ -173,7 +184,11 @@ linux_clang.EnableBuild(clang=True) linux_clang.EnableTests(linux_normal_tests) linux_valgrind = utils.WebRTCLinuxFactory( - utils.BuildStatusOracle('linux_valgrind'), valgrind_enabled=True) + utils.BuildStatusOracle('linux_valgrind'), valgrind_enabled=True, + custom_deps_list=[ + ('trunk/third_party/valgrind', + 'http://src.chromium.org/svn/trunk/deps/third_party/valgrind/binaries'), + ]) linux_valgrind.EnableBuild(release=True) # Filter out disabled Valgrind tests: valgrind_tests = filter(lambda test: test not in VALGRIND_DISABLED_TESTS, diff --git a/tools/continuous_build/build_internal/masters/master.webrtc/public_html/default.css b/tools/continuous_build/build_internal/masters/master.webrtc/public_html/default.css new file mode 100644 index 000000000..bc55d7ebf --- /dev/null +++ b/tools/continuous_build/build_internal/masters/master.webrtc/public_html/default.css @@ -0,0 +1,504 @@ +body { + margin-bottom:50px; +} + +body, td { + font-family: Verdana, Cursor; + font-size: 10px; + font-weight: bold; +} + +a:link,a:visited,a:active { + color: #444; +} + +a:hover { + color: #000000; +} + +table { + border-spacing: 1px 1px; +} + +table td { + padding: 3px 0px 3px 0px; + text-align: center; +} + +.closerbox { + border: 1px solid #aaa; + background-color: #eef; + border-radius: 8px; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; +} + +.closerbox table { + padding: 0 4px; +} + +.closerbox .title { + background-color: #ccc; + border-top-left-radius: 8px; + -webkit-border-top-left-radius: 8px; + -moz-border-top-left-radius: 8px; + border-top-right-radius: 8px; + -webkit-border-top-right-radius: 8px; + -moz-border-top-right-radius: 8px; + padding: 0 0 2px; +} + +.Project { + width: 100px; +} + +.LastBuild, .Activity { + padding: 0 0 0 4px; +} + +.LastBuild, .Activity, .Builder, .BuildStep { + width: 155px; + max-width: 155px; +} + +/* Chromium Specific styles */ +div.BuildResultInfo { + color: #444; +} + +div.Announcement { + margin-bottom: 1em; +} + +div.Announcement > a:hover { + color: black; +} + +div.Announcement > div.Notice { + background-color: #afdaff; + padding: 0.5em; + font-size: 16px; + text-align: center; +} + +div.Announcement > div.Open { + border: 3px solid #8fdf5f; + padding: 0.5em; + font-size: 16px; + text-align: center; +} + +div.Announcement > div.Closed { + border: 5px solid #e98080; + padding: 0.5em; + font-size: 24px; + font-weight: bold; + text-align: center; +} + +td.Time { + color: #000; + border-bottom: 1px solid #aaa; + background-color: #eee; +} + +td.Activity, td.Change, td.Builder { + color: #333333; + background-color: #CCCCCC; +} + +td.Change { + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; +} +td.Event { + color: #777; + background-color: #ddd; + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; +} + +td.Activity { + border-top-left-radius: 10px; + -webkit-border-top-left-radius: 10px; + -moz-border-radius-topleft: 10px; + min-height: 20px; + padding: 2px 0 2px 0; +} + +td.idle, td.waiting, td.offline, td.building { + border-top-left-radius: 0px; + -webkit-border-top-left-radius: 0px; + -moz-border-radius-topleft: 0px; +} + +.LastBuild { + border-top-left-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; + border-top-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topright: 5px; +} + +/* Console view styles */ + +td.DevRev { + padding: 4px 8px 4px 8px; + color: #333333; + border-top-left-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; + background-color: #eee; + width: 1%; +} + +td.DevRevCollapse { + border-bottom-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; +} + +td.DevName { + padding: 4px 8px 4px 8px; + color: #333333; + background-color: #eee; + width: 1%; + text-align: left; +} + +td.DevStatus { + padding: 4px 4px 4px 4px; + color: #333333; + background-color: #eee; +} + +td.DevSlave { + padding: 4px 4px 4px 4px; + color: #333333; + background-color: #eee; +} + +td.first { + border-top-left-radius: 5px; + -webkit-border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; +} + +td.last { + border-top-right-radius: 5px; + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topright: 5px; +} + +td.DevStatusCategory { + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-width:1px; + border-style:solid; +} + +td.DevStatusCollapse { + border-bottom-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-radius-bottomright: 5px; +} + +td.DevDetails { + font-weight: normal; + padding: 8px 8px 8px 8px; + color: #333333; + background-color: #eee; + text-align: left; +} + +td.DevComment { + font-weight: normal; + padding: 8px 8px 8px 8px; + color: #333333; + border-bottom-right-radius: 5px; + -webkit-border-bottom-right-radius: 5px; + -moz-border-radius-bottomright: 5px; + border-bottom-left-radius: 5px; + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; + background-color: #eee; + text-align: left; +} + +td.Alt { + background-color: #CCCCCC; +} + +.legend { + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + width: 100px; + max-width: 100px; + text-align:center; + padding: 2px 2px 2px 2px; + height:14px; + white-space:nowrap; +} + +.DevStatusBox { + text-align:center; + height:20px; + padding:0 2px; + line-height:0; + white-space:nowrap; +} + +.DevStatusBox a { + opacity: 0.85; + border-width:1px; + border-style:solid; + border-radius: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + display:block; + width:90%; + height:20px; + line-height:20px; + margin-left: auto; + margin-right: auto; +} + +.DevSlaveBox { + text-align:center; + height:10px; + padding:0 2px; + line-height:0; + white-space:nowrap; +} + +.DevSlaveBox a { + opacity: 0.85; + border-width:1px; + border-style:solid; + border-radius: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + display:block; + width:90%; + height:10px; + line-height:20px; + margin-left: auto; + margin-right: auto; +} + +a.noround { + border-radius: 0px; + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + position: relative; + margin-top: -8px; + margin-bottom: -8px; + height: 36px; + border-top-width: 0; + border-bottom-width: 0; +} + +a.begin { + border-top-width:1px; + position: relative; + margin-top: 0px; + margin-bottom: -7px; + height: 27px; + border-top-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-right-radius: 4px; + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +a.end { + border-bottom-width:1px; + position: relative; + margin-top: -7px; + margin-bottom: 0px; + height: 27px; + border-bottom-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.center_align { + text-align: center; +} + +.right_align { + text-align: right; +} + +.left_align { + text-align: left; +} + +div.BuildWaterfall { + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + position: absolute; + left: 0px; + top: 0px; + background-color: #FFFFFF; + padding: 4px 4px 4px 4px; + float: left; + display: none; + border-width: 1px; + border-style: solid; +} + +/* LastBuild, BuildStep states */ +.success { + color: #FFFFFF; + background-color: #8fdf5f; + border-color: #4F8530; +} + +.failure { + color: #FFFFFF; + background-color: #e98080; + border-color: #A77272; +} + +.warnings { + color: #FFFFFF; + background-color: #ffc343; + border-color: #C29D46; +} + +.never { + color: #FFFFFF; + background-color: #f0f0e0; + border-color: #A77272; +} + +.exception, .offline, .retry { + color: #FFFFFF; + background-color: #e0b0ff; + border-color: #ACA0B3; +} + +.start,.running, td.building { + color: #666666; + background-color: #fffc6c; + border-color: #C5C56D; +} + +.running_failure { + color: #FFFFFF; + background-color: #fffc6c; + border-color: #ff0000; +} + +.start { + border-bottom-left-radius: 10px; + -webkit-border-bottom-left-radius: 10px; + -moz-border-radius-bottomleft: 10px; + border-bottom-right-radius: 10px; + -webkit-border-bottom-right-radius: 10px; + -moz-border-radius-bottomright: 10px; +} + +.notstarted { + border-width:1px; + border-style:solid; + border-color:#aaa; +} + +.closed { + background-color: #ff0000; +} + +.closed .large { + font-size: 1.5em; + font-weight: bolder; +} + +td.Project a:hover, td.start a:hover { + color: #000; +} + +.mini-box { + text-align:center; + height:20px; + padding:0 2px; + line-height:0; + white-space:nowrap; +} + +.mini-box a { + border-radius: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + display:block; + width:100%; + height:20px; + line-height:20px; + margin-top:-30px; +} + +.mini-closed { + -box-sizing:border-box; + -webkit-box-sizing:border-box; + border:4px solid red; +} + +/* grid styles */ + +table.Grid { + border-collapse: collapse; +} + +table.Grid tr td { + padding: 0.2em; + margin: 0px; + text-align: center; +} + +table.Grid tr td.title { + font-size: 90%; + border-right: 1px gray solid; + border-bottom: 1px gray solid; +} + +table.Grid tr td.sourcestamp { + font-size: 90%; +} + +table.Grid tr td.builder { + text-align: right; + font-size: 90%; +} + +table.Grid tr td.build { + border: 1px gray solid; +} + +div.data { + font-family: "Courier New", courier, monotype; +} + +span.stdout, span.stderr, span.header { + font-family: "Courier New", courier, monotype; + font-size: 16px; + font-weight: normal; +} + +span.stderr { + color: red; +} + +span.header { + color: blue; +} diff --git a/tools/continuous_build/build_internal/scripts/webrtc_buildbot/utils.py b/tools/continuous_build/build_internal/scripts/webrtc_buildbot/utils.py index bcd5e0ede..e4687bbce 100755 --- a/tools/continuous_build/build_internal/scripts/webrtc_buildbot/utils.py +++ b/tools/continuous_build/build_internal/scripts/webrtc_buildbot/utils.py @@ -27,6 +27,7 @@ from master.factory import gclient_factory # dictionaries in master.cfg. SUPPORTED_PLATFORMS = ('Linux', 'Mac', 'Windows') +WEBRTC_SOLUTION_NAME = 'trunk' WEBRTC_SVN_LOCATION = 'http://webrtc.googlecode.com/svn/trunk' WEBRTC_TRUNK_DIR = 'build/trunk/' WEBRTC_BUILD_DIR = 'build/' @@ -76,7 +77,10 @@ class WebRTCFactory(factory.BuildFactory): can be overridden to create customized build sequences. """ - def __init__(self, build_status_oracle, is_try_slave=False): + def __init__(self, build_status_oracle, is_try_slave=False, + gclient_solution_name=WEBRTC_SOLUTION_NAME, + svn_url=WEBRTC_SVN_LOCATION, + custom_deps_list=None, safesync_url=None): """Creates the abstract factory. Args: @@ -84,6 +88,12 @@ class WebRTCFactory(factory.BuildFactory): keep track of our build state. is_try_slave: If this bot is a try slave. Needed since we're handling some things differently between normal slaves and try slaves. + gclient_solution_name: The name of the solution used for gclient. + svn_url: The Subversion URL for gclient to sync agains. + custom_deps_list: Content to be put in the custom_deps entry of the + .gclient file. The parameter must be a list of tuples with two + strings in each: path and remote URL. + safesync_url: If a LKGR URL shall be used for the gclient sync command. """ factory.BuildFactory.__init__(self) @@ -93,6 +103,11 @@ class WebRTCFactory(factory.BuildFactory): self.gyp_params = [] self.release = False self.path_joiner = PosixPathJoin + # For GClient solution definition: + self.gclient_solution_name = gclient_solution_name + self.svn_url = svn_url + self.custom_deps_list = custom_deps_list + self.safesync_url = safesync_url def EnableBuild(self): """Adds steps for building WebRTC [must be overridden]. @@ -206,12 +221,6 @@ class WebRTCFactory(factory.BuildFactory): """ self.AddCommonTestRunStep(test) - def AddGclientConfigStep(self): - """Helper method for adding a gclient config step.""" - self.AddCommonStep(['gclient', 'config', WEBRTC_SVN_LOCATION], - workdir=WEBRTC_BUILD_DIR, - descriptor='gclient_config') - def AddGclientSyncStep(self): """Helper method for invoking gclient sync.""" gclient_spec = self._ConfigureWhatToBuild() @@ -255,8 +264,9 @@ class WebRTCFactory(factory.BuildFactory): def _ConfigureWhatToBuild(self): """Returns a string with the contents of a .gclient file.""" - solution = gclient_factory.GClientSolution(name='trunk', - svn_url=WEBRTC_SVN_LOCATION) + solution = gclient_factory.GClientSolution(name=self.gclient_solution_name, + svn_url=self.svn_url, custom_deps_list=self.custom_deps_list, + safesync_url=self.safesync_url) return 'solutions = [ %s ]' % solution.GetSpec() def _GetEnvironmentWithDisabledDepotToolsUpdate(self): @@ -414,8 +424,11 @@ class GenerateCodeCoverage(ShellCommand): self.flunkOnFailure = False output_dir = os.path.join(coverage_dir, '%(buildername)s_%(buildnumber)s') - self.setCommand(['./tools/continuous_build/generate_coverage_html.sh', - coverage_file, WithProperties(output_dir)]) + generate_script = PosixPathJoin('tools', 'continuous_build', + 'build_internal', 'scripts', + 'generate_coverage_html.sh') + self.setCommand([generate_script, coverage_file, + WithProperties(output_dir)]) def createSummary(self, log): coverage_url = urlparse.urljoin(self.coverage_url, @@ -447,11 +460,9 @@ class WebRTCAndroidFactory(WebRTCFactory): cmd = 'svn checkout %s external/webrtc' % WEBRTC_SVN_LOCATION self.AddCommonStep(cmd, descriptor='svn (checkout)') - cmd = ('source build/envsetup.sh && lunch full_%s-eng ' % product) - self.AddCommonStep(cmd, descriptor='make_android') - - cmd = 'source build/envsetup.sh && mmm external/webrtc showcommands' - self.AddCommonStep(cmd, descriptor='make_webrtc') + cmd = ('source build/envsetup.sh && lunch full_%s-eng ' + '&& mmm external/webrtc showcommands' % product) + self.AddCommonStep(cmd, descriptor='build') class WebRTCAndroidNDKFactory(WebRTCFactory): @@ -462,19 +473,31 @@ class WebRTCAndroidNDKFactory(WebRTCFactory): def EnableBuild(self): self.AddSmartCleanStep() - self.AddGclientConfigStep() self.AddGclientSyncStep() - cmd = 'source ./build/android/envsetup.sh && gclient runhooks' - self.AddCommonStep(cmd, descriptor='gen_android_makefiles') - cmd = 'source ./build/android/envsetup.sh && make -j8' - self.AddCommonStep(cmd, descriptor='make') + self._AddAndroidStep(cmd='gclient runhooks', + descriptor='gen_android_makefiles') + self._AddAndroidStep(cmd='make -j100', descriptor='make') + def _AddAndroidStep(self, cmd, descriptor): + full_cmd = ('source build/android/buildbot_functions.sh &&' + 'bb_setup_environment && ' + 'source build/android/envsetup.sh &&' + '%s' % cmd) + self.AddCommonStep(cmd=full_cmd, descriptor=descriptor) class WebRTCChromeFactory(WebRTCFactory): """Sets up the Chrome OS build.""" - def __init__(self, build_status_oracle): - WebRTCFactory.__init__(self, build_status_oracle) + def __init__(self, build_status_oracle, + gclient_solution_name, + svn_url, + custom_deps_list=None, + safesync_url=None): + WebRTCFactory.__init__(self, build_status_oracle=build_status_oracle, + gclient_solution_name=gclient_solution_name, + svn_url=svn_url, + custom_deps_list=custom_deps_list, + safesync_url=safesync_url) def EnableBuild(self): self.AddCommonStep(['rm', '-rf', 'src'], workdir=WEBRTC_BUILD_DIR, @@ -498,9 +521,10 @@ class WebRTCLinuxFactory(WebRTCFactory): """ def __init__(self, build_status_oracle, is_try_slave=False, - valgrind_enabled=False): - WebRTCFactory.__init__(self, build_status_oracle, is_try_slave) - + valgrind_enabled=False, custom_deps_list=None): + WebRTCFactory.__init__(self, build_status_oracle=build_status_oracle, + is_try_slave=is_try_slave, + custom_deps_list=custom_deps_list) self.build_enabled = False self.coverage_enabled = False self.valgrind_enabled = valgrind_enabled @@ -538,8 +562,6 @@ class WebRTCLinuxFactory(WebRTCFactory): if self.valgrind_enabled: for gyp_define in MEMORY_TOOLS_GYP_DEFINES: self.gyp_params.append('-D' + gyp_define) - else: - self.AddGclientConfigStep() self.AddGclientSyncStep() if chrome_os: @@ -611,7 +633,9 @@ class WebRTCLinuxFactory(WebRTCFactory): # Delete all third-party .gcda files to save time and work around a bug # in lcov which tends to hang when capturing on libjpgturbo. - self.AddCommonStep(['./tools/continuous_build/clean_third_party_gcda.sh'], + clean_script = PosixPathJoin('tools', 'continuous_build', 'build_internal', + 'scripts', 'clean_third_party_gcda.sh') + self.AddCommonStep([clean_script], warn_on_failure=True, halt_build_on_failure=False, descriptor='LCOV (Delete 3rd party)') @@ -706,7 +730,6 @@ class WebRTCMacFactory(WebRTCFactory): else: self.build_type = build_type self.AddSmartCleanStep() - self.AddGclientConfigStep() self.AddGclientSyncStep() if self.build_type == 'make' or self.build_type == 'both': @@ -800,14 +823,13 @@ class WebRTCWinFactory(WebRTCFactory): # To avoid having to modify kill_processes.py, we set the working dir to # the build dir (three levels up from the build dir that contains # third_party/psutils). - kill_script = self.PathJoin(WEBRTC_BUILD_DIR, '..', '..', '..', 'scripts', - 'slave', 'kill_processes.py') + kill_script = WindowsPathJoin(WEBRTC_BUILD_DIR, '..', '..', '..', '..', + 'scripts', 'slave', 'kill_processes.py') cmd = 'python %s' % kill_script self.AddCommonStep(cmd, 'taskkill', workdir=WEBRTC_BUILD_DIR) # Now do the clean + build. self.AddSmartCleanStep() - self.AddGclientConfigStep() self.AddGclientSyncStep() if self.configuration == 'Debug' or self.configuration == 'both':