blob: e42c4bcc8683d1fd929462172375281aab88c99e [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Entry point for the AddIn build bot.
Perform build steps and output results using the buildbot
annootator syntax
"""
import os
import sys
import re
import shutil
import subprocess
import urllib2
import zipfile
GSURL = 'https://commondatastorage.googleapis.com'
GSPATH = 'nativeclient-mirror/nacl/nacl_sdk/sdk'
SDKROOT = os.path.join('..', '..', 'out', 'sdk')
SDK_VERSIONS = ['pepper_36', 'pepper_37', 'pepper_canary']
def Log(msg):
sys.stdout.write(msg + '\n')
sys.stdout.flush()
def RunCommand(cmd, env=None, check_return_code=True):
Log("Running: %s" % cmd)
Log("CWD: %s" % os.getcwd())
if type(cmd) == str:
cmd = cmd.split()
if sys.platform == 'cygwin':
# allow bat files in the current working directory to
# be executed on cygwin as they are on win32
if not os.path.dirname(cmd[0]) and os.path.exists(cmd[0]):
cmd[0] = './' + cmd[0]
rtn = subprocess.call(cmd, env=env)
if check_return_code and rtn:
Log("Command returned non-zero exit code: %s" % rtn)
Log('@@@STEP_FAILURE@@@')
sys.exit(1)
return rtn
def StepBuild(revision):
Log('@@@BUILD_STEP build addin@@@')
if revision[0] == 'r':
revision = revision[1:]
# make a backup of AssemblyInfo.cs before we modify it
filename = os.path.join('NativeClientVSAddIn', 'AssemblyInfo.cs')
backup = filename + '.orig'
shutil.copyfile(filename, backup)
try:
# Before we do the build, insert the revsion information
# info AssemblyInfo.cs. Thie will then be reported as
# the addin version in visual studio.
with open(filename, 'rb') as f:
contents = f.read()
pattern = r'(\[assembly: AssemblyInformationalVersion\("\d+\.\d+\.).*"\)\]'
contents = re.sub(pattern, r'\g<1>%s")]' % revision, contents)
with open(filename, 'wb') as f:
f.write(contents)
RunCommand('build.bat')
finally:
# Once build is done restore original file
os.remove(filename)
os.rename(backup, filename)
def StepInstall():
Log('@@@BUILD_STEP install addin@@@')
RunCommand('developer_deploy.bat')
def StepInstallSDK():
Log('@@@BUILD_STEP install sdk@@@')
naclsdk = os.path.join(SDKROOT, 'nacl_sdk', 'naclsdk.bat')
if not os.path.exists(naclsdk):
if not os.path.exists(SDKROOT):
os.makedirs(SDKROOT)
filename = os.path.join(SDKROOT, 'nacl_sdk.zip')
url = GSURL + "/nativeclient-mirror/nacl/nacl_sdk/nacl_sdk.zip"
contents = urllib2.urlopen(url).read()
with open(filename, 'wb') as zfileout:
zfileout.write(contents)
zfile = zipfile.ZipFile(filename)
zfile.extractall(SDKROOT)
for version in SDK_VERSIONS:
RunCommand([naclsdk, 'update', '--force', version])
def StepTest():
# Don't actually test yet
env = dict(os.environ)
sdkroot = os.path.abspath(os.path.join(SDKROOT, 'nacl_sdk'))
if 'CHROME_PATH' not in os.environ:
# TODO(sbc): Addin itself should autodetect chrome location
# http://crbug.com/154911
progfiles = os.environ.get('PROGRAMFILES')
progfiles = os.environ.get('PROGRAMFILES(X86)', progfiles)
chrome = os.path.join(progfiles, 'Google', 'Chrome', 'Application',
'chrome.exe')
if not os.path.exists(chrome):
Log('CHROME_PATH not found')
Log('chrome not found in the default location: %s' % chrome)
Log('@@@STEP_FAILURE@@@')
sys.exit(1)
env['CHROME_PATH'] = chrome
for version in SDK_VERSIONS:
Log('@@@BUILD_STEP test against %s@@@' % version)
env['NACL_SDK_ROOT'] = os.path.join(sdkroot, version)
RunCommand('test.bat', env)
RunCommand('test_2012.bat', env)
def _FindInPath(filename):
for path in os.environ['PATH'].split(os.pathsep):
result = os.path.join(path, filename)
if os.path.exists(result):
return result
Log('%s not found in PATH' % filename)
Log('@@@STEP_FAILURE@@@')
sys.exit(1)
def _GetGsutil():
if os.environ.get('BUILDBOT_BUILDERNAME'):
# When running in a buildbot slave use
# gsutil from the slave scripts folder
import slave
slave_dir = os.path.dirname(slave.__file__)
gsutil = os.path.join(slave_dir, 'gsutil')
if os.name == 'nt':
gsutil += '.bat'
gsutil = [gsutil]
else:
if os.name == 'nt':
gsutil = [sys.executable, _FindInPath('gsutil')]
else:
gsutil = ['gsutil']
return gsutil
def StepArchive(revision):
Log('@@@BUILD_STEP archive build [r%s]@@@' % revision)
basename = 'vs_addin.tgz'
remote_name = '%s/%s/%s' % (GSPATH, revision, basename)
local_filename = os.path.join('..', '..', 'out',
'vs_addin', basename)
gs_remote_name = 'gs://' + remote_name
gsutil = _GetGsutil()
# Check for existing file on google storage
if RunCommand(gsutil + ['ls', gs_remote_name], check_return_code=False) == 0:
Log('Skipping archive step: file already exists on google storage')
return
# Upload to google storage
cmd = gsutil + ['cp', '-a', 'public-read', local_filename, gs_remote_name]
RunCommand(cmd)
url = "%s/%s" % (GSURL, remote_name)
Log('@@@STEP_LINK@download@%s@@@' % url)
def main():
# Remove BOTO_CONFIG from the environment -- we want to use the NaCl .boto
# file that has access to gs://nativeclient-mirror.
if 'BOTO_CONFIG' in os.environ:
del os.environ['BOTO_CONFIG']
if 'AWS_CREDENTIAL_FILE' in os.environ:
del os.environ['AWS_CREDENTIAL_FILE']
revision = os.environ.get('BUILDBOT_GOT_REVISION')
if revision is None:
Log('No BUILDBOT_GOT_REVISION found in environ')
Log('@@@STEP_FAILURE@@@')
sys.exit(1)
StepBuild(revision)
StepInstall()
StepInstallSDK()
StepTest()
StepArchive(revision)
if __name__ == '__main__':
main()