Index: bin/cbuildbot.py |
diff --git a/bin/cbuildbot.py b/bin/cbuildbot.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..6eabcb954abd1fa45888ade12f7bb4deec524072 |
--- /dev/null |
+++ b/bin/cbuildbot.py |
@@ -0,0 +1,140 @@ |
+#!/usr/bin/python |
+ |
+import errno |
+import optparse |
+import os |
+import shutil |
+import subprocess |
+ |
+from cbuildbot_config import config |
+ |
+# Utility functions |
+ |
+def RunCommand(cmd, error_ok=False, error_message=None, exit_code=False, |
+ redirect_stdout=False, redirect_stderr=False, cwd=None, |
+ input=None): |
+ # Useful for debugging: |
+ # print >>sys.stderr, "RunCommand:", ' '.join(cmd) |
+ if redirect_stdout: |
+ stdout = subprocess.PIPE |
+ else: |
+ stdout = None |
+ if redirect_stderr: |
+ stderr = subprocess.PIPE |
+ else: |
+ stderr = None |
+ if input: |
+ stdin = subprocess.PIPE |
+ else: |
+ stdin = None |
+ proc = subprocess.Popen(cmd, cwd=cwd, stdin=stdin, |
+ stdout=stdout, stderr=stderr) |
+ (output, error) = proc.communicate(input) |
+ if exit_code: |
+ return proc.returncode |
+ if not error_ok and proc.returncode != 0: |
+ raise Exception('Command "%s" failed.\n' % (' '.join(cmd)) + |
+ (error_message or error or output or '')) |
+ return output |
+ |
+def MakeDir(path, parents=False): |
+ try: |
+ os.makedirs(path) |
+ except OSError,e: |
+ if e.errno == errno.EEXIST and parents: |
+ pass |
+ else: |
+ raise |
+ |
+# Main functions |
+ |
+def _FullCheckout(buildroot): |
+ MakeDir(buildroot, parents=True) |
+ RunCommand(['repo', 'init', '-u', 'http://src.chromium.org/git/manifest'], |
+ cwd=buildroot, input='\n\ny\n') |
+ RunCommand(['repo', 'sync'], cwd=buildroot) |
+ RunCommand(['repo', 'forall', '-c', 'git', 'config', |
+ 'url.ssh://gitrw.chromium.org.pushinsteadof', |
+ 'http://src.chromium.org/git'], cwd=buildroot) |
+ |
+def _IncrementalCheckout(buildroot): |
+ RunCommand(['repo', 'sync'], cwd=buildroot) |
+ |
+def _MakeChroot(buildroot): |
+ cwd = os.path.join(buildroot, 'src', 'scripts') |
+ RunCommand(['./make_chroot', '--fast'], cwd=cwd) |
+ |
+def _SetupBoard(buildroot, board='x86-generic'): |
+ cwd = os.path.join(buildroot, 'src', 'scripts') |
+ RunCommand(['./setup_board', '--fast', '--default', '--board=%s' % board], |
+ cwd=cwd) |
+ |
+def _Build(buildroot): |
+ cwd = os.path.join(buildroot, 'src', 'scripts') |
+ RunCommand(['./build_packages'], cwd=cwd) |
+ |
+def _UprevPackages(buildroot): |
+ cwd = os.path.join(buildroot, 'src', 'scripts') |
+ RunCommand(['./enter_chroot.sh', '--', './cros_mark_all_as_stable', |
+ '--tracking_branch="cros/master"'], |
+ cwd=cwd) |
+ |
+def _UprevCleanup(buildroot): |
+ cwd = os.path.join(buildroot, 'src', 'scripts') |
+ RunCommand(['./cros_mark_as_stable', '--srcroot=..', |
+ '--tracking_branch="cros/master"', 'clean'], |
+ cwd=cwd) |
+ |
+def _UprevPush(buildroot): |
+ cwd = os.path.join(buildroot, 'src', 'scripts') |
+ RunCommand(['./cros_mark_as_stable', '--srcroot=..', |
+ '--tracking_branch="cros/master"', |
+ '--push_options', '--bypass-hooks -f', 'push'], |
+ cwd=cwd) |
+ |
+def _GetConfig(config_name): |
+ default = config['default'] |
+ buildconfig = {} |
+ if config.has_key(config_name): |
+ buildconfig = config[config_name] |
+ for key in default.iterkeys(): |
+ if not buildconfig.has_key(key): |
+ buildconfig[key] = default[key] |
+ return buildconfig |
+ |
+def main(): |
+ # Parse options |
+ parser = optparse.OptionParser() |
+ parser.add_option('-r', '--buildroot', |
+ help='root directory where build occurs', default=".") |
+ parser.add_option('-n', '--buildnumber', |
+ help='build number', type='int', default=0) |
+ (options, args) = parser.parse_args() |
+ |
+ buildroot = options.buildroot |
+ buildconfig = _GetConfig(args[0]) |
+ |
+ try: |
+ if not os.path.isdir(buildroot): |
+ _FullCheckout(buildroot) |
+ else: |
+ _IncrementalCheckout(buildroot) |
+ chroot_path = os.path.join(buildroot, 'chroot') |
+ if not os.path.isdir(chroot_path): |
+ _MakeChroot(buildroot) |
+ boardpath = os.path.join(chroot_path, 'build', buildconfig['board']) |
+ if not os.path.isdir(boardpath): |
+ _SetupBoard(buildroot, board=buildconfig['board']) |
+ if buildconfig['uprev']: |
+ _UprevPackages(buildroot) |
+ _Build(buildroot) |
+ if buildconfig['uprev']: |
+ _UprevPush(buildroot) |
+ _UprevCleanup(buildroot) |
+ except: |
+ # something went wrong, cleanup (being paranoid) for next build |
+ RunCommand(['sudo', 'rm', '-rf', buildroot]) |
+ raise |
+ |
+if __name__ == '__main__': |
+ main() |