OLD | NEW |
| (Empty) |
1 #!/usr/bin/python | |
2 # Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
3 # for details. All rights reserved. Use of this source code is governed by a | |
4 # BSD-style license that can be found in the LICENSE file. | |
5 | |
6 import os | |
7 import re | |
8 import sys | |
9 | |
10 import bot | |
11 | |
12 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) | |
13 sys.path.append(os.path.join(SCRIPT_DIR, '..')) | |
14 import utils | |
15 | |
16 | |
17 GSUTIL = utils.GetBuildbotGSUtilPath() | |
18 GCS_DARTIUM_BUCKET = "gs://dartium-archive/continuous" | |
19 GCS_EDITOR_BUCKET = "gs://continuous-editor-archive" | |
20 | |
21 def GetBuildDirectory(mode, arch): | |
22 configuration_dir = mode + arch.upper() | |
23 build_directory_dict = { | |
24 'linux2' : os.path.join('out', configuration_dir), | |
25 'darwin' : os.path.join('xcodebuild', configuration_dir), | |
26 'win32' : os.path.join('build', configuration_dir), | |
27 } | |
28 if sys.platform == 'darwin': | |
29 # TODO(kustermann,ricow): Maybe we're able to get rid of this in the future. | |
30 # We use ninja on bots which use out/ (i.e. what linux2 does) instead of | |
31 # xcodebuild/ | |
32 if (os.path.exists(build_directory_dict['linux2']) and | |
33 os.path.isdir(build_directory_dict['linux2'])): | |
34 return build_directory_dict['linux2'] | |
35 return build_directory_dict[sys.platform] | |
36 | |
37 def GetEditorDirectory(mode, arch): | |
38 return os.path.join(GetBuildDirectory(mode, arch), 'editor') | |
39 | |
40 def GetDartSdkDirectory(mode, arch): | |
41 return os.path.join(GetBuildDirectory(mode, arch), 'dart-sdk') | |
42 | |
43 def GetEditorExecutable(mode, arch): | |
44 editor_dir = GetEditorDirectory(mode, arch) | |
45 if sys.platform == 'darwin': | |
46 executable = os.path.join('DartEditor.app', 'Contents', 'MacOS', | |
47 'DartEditor') | |
48 elif sys.platform == 'win32': | |
49 executable = 'DartEditor.exe' | |
50 elif sys.platform == 'linux2': | |
51 executable = 'DartEditor' | |
52 else: | |
53 raise Exception('Unknown platform %s' % sys.platform) | |
54 return os.path.join(editor_dir, executable) | |
55 | |
56 def RunProcess(args): | |
57 if sys.platform == 'linux2': | |
58 args = ['xvfb-run', '-a'] + args | |
59 print 'Running: %s' % (' '.join(args)) | |
60 sys.stdout.flush() | |
61 bot.RunProcess(args) | |
62 | |
63 def DownloadDartium(temp_dir, zip_file): | |
64 """Returns the filename of the unpacked archive""" | |
65 local_path = os.path.join(temp_dir, zip_file) | |
66 uri = "%s/%s" % (GCS_DARTIUM_BUCKET, zip_file) | |
67 RunProcess([GSUTIL, 'cp', uri, local_path]) | |
68 RunProcess(['unzip', local_path, '-d', temp_dir]) | |
69 for filename in os.listdir(temp_dir): | |
70 match = re.search('^dartium-.*-inc-([0-9]+)\.0$', filename) | |
71 if match: | |
72 return os.path.join(temp_dir, match.group(0)) | |
73 raise Exception("Couldn't find dartium archive") | |
74 | |
75 def UploadInstaller(dart_editor_dmg, directory): | |
76 directory = directory % {'revision' : utils.GetSVNRevision()} | |
77 uri = '%s/%s' % (GCS_EDITOR_BUCKET, directory) | |
78 RunProcess([GSUTIL, 'cp', dart_editor_dmg, uri]) | |
79 RunProcess([GSUTIL, 'setacl', 'public-read', uri]) | |
80 | |
81 def CreateAndUploadMacInstaller(arch): | |
82 dart_icns = os.path.join( | |
83 'editor', 'tools', 'plugins', 'com.google.dart.tools.deploy', | |
84 'icons', 'dart.icns') | |
85 mac_build_bundle_py = os.path.join('tools', 'mac_build_editor_bundle.sh') | |
86 mac_build_dmg_py = os.path.join('tools', 'mac_build_editor_dmg.sh') | |
87 editor_dir = GetEditorDirectory('Release', arch) | |
88 dart_sdk = GetDartSdkDirectory('Release', arch) | |
89 with utils.TempDir('eclipse') as temp_dir: | |
90 # Get dartium | |
91 dartium_directory = DownloadDartium(temp_dir, 'dartium-mac.zip') | |
92 dartium_bundle_dir = os.path.join(dartium_directory, | |
93 'Chromium.app') | |
94 | |
95 # Build the editor bundle | |
96 darteditor_bundle_dir = os.path.join(temp_dir, 'DartEditor.app') | |
97 args = [mac_build_bundle_py, darteditor_bundle_dir, editor_dir, | |
98 dart_sdk, dartium_bundle_dir, dart_icns] | |
99 RunProcess(args) | |
100 | |
101 # Build the dmg installer from the editor bundle | |
102 dart_editor_dmg = os.path.join(temp_dir, 'DartEditor.dmg') | |
103 args = [mac_build_dmg_py, dart_editor_dmg, darteditor_bundle_dir, | |
104 dart_icns, 'Dart Editor'] | |
105 RunProcess(args) | |
106 | |
107 # Upload the dmg installer | |
108 UploadInstaller(dart_editor_dmg, 'dart-editor-mac-%(revision)s.dmg') | |
109 | |
110 def main(): | |
111 build_py = os.path.join('tools', 'build.py') | |
112 | |
113 architectures = ['ia32', 'x64'] | |
114 test_architectures = ['x64'] | |
115 if sys.platform == 'win32': | |
116 # Our windows bots pull in only a 32 bit JVM. | |
117 test_architectures = ['ia32'] | |
118 | |
119 for arch in architectures: | |
120 with bot.BuildStep('Build Editor %s' % arch): | |
121 args = [sys.executable, build_py, | |
122 '-mrelease', '--arch=%s' % arch, 'editor', 'create_sdk'] | |
123 RunProcess(args) | |
124 | |
125 # before we run the editor, suppress any 'restore windows' dialogs | |
126 if sys.platform == 'darwin': | |
127 bot.RunProcess(['defaults', 'write', 'org.eclipse.eclipse.savedState', | |
128 'NSQuitAlwaysKeepsWindows', '-bool', 'false']) | |
129 | |
130 for arch in test_architectures: | |
131 editor_executable = GetEditorExecutable('Release', arch) | |
132 with bot.BuildStep('Test Editor %s' % arch): | |
133 with utils.TempDir('eclipse') as temp_dir: | |
134 args = [editor_executable, '--test', '--auto-exit', '-data', temp_dir] | |
135 RunProcess(args) | |
136 | |
137 # TODO: Permissions need to be clarified | |
138 for arch in test_architectures: | |
139 with bot.BuildStep('Build Installer %s' % arch): | |
140 if sys.platform == 'darwin': | |
141 CreateAndUploadMacInstaller(arch) | |
142 else: | |
143 print ("We currently don't build installers for sys.platform=%s" | |
144 % sys.platform) | |
145 return 0 | |
146 | |
147 if __name__ == '__main__': | |
148 try: | |
149 sys.exit(main()) | |
150 except OSError as e: | |
151 sys.exit(e.errno) | |
OLD | NEW |