blob: 1cfcd5cab4d6f88e7880cae5f5c6f1eb894a25a3 [file] [log] [blame] [edit]
#!/usr/bin/env python3
# Copyright 2013 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# A script for re-running prod builds on LUCI
#
# Usage:
# $ build.py --commit [Engine commit hash] --builder [builder name]
#
# NOTE: This script requires python3.7 or later.
#
import argparse
import os
import re
import subprocess
import sys
def GetAllBuilders():
curl_command = [
'curl',
'https://ci.chromium.org/p/flutter/g/engine/builders',
]
curl_result = subprocess.run(
curl_command,
universal_newlines=True,
capture_output=True,
)
if curl_result.returncode != 0:
print('Failed to fetch builder list: stderr:\n%s' % curl_result.stderr)
return []
sed_command = [
'sed',
'-En',
's:.*aria-label="builder buildbucket/luci\\.flutter\\.prod/([^/]+)".*:\\1:p',
]
sed_result = subprocess.run(
sed_command,
input=curl_result.stdout,
capture_output=True,
universal_newlines=True,
)
if sed_result.returncode != 0:
print('Failed to fetch builder list: stderr:\n%s' % sed_result.stderr)
return list(set(sed_result.stdout.splitlines()))
def Main():
parser = argparse.ArgumentParser(description='Reruns Engine LUCI prod builds')
parser.add_argument(
'--force-upload',
action='store_true',
default=False,
help='Force artifact upload, overwriting existing artifacts.'
)
parser.add_argument(
'--all', action='store_true', default=False, help='Re-run all builds.'
)
parser.add_argument('--builder', type=str, help='The builer to rerun.')
parser.add_argument(
'--commit', type=str, required=True, help='The commit to rerun.'
)
parser.add_argument(
'--dry-run',
action='store_true',
help='Print what would be done, but do nothing.'
)
args = parser.parse_args()
if 'help' in vars(args) and args.help:
parser.print_help()
return 0
if args.all:
builders = GetAllBuilders()
elif args.builder == None:
print('Either --builder or --all is required.')
return 1
else:
builders = [args.builder]
auth_command = [
'gcloud',
'auth',
'print-identity-token',
]
auth_result = subprocess.run(
auth_command,
universal_newlines=True,
capture_output=True,
)
if auth_result.returncode != 0:
print(
'Auth failed:\nstdout:\n%s\nstderr:\n%s' %
(auth_result.stdout, auth_result.stderr)
)
return 1
auth_token = auth_result.stdout.rstrip()
for builder in builders:
if args.force_upload:
params = (
'{"Commit": "%s", "Builder": "%s", "Repo": "engine", "Properties": {"force_upload":true}}'
% (args.commit, builder)
)
else:
params = '{"Commit": "%s", "Builder": "%s", "Repo": "engine"}' % (
args.commit, builder
)
curl_command = [
'curl',
'http://flutter-dashboard.appspot.com/api/reset-prod-task',
"-d %s" % params,
'-H',
'X-Flutter-IdToken: %s' % auth_token,
]
if args.dry_run:
print('Running: %s' % ' '.join(curl_command))
else:
result = subprocess.run(curl_command)
if result.returncode != 0:
print('Trigger for %s failed. Aborting.' % builder)
return 1
return 0
if __name__ == '__main__':
sys.exit(Main())