def _ecr_login(project, registry): command = ExternalCommandBuilder('aws', project, Reactor.current_instance()) command.use_argument('ecr') command.use_argument('get-authorization-token') command.use_argument('--output') command.use_argument('text') command.use_argument('--query') command.use_argument('authorizationData[].authorizationToken') res = command.run("{}/{}".format(prepare_reports_directory(project), 'docker_ecr_get_token')) if res.exit_code > 0: raise Exception("Error getting token") pass_token = base64.b64decode(res.report_lines[0]) split = pass_token.split(":") command = ExternalCommandBuilder('docker', project, Reactor.current_instance()) command.use_argument('login') command.use_argument('-u') command.use_argument('{0}').formatted_with(split[0]) command.use_argument('-p') command.use_argument('{0}').formatted_with(split[1]) command.use_argument('{0}').formatted_with(registry) res = command.run("{}/{}".format(prepare_reports_directory(project), 'docker_ecr_docker_login')) if res.exit_code > 0: raise Exception("Error authenticating")
def do_docker_package(project, logger): project.set_property_if_unset("docker_package_build_dir", "src/main/docker") project.set_property_if_unset("docker_package_build_image", project.name) project.set_property_if_unset("docker_package_build_version", project.version) report_dir = prepare_reports_directory(project) dist_dir = prepare_dist_directory(project) assert_can_execute(["docker", "--version"], prerequisite="docker", caller="docker_package", env=None) # is true if user set verbose in build.py or from command line verbose = project.get_property("verbose") project.set_property_if_unset("docker_package_verbose_output", verbose) temp_build_img = 'pyb-temp-{}:{}'.format(project.name, project.version) build_img = get_build_img(project) logger.info("Executing primary stage docker build for image - {}.".format( build_img)) # docker build --build-arg buildVersion=${BUILD_NUMBER} -t ${BUILD_IMG} src/ command = ExternalCommandBuilder('docker', project, Reactor.current_instance()) command.use_argument('build') command.use_argument('--build-arg') command.use_argument('buildVersion={0}').formatted_with_property( 'docker_package_build_version') command.use_argument('-t') command.use_argument('{0}').formatted_with(temp_build_img) command.use_argument('{0}').formatted_with_property( 'docker_package_build_dir') result = command.run("{}/{}".format(report_dir, 'docker_package_build')) if result.exit_code != 0: logger.error(result.error_report_lines) raise Exception("Error building primary stage docker image") write_docker_build_file(project=project, logger=logger, build_image=temp_build_img, dist_dir=dist_dir) copy_dist_file(project=project, dist_dir=dist_dir, logger=logger) logger.info( "Executing secondary stage docker build for image - {}.".format( build_img)) command = ExternalCommandBuilder('docker', project, Reactor.current_instance()) command.use_argument('build') command.use_argument('-t') command.use_argument('{0}').formatted_with(build_img) command.use_argument('{0}').formatted_with(dist_dir) result = command.run("{}/{}".format(report_dir, 'docker_package_img')) if result.exit_code != 0: logger.error(result.error_report_lines) raise Exception("Error building docker image") logger.info( "Finished build docker image - {} - with dist file - {}".format( build_img, dist_dir))
def setUp(self): self.old_reactor = Reactor.current_instance() self.plugin_loader_mock = Mock(PluginLoader) self.logger = Mock() self.execution_manager = Mock(ExecutionManager) self.reactor = Reactor( self.logger, self.execution_manager, self.plugin_loader_mock)
def setUp(self): self.old_reactor = Reactor.current_instance() self.plugin_loader_mock = Mock(PluginLoader) self.logger = Mock() self.execution_manager = Mock(ExecutionManager) self.reactor = Reactor( self.logger, self.execution_manager, self.plugin_loader_mock)
def _run_tag_cmd(project, local_img, remote_img, logger): logger.info("Tagging local docker image {} - {}".format( local_img, remote_img)) report_dir = prepare_reports_directory(project) command = ExternalCommandBuilder('docker', project, Reactor.current_instance()) command.use_argument('tag') command.use_argument('{0}').formatted_with(local_img) command.use_argument('{0}').formatted_with(remote_img) command.run("{}/{}".format(report_dir, 'docker_push_tag'))
def get_all_dependencies_for_task(task): """ Returns a list containing all tasks required by the given task function (but not the given task itself) """ from pybuilder.reactor import Reactor task_name = task.__name__ execution_manager = Reactor.current_instance().execution_manager task_and_all_dependencies = execution_manager.collect_all_transitive_tasks([task_name]) return [dependency for dependency in task_and_all_dependencies if dependency.name != task_name]
def get_all_dependencies_for_task(task): """ Returns a list containing all tasks required by the given task function (but not the given task itself) """ from pybuilder.reactor import Reactor task_name = task.__name__ execution_manager = Reactor.current_instance().execution_manager task_and_all_dependencies = execution_manager.collect_all_transitive_tasks([task_name]) return [dependency for dependency in task_and_all_dependencies if dependency.name != task_name]
def _create_ecr_registry(fq_artifact, project): command = ExternalCommandBuilder('aws', project, Reactor.current_instance()) command.use_argument('ecr') command.use_argument('describe-repositories') command.use_argument('--repository-names') command.use_argument('{0}').formatted_with(fq_artifact) res = command.run("{}/{}".format(prepare_reports_directory(project), 'docker_ecr_registry_discover')) if res.exit_code > 0: command = ExternalCommandBuilder('aws', project, Reactor.current_instance()) command.use_argument('ecr') command.use_argument('create-repository') command.use_argument('--repository-name') command.use_argument('{0}').formatted_with(fq_artifact) res = command.run("{}/{}".format(prepare_reports_directory(project), 'docker_ecr_registry_create')) if res.exit_code > 0: raise Exception("Unable to create ecr registry")
def _run_push_cmd(project, remote_img, logger): logger.info("Pushing remote docker image - {}".format(remote_img)) report_dir = prepare_reports_directory(project) command = ExternalCommandBuilder('docker', project, Reactor.current_instance()) command.use_argument('push') command.use_argument('{0}').formatted_with(remote_img) res = command.run("{}/{}".format(report_dir, 'docker_push_tag')) if res.exit_code > 0: logger.info(res.error_report_lines) raise Exception( "Error pushing image to remote registry - {}".format(remote_img))
def build_with_pyb(target_dir, artifact_name, artifact_filter, config_settings=None, metadata_directory=None): from pybuilder.cli import main # verbose, debug, skip all optional... if main("-v", "-X", "-o", "--reset-plugins", "clean", "publish"): raise RuntimeError("PyBuilder build failed") from pybuilder.reactor import Reactor from pybuilder.plugins.python.distutils_plugin import _get_generated_artifacts reactor = Reactor.current_instance() project = reactor.project logger = reactor.logger dist_dir, artifacts = _get_generated_artifacts(project, logger) filtered = list(filter(artifact_filter, artifacts)) if len(filtered) > 1: raise RuntimeError("Multiple project %ss found, don't know which to install: %r" % (artifact_name, filtered,)) if not filtered: raise RuntimeError("Project did not generate any %ss install: %r" % (artifact_name, artifacts,)) artifact = filtered[0] shutil.copy2(artifact, target_dir) return os.path.basename(artifact)
def use_plugin(name, version=None, plugin_module_name=None): from pybuilder.reactor import Reactor reactor = Reactor.current_instance() if reactor is not None: reactor.require_plugin(name, version, plugin_module_name)
def use_plugin(name): from pybuilder.reactor import Reactor reactor = Reactor.current_instance() if reactor is not None: reactor.require_plugin(name)
project.set_property_if_unset(key, DEFAULT_PROPERTIES[key]) for arg in sys.argv: if str(arg).startswith(key + '='): project.set_property(key, str(arg).replace(key + '=', '')) # set project.name project.name = _get_repo_name(project, _get_repo_path(project)) # set project.version set_version_from_git_tag(project, logger) # save current properties for key in DEFAULT_PROPERTIES: project.set_property_if_unset(key + SAVED_PROP_SUFFIX, project.get_property(key)) # if we're in working project - update version according git tag if Reactor.current_instance(): force_semver_git_tag_plugin(Reactor.current_instance().project, Reactor.current_instance().logger) @init def initialize_semver_git_tag(project): """ Init default plugin project properties. """ project.plugin_depends_on('GitPython') project.plugin_depends_on('semver') # Part for develop increment - 'major', 'minor' or 'patch' project.set_property_if_unset('semver_git_tag_increment_part', 'patch') # Git repository directory path. # If None parent directory for build.py will be used project.set_property_if_unset('semver_git_tag_repo_dir', None) # Relative path with name of changelog file.
else: raise except subprocess.CalledProcessError as e: if e.returncode == 127: install_pyb() else: sys.exit(e.returncode) try: from pybuilder.cli import main # verbose, debug, skip all optional... if main("-v", "-X", "-o", "--reset-plugins", "clean", "package"): raise RuntimeError("PyBuilder build failed") from pybuilder.reactor import Reactor reactor = Reactor.current_instance() project = reactor.project dist_dir = project.expand_path("$dir_dist") for src_file in glob.glob(os.path.join(dist_dir, "*")): file_name = os.path.basename(src_file) target_file_name = os.path.join(script_dir, file_name) if os.path.exists(target_file_name): if os.path.isdir(target_file_name): shutil.rmtree(target_file_name) else: os.remove(target_file_name) shutil.move(src_file, script_dir) setup_args = sys.argv[1:] subprocess.check_call([sys.executable, "setup.py"] + setup_args, cwd=script_dir)
def use_plugin(name): from pybuilder.reactor import Reactor reactor = Reactor.current_instance() if reactor is not None: reactor.require_plugin(name)
def use_plugin(name, version=None, plugin_module_name=None): from pybuilder.reactor import Reactor reactor = Reactor.current_instance() if reactor is not None: reactor.require_plugin(name, version, plugin_module_name)
It allows to set properties before other plugins and download it from needed PyPi index""" # workaround for command line properties # until https://github.com/pybuilder/pybuilder/pull/515 if not project.get_property('pypi_server'): # try to get property from command line arguments for arg in sys.argv: if str(arg).startswith('pypi_server='): project.set_property('pypi_server', str(arg).replace('pypi_server=', '')) break if project.get_property('pypi_server'): use_pypi_server_plugin(project, logger) init_pypi_server_plugin(Reactor.current_instance().project, Reactor.current_instance().logger) @before("prepare", only_once=True) def reinitialize_pypi_server_plugin(project, logger): """ Re-init properties if `pypi_server` was changed on initialization stage""" if project.get_property('pypi_server'): if (project.get_property('pypi_server') != project.get_property('pypi_server_on_import_plugin')): logger.warn( "Property `pypi_server` defined on initialize stage. " "Please use command line `pyb ... -P pypi_server=...`, " "otherwise some packages could be downloaded " "from default PyPi index.")