Index: tools/bots/dart_sdk.py |
diff --git a/tools/bots/dart_sdk.py b/tools/bots/dart_sdk.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..02063138148ab51274764242d540ae868fdd86da |
--- /dev/null |
+++ b/tools/bots/dart_sdk.py |
@@ -0,0 +1,176 @@ |
+#!/usr/bin/env python |
+# |
+# Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+# for details. All rights reserved. Use of this source code is governed by a |
+# BSD-style license that can be found in the LICENSE file. |
+ |
+import os.path |
+import shutil |
+import sys |
+ |
+import bot |
+import bot_utils |
+ |
+utils = bot_utils.GetUtils() |
+ |
+BUILD_OS = utils.GuessOS() |
+ |
+(bot_name, _) = bot.GetBotName() |
+CHANNEL = bot_utils.GetChannelFromName(bot_name) |
+ |
+def BuildSDK(): |
+ with bot.BuildStep('Build SDK'): |
+ Run([sys.executable, './tools/build.py', '--mode=release', |
+ '--arch=ia32,x64', 'create_sdk']) |
+ |
+def BuildAPIDocs(): |
+ with bot.BuildStep('Build API docs'): |
+ Run([sys.executable, './tools/build.py', '--mode=release', |
+ '--arch=ia32', 'api_docs']) |
+ 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
|
+ '--arch=ia32', 'dartdocgen']) |
+ |
+def CreateUploadSDKZips(): |
+ with bot.BuildStep('Create and upload sdk zips'): |
+ sdk32_path = os.path.join(bot_utils.DART_DIR, |
+ utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'), |
+ 'dart-sdk') |
+ sdk64_path = os.path.join(bot_utils.DART_DIR, |
+ utils.GetBuildRoot(BUILD_OS, 'release', 'x64'), |
+ 'dart-sdk') |
+ |
+ sdk32_zip = os.path.join(bot_utils.DART_DIR, |
+ utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'), |
+ 'dartsdk-%s-32.zip' % BUILD_OS) |
+ sdk64_zip = os.path.join(bot_utils.DART_DIR, |
+ utils.GetBuildRoot(BUILD_OS, 'release', 'x64'), |
+ 'dartsdk-%s-64.zip' % BUILD_OS) |
+ FileDelete(sdk32_zip) |
+ FileDelete(sdk64_zip) |
+ CreateZip(sdk32_path, sdk32_zip) |
+ CreateZip(sdk64_path, sdk64_zip) |
+ DartArchiveUploadSDKs(BUILD_OS, sdk32_zip, sdk64_zip) |
+ |
+def DartArchiveUploadSDKs(system, sdk32_zip, sdk64_zip): |
+ namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW) |
+ revision = utils.GetSVNRevision() |
+ for revision in [revision, 'latest']: |
+ path32 = namer.sdk_zipfilepath(revision, system, 'ia32', 'release') |
+ path64 = namer.sdk_zipfilepath(revision, system, 'x64', 'release') |
+ DartArchiveFile(sdk32_zip, path32, checksum_files=True) |
+ DartArchiveFile(sdk64_zip, path64, checksum_files=True) |
+ |
+def CreateUploadSDK(): |
+ BuildSDK() |
+ CreateUploadSDKZips() |
+ |
+def CreateUploadAPIDocs(): |
+ api_path = os.path.join(bot_utils.DART_DIR, |
+ utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'), |
+ 'api_docs') |
+ api_zip = os.path.join(bot_utils.DART_DIR, |
+ utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'), |
+ 'dart-api-docs.zip') |
+ shutil.rmtree(api_path, ignore_errors=True) |
+ FileDelete(api_zip) |
+ BuildAPIDocs() |
+ UploadApiDocs(api_path) |
+ CreateZip(api_path, api_zip) |
+ DartArchiveUploadAPIDocs(api_zip) |
+ |
+def DartArchiveUploadAPIDocs(api_zip): |
+ namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW) |
+ revision = utils.GetSVNRevision() |
+ for revision in [revision, 'latest']: |
+ destination = (namer.apidocs_directory(revision) + '/' + |
+ namer.apidocs_zipfilename()) |
+ DartArchiveFile(api_zip, destination, checksum_files=False) |
+ |
+def UploadApiDocs(dir_name): |
+ apidocs_namer = bot_utils.GCSNamerApiDocs(CHANNEL) |
+ revision = utils.GetSVNRevision() |
+ apidocs_destination_gcsdir = apidocs_namer.docs_dirpath(revision) |
+ apidocs_destination_latestfile = apidocs_namer.docs_latestpath(revision) |
+ |
+ # Return early if the documents have already been uploaded. |
+ # (This can happen if a build was forced, or a commit had no changes in the |
+ # dart repository (e.g. DEPS file update).) |
+ if GsutilExists(apidocs_destination_gcsdir): |
+ print ("Not uploading api docs, since %s is already present." |
+ % apidocs_destination_gcsdir) |
+ return |
+ |
+ # Upload everything inside the built apidocs directory. |
+ gsutil = bot_utils.GSUtil() |
+ gsutil.upload(dir_name, apidocs_destination_gcsdir, recursive=True, |
+ public=True) |
+ |
+ # Update latest.txt to contain the newest revision. |
+ with utils.TempDir('latest_file') as temp_dir: |
+ latest_file = join(temp_dir, 'latest.txt') |
+ with open(latest_file, 'w') as f: |
+ f.write('%s' % revision) |
+ DartArchiveFile(latest_file, apidocs_destination_latestfile) |
+ |
+def GsutilExists(gsu_path): |
+ # This is a little hackish, but it is basically a one off doing very |
+ # specialized check that we don't use elsewhere. |
+ gsutilTool = os.path.join(bot_utils.DART_DIR, |
+ 'third_party', 'gsutil', 'gsutil') |
+ (_, stderr, returncode) = bot_utils.run( |
+ [gsutilTool, 'ls', gsu_path], |
+ throw_on_error=False) |
+ # If the returncode is nonzero and we can find a specific error message, |
+ # we know there are no objects with a prefix of [gsu_path]. |
+ missing = (returncode and 'CommandException: No such object' in stderr) |
+ # Either the returncode has to be zero or the object must be missing, |
+ # otherwise throw an exception. |
+ if not missing and returncode: |
+ raise Exception("Failed to determine whether %s exists" % gsu_path) |
+ return not missing |
+ |
+ |
+def CreateZip(directory, target_file): |
+ if 'win' in BUILD_OS: |
+ CreateZipWindows(directory, target_file) |
+ else: |
+ CreateZipPosix(directory, target_file) |
+ |
+def CreateZipPosix(directory, target_file): |
+ with utils.ChangedWorkingDirectory(os.path.dirname(directory)): |
+ command = ['zip', '-yrq9', target_file, os.path.basename(directory)] |
+ Run(command) |
+ |
+def CreateZipWindows(directory, target_file): |
+ with utils.ChangedWorkingDirectory(os.path.dirname(directory)): |
+ zip_win = os.path.join(bot_utils.DART_DIR, 'third_party', '7zip', '7za') |
+ command = [zip_win, 'a', '-tzip', target_file, os.path.basename(directory)] |
+ Run(command) |
+ |
+def FileDelete(f): |
+ if os.path.exists(f): |
+ os.remove(f) |
+ |
+def DartArchiveFile(local_path, remote_path, checksum_files=False): |
+ gsutil = bot_utils.GSUtil() |
+ gsutil.upload(local_path, remote_path, public=True) |
+ if checksum_files: |
+ # 'local_path' may have a different filename than 'remote_path'. So we need |
+ # to make sure the *.md5sum file contains the correct name. |
+ assert '/' in remote_path and not remote_path.endswith('/') |
+ |
+ mangled_filename = remote_path[remote_path.rfind('/') + 1:] |
+ local_md5sum = bot_utils.CreateMD5ChecksumFile(local_path, |
+ mangled_filename) |
+ gsutil.upload(local_md5sum, remote_path + '.md5sum', public=True) |
+ local_sha256 = bot_utils.CreateSha256ChecksumFile(local_path, |
+ mangled_filename) |
+ gsutil.upload(local_sha256, remote_path + '.sha256sum', public=True) |
+ |
+def Run(command): |
+ print "Running %s" % ' '.join(command) |
+ return bot.RunProcess(command) |
+ |
+if __name__ == '__main__': |
+ CreateUploadSDK() |
+ CreateUploadAPIDocs() |