blob: 4e00d3b1ea59954791f31ea89e9c7911177450fe [file] [log] [blame] [edit]
# Copyright 2019 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.
'''Implement the LUCI "run_build" protocol.
This expects to read a build.proto[1] Build message on stdin (binary-encoded
protobuf), and will execute the task accordingly, selecting the recipe to run
from the 'recipe' property of the `Build.input.properties` field.
This synthesizes properties from the Build message:
* $recipe_engine/runtime['is_experimental'] = Build.input.experimental
* $recipe_engine/runtime['is_luci'] = true
* $recipe_engine/path['temp_dir'] = os.environ['TMP']
* $recipe_engine/path['cache_dir'] = os.environ['LUCI_CACHE_DIR']
'''
import argparse
import sys
import logging
LOG = logging.getLogger(__name__)
class RunBuildContractViolation(Exception):
pass
def add_arguments(parser):
parser.add_argument(
'--final-state', type=argparse.FileType('wb'),
help='Path to write the final build.proto state to (as binary PB).')
parser.add_argument(
'--build-proto-jsonpb', action='store_true',
help=(
'If specified, output build.proto datagrams as JSONPB instead of PB. '
'Only for debugging.'
))
def _launch(args):
from .cmd import main
try:
return main(args)
except RunBuildContractViolation as ex:
LOG.fatal('"run_build" protocol contract violation: %s', ex)
return 1
def _post(_error, _args):
logging.basicConfig()
parser.set_defaults(func=_launch, postprocess_func=_post)