OLD | NEW |
---|---|
(Empty) | |
1 #!/usr/bin/env python | |
2 # | |
3 # Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
4 # for details. All rights reserved. Use of this source code is governed by a | |
5 # BSD-style license that can be found in the LICENSE file. | |
6 | |
7 import os.path | |
8 import shutil | |
9 import sys | |
10 | |
11 import bot | |
12 import bot_utils | |
13 | |
14 utils = bot_utils.GetUtils() | |
15 | |
16 BUILD_OS = utils.GuessOS() | |
17 | |
18 (bot_name, _) = bot.GetBotName() | |
19 CHANNEL = bot_utils.GetChannelFromName(bot_name) | |
20 | |
21 def BuildSDK(): | |
22 with bot.BuildStep('Build SDK'): | |
23 Run([sys.executable, './tools/build.py', '--mode=release', | |
24 '--arch=ia32,x64', 'create_sdk']) | |
25 | |
26 def BuildAPIDocs(): | |
27 with bot.BuildStep('Build API docs'): | |
28 Run([sys.executable, './tools/build.py', '--mode=release', | |
29 '--arch=ia32', 'api_docs']) | |
30 Run([sys.executable, './tools/build.py', '--mode=release', | |
ricow1
2015/05/11 13:06:47
I don't know why we need this, but it was in the o
| |
31 '--arch=ia32', 'dartdocgen']) | |
32 | |
33 def CreateUploadSDKZips(): | |
34 with bot.BuildStep('Create and upload sdk zips'): | |
35 sdk32_path = os.path.join(bot_utils.DART_DIR, | |
36 utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'), | |
37 'dart-sdk') | |
38 sdk64_path = os.path.join(bot_utils.DART_DIR, | |
39 utils.GetBuildRoot(BUILD_OS, 'release', 'x64'), | |
40 'dart-sdk') | |
41 | |
42 sdk32_zip = os.path.join(bot_utils.DART_DIR, | |
43 utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'), | |
44 'dartsdk-%s-32.zip' % BUILD_OS) | |
45 sdk64_zip = os.path.join(bot_utils.DART_DIR, | |
46 utils.GetBuildRoot(BUILD_OS, 'release', 'x64'), | |
47 'dartsdk-%s-64.zip' % BUILD_OS) | |
48 FileDelete(sdk32_zip) | |
49 FileDelete(sdk64_zip) | |
50 CreateZip(sdk32_path, sdk32_zip) | |
51 CreateZip(sdk64_path, sdk64_zip) | |
52 DartArchiveUploadSDKs(BUILD_OS, sdk32_zip, sdk64_zip) | |
53 | |
54 def DartArchiveUploadSDKs(system, sdk32_zip, sdk64_zip): | |
55 namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW) | |
56 revision = utils.GetSVNRevision() | |
57 for revision in [revision, 'latest']: | |
58 path32 = namer.sdk_zipfilepath(revision, system, 'ia32', 'release') | |
59 path64 = namer.sdk_zipfilepath(revision, system, 'x64', 'release') | |
60 DartArchiveFile(sdk32_zip, path32, checksum_files=True) | |
61 DartArchiveFile(sdk64_zip, path64, checksum_files=True) | |
62 | |
63 def CreateUploadSDK(): | |
64 BuildSDK() | |
65 CreateUploadSDKZips() | |
66 | |
67 def CreateUploadAPIDocs(): | |
68 api_path = os.path.join(bot_utils.DART_DIR, | |
69 utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'), | |
70 'api_docs') | |
71 api_zip = os.path.join(bot_utils.DART_DIR, | |
72 utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'), | |
73 'dart-api-docs.zip') | |
74 shutil.rmtree(api_path, ignore_errors=True) | |
75 FileDelete(api_zip) | |
76 BuildAPIDocs() | |
77 UploadApiDocs(api_path) | |
78 CreateZip(api_path, api_zip) | |
79 DartArchiveUploadAPIDocs(api_zip) | |
80 | |
81 def DartArchiveUploadAPIDocs(api_zip): | |
82 namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW) | |
83 revision = utils.GetSVNRevision() | |
84 for revision in [revision, 'latest']: | |
85 destination = (namer.apidocs_directory(revision) + '/' + | |
86 namer.apidocs_zipfilename()) | |
87 DartArchiveFile(api_zip, destination, checksum_files=False) | |
88 | |
89 def UploadApiDocs(dir_name): | |
90 apidocs_namer = bot_utils.GCSNamerApiDocs(CHANNEL) | |
91 revision = utils.GetSVNRevision() | |
92 apidocs_destination_gcsdir = apidocs_namer.docs_dirpath(revision) | |
93 apidocs_destination_latestfile = apidocs_namer.docs_latestpath(revision) | |
94 | |
95 # Return early if the documents have already been uploaded. | |
96 # (This can happen if a build was forced, or a commit had no changes in the | |
97 # dart repository (e.g. DEPS file update).) | |
98 if GsutilExists(apidocs_destination_gcsdir): | |
99 print ("Not uploading api docs, since %s is already present." | |
100 % apidocs_destination_gcsdir) | |
101 return | |
102 | |
103 # Upload everything inside the built apidocs directory. | |
104 gsutil = bot_utils.GSUtil() | |
105 gsutil.upload(dir_name, apidocs_destination_gcsdir, recursive=True, | |
106 public=True) | |
107 | |
108 # Update latest.txt to contain the newest revision. | |
109 with utils.TempDir('latest_file') as temp_dir: | |
110 latest_file = join(temp_dir, 'latest.txt') | |
111 with open(latest_file, 'w') as f: | |
112 f.write('%s' % revision) | |
113 DartArchiveFile(latest_file, apidocs_destination_latestfile) | |
114 | |
115 def GsutilExists(gsu_path): | |
116 # This is a little hackish, but it is basically a one off doing very | |
117 # specialized check that we don't use elsewhere. | |
118 gsutilTool = os.path.join(bot_utils.DART_DIR, | |
119 'third_party', 'gsutil', 'gsutil') | |
120 (_, stderr, returncode) = bot_utils.run( | |
121 [gsutilTool, 'ls', gsu_path], | |
122 throw_on_error=False) | |
123 # If the returncode is nonzero and we can find a specific error message, | |
124 # we know there are no objects with a prefix of [gsu_path]. | |
125 missing = (returncode and 'CommandException: No such object' in stderr) | |
126 # Either the returncode has to be zero or the object must be missing, | |
127 # otherwise throw an exception. | |
128 if not missing and returncode: | |
129 raise Exception("Failed to determine whether %s exists" % gsu_path) | |
130 return not missing | |
131 | |
132 | |
133 def CreateZip(directory, target_file): | |
134 if 'win' in BUILD_OS: | |
135 CreateZipWindows(directory, target_file) | |
136 else: | |
137 CreateZipPosix(directory, target_file) | |
138 | |
139 def CreateZipPosix(directory, target_file): | |
140 with utils.ChangedWorkingDirectory(os.path.dirname(directory)): | |
141 command = ['zip', '-yrq9', target_file, os.path.basename(directory)] | |
142 Run(command) | |
143 | |
144 def CreateZipWindows(directory, target_file): | |
145 with utils.ChangedWorkingDirectory(os.path.dirname(directory)): | |
146 zip_win = os.path.join(bot_utils.DART_DIR, 'third_party', '7zip', '7za') | |
147 command = [zip_win, 'a', '-tzip', target_file, os.path.basename(directory)] | |
148 Run(command) | |
149 | |
150 def FileDelete(f): | |
151 if os.path.exists(f): | |
152 os.remove(f) | |
153 | |
154 def DartArchiveFile(local_path, remote_path, checksum_files=False): | |
155 gsutil = bot_utils.GSUtil() | |
156 gsutil.upload(local_path, remote_path, public=True) | |
157 if checksum_files: | |
158 # 'local_path' may have a different filename than 'remote_path'. So we need | |
159 # to make sure the *.md5sum file contains the correct name. | |
160 assert '/' in remote_path and not remote_path.endswith('/') | |
161 | |
162 mangled_filename = remote_path[remote_path.rfind('/') + 1:] | |
163 local_md5sum = bot_utils.CreateMD5ChecksumFile(local_path, | |
164 mangled_filename) | |
165 gsutil.upload(local_md5sum, remote_path + '.md5sum', public=True) | |
166 local_sha256 = bot_utils.CreateSha256ChecksumFile(local_path, | |
167 mangled_filename) | |
168 gsutil.upload(local_sha256, remote_path + '.sha256sum', public=True) | |
169 | |
170 def Run(command): | |
171 print "Running %s" % ' '.join(command) | |
172 return bot.RunProcess(command) | |
173 | |
174 if __name__ == '__main__': | |
175 CreateUploadSDK() | |
176 CreateUploadAPIDocs() | |
OLD | NEW |