def process_pipeline_args(self, pipeline_args: JobVariant): # all steps depend from us and may consume our output for step in pipeline_args.steps(): if step == self.version_step: continue step._add_dependency(self.version_step) step.add_input(variable_name=ENV_VAR_NAME, name=DIR_NAME)
def process_pipeline_args(self, pipeline_args: JobVariant): # our steps depends on dependency descriptor step component_descriptor_step = pipeline_args.step( concourse.model.traits.component_descriptor.DEFAULT_COMPONENT_DESCRIPTOR_STEP_NAME ) if self.trait.protecode(): self.image_scan_step._add_dependency(component_descriptor_step) if self.trait.clam_av(): self.malware_scan_step._add_dependency(component_descriptor_step) for trait_name in self.trait.trait_depends(): if not pipeline_args.has_trait(trait_name): raise ModelValidationError(f'dependency towards absent trait: {trait_name}') depended_on_trait = pipeline_args.trait(trait_name) # XXX refactor Trait/TraitTransformer transformer = depended_on_trait.transformer() # XXX step-injection may have (unintended) side-effects :-/ depended_on_step_names = {step.name for step in transformer.inject_steps()} for step in pipeline_args.steps(): if not step.name in depended_on_step_names: continue if self.trait.protecode(): self.image_scan_step._add_dependency(step) # prevent cyclic dependencies (from auto-injected depends) if self.image_scan_step.name in step.depends(): step._remove_dependency(self.image_scan_step) if self.trait.clam_av(): self.malware_scan_step._add_dependency(step) # prevent cyclic dependencies (from auto-injected depends) if self.malware_scan_step.name in step.depends(): step._remove_dependency(self.malware_scan_step)
def process_pipeline_args(self, pipeline_args: JobVariant): # our step depends on dependency descriptor step component_descriptor_step = pipeline_args.step('component_descriptor') self.image_scan_step._add_dependency(component_descriptor_step) for trait_name in self.trait.trait_depends(): if not pipeline_args.has_trait(trait_name): raise ModelValidationError( f'dependency towards absent trait: {trait_name}') depended_on_trait = pipeline_args.trait(trait_name) # XXX refactor Trait/TraitTransformer transformer = depended_on_trait.transformer() # XXX step-injection may have (unintended) side-effects :-/ depended_on_step_names = { step.name for step in transformer.inject_steps() } for step in pipeline_args.steps(): if not step.name in depended_on_step_names: continue self.image_scan_step._add_dependency(step) # prevent cyclic dependencies (from auto-injected depends) if self.image_scan_step.name in step.depends(): step._remove_dependency(self.image_scan_step)
def process_pipeline_args(self, pipeline_args: JobVariant): main_repo = pipeline_args.main_repository() prepare_step = pipeline_args.step('prepare') publish_step = pipeline_args.step('publish') image_name = main_repo.branch() + '-image' tag_name = main_repo.branch() + '-tag' # configure prepare step's outputs (consumed by publish step) prepare_step.add_output('image_path', image_name) prepare_step.add_output('tag_path', tag_name) # configure publish step's inputs (produced by prepare step) publish_step.add_input('image_path', image_name) publish_step.add_input('tag_path', tag_name) input_step_names = set() for image_descriptor in self.trait.dockerimages(): # todo: image-specific prepare steps input_step_names.update(image_descriptor.input_steps()) for input_step_name in input_step_names: input_step = pipeline_args.step(input_step_name) input_name = input_step.output_dir() prepare_step.add_input(input_name, input_name) # prepare-step depdends on every other step, except publish and release # TODO: do not hard-code knowledge about 'release' step for step in pipeline_args.steps(): if step.name in ['publish', 'release']: continue prepare_step._add_dependency(step)
def process_pipeline_args(self, pipeline_args: JobVariant): # all steps depend from us and may consume our output for step in pipeline_args.steps(): if step == self.version_step: continue step._add_dependency(self.version_step) step.add_input(name='version_path', variable_name='managed-version')
def process_pipeline_args(self, pipeline_args: JobVariant): # we depend on all other steps for step in pipeline_args.steps(): self.release_step._add_dependency(step) # a 'release job' should only be triggered automatically if explicitly configured main_repo = pipeline_args.main_repository() if main_repo: if 'trigger' not in pipeline_args.raw['repo']: main_repo._trigger = False
def process_pipeline_args(self, pipeline_args: JobVariant): # All steps depend on meta step and receive an input from it for step in pipeline_args.steps(): if step == self.meta_step: continue step._add_dependency(self.meta_step) step.add_input(name=DIR_NAME, variable_name=ENV_VAR_NAME) if pipeline_args.has_trait('version'): # All steps depend on version. Remove ourself to avoid circular dependency version_step = pipeline_args.step('version') self.meta_step._remove_dependency(version_step) self.meta_step.remove_input('version_path')
def process_pipeline_args(self, pipeline_args: JobVariant): main_repo = pipeline_args.main_repository() prepare_step = pipeline_args.step('prepare') if self.trait.oci_builder() is OciBuilder.CONCOURSE_IMAGE_RESOURCE: publish_step = pipeline_args.step('publish') image_name = main_repo.branch() + '-image' tag_name = main_repo.branch() + '-tag' # configure prepare step's outputs (consumed by publish step) prepare_step.add_output(variable_name=IMAGE_ENV_VAR_NAME, name=image_name) prepare_step.add_output(variable_name=TAG_ENV_VAR_NAME, name=tag_name) if self.trait.oci_builder() is OciBuilder.CONCOURSE_IMAGE_RESOURCE: # configure publish step's inputs (produced by prepare step) publish_step.add_input(variable_name=IMAGE_ENV_VAR_NAME, name=image_name) publish_step.add_input(variable_name=TAG_ENV_VAR_NAME, name=tag_name) for build_step in self._build_steps: build_step.add_input(variable_name=IMAGE_ENV_VAR_NAME, name=image_name) input_step_names = set() for image_descriptor in self.trait.dockerimages(): # todo: image-specific prepare steps input_step_names.update(image_descriptor.input_steps()) for input_step_name in input_step_names: input_step = pipeline_args.step(input_step_name) input_name = input_step.output_dir() prepare_step.add_input(input_name, input_name) # prepare-step depdends on every other step, except publish and release # TODO: do not hard-code knowledge about 'release' step for step in pipeline_args.steps(): if step.name in ['publish', 'release', 'build_oci_image']: continue if step.name.startswith('build_oci_image'): continue prepare_step._add_dependency(step)
def process_pipeline_args(self, pipeline_args: JobVariant): # all steps depend from us and may consume our output for step in pipeline_args.steps(): step._notifications_cfg = self.trait.notifications_cfg( step.notifications_cfg_name())