public JobConfig jobConfigByConfigName(String jobName) { return jobConfigByConfigName(new CaseInsensitiveString(jobName)); }
public void encryptSecureProperties(CruiseConfig preprocessedConfig, PipelineConfig preprocessedPipelineConfig, StageConfig preprocessedStageConfig) { for (JobConfig jobConfig : getJobs()) { jobConfig.encryptSecureProperties(preprocessedConfig, preprocessedPipelineConfig, preprocessedStageConfig.jobConfigByConfigName(jobConfig.name())); } }
@Override public JobConfig findJob(String pipelineName, String stageName, String jobName) { return pipelineConfigByName(new CaseInsensitiveString(pipelineName)) .findBy(new CaseInsensitiveString(stageName)) .jobConfigByConfigName(new CaseInsensitiveString(jobName)); }
@Override protected void validateAttributes(ValidationContext validationContext) { if (StringUtils.isBlank(artifactId)) { errors.add("artifactId", "Artifact Id cannot be blank."); } if (isNotBlank(artifactId) && validationContext.isWithinPipelines()) { final PathFromAncestor pipelineNamePathFromAncestor = getPipelineNamePathFromAncestor(); final PipelineConfig pipelineConfig = validationContext.getPipelineConfigByName(pipelineNamePathFromAncestor.getAncestorName()); final JobConfig jobConfig = pipelineConfig.getStage(getStage()).jobConfigByConfigName(getJob()); final PluggableArtifactConfig pluggableArtifactConfig = jobConfig.artifactConfigs().findByArtifactId(artifactId); if (pluggableArtifactConfig == null) { addError("artifactId", format("Pluggable artifact with id `%s` does not exist in [%s/%s/%s].", artifactId, pipelineNamePathFromAncestor.getAncestorName(), getStage(), getJob())); } } configuration.validateTree(); configuration.validateUniqueness("Fetch pluggable artifact"); }
public static PipelineConfig pipelineConfigWithExternalArtifact(String pipelineName, ArtifactConfig artifactConfig) { final String stageName = pipelineName + ".stage"; final String jobName = pipelineName + ".job"; PipelineConfig pipelineConfig = createPipelineConfig(pipelineName, stageName, jobName); final JobConfig jobConfig = pipelineConfig.getStage(stageName).jobConfigByConfigName(jobName); jobConfig.artifactConfigs().add(artifactConfig); return pipelineConfig; } }
@Test public void shouldCreatePipelineInstanceWithEnvironmentVariablesOverriddenAccordingToScope() { StageConfig stageConfig = StageConfigMother.custom("stage", "foo", "bar"); JobConfig fooConfig = stageConfig.jobConfigByConfigName(new CaseInsensitiveString("foo")); fooConfig.addVariable("foo", "foo"); JobConfig barConfig = stageConfig.jobConfigByConfigName(new CaseInsensitiveString("bar")); barConfig.addVariable("foo", "bar"); MaterialConfigs materialConfigs = MaterialConfigsMother.defaultMaterialConfigs(); PipelineConfig pipelineConfig = new PipelineConfig(new CaseInsensitiveString("pipeline"), materialConfigs, stageConfig); DefaultSchedulingContext context = new DefaultSchedulingContext("anonymous"); Pipeline instance = instanceFactory.createPipelineInstance(pipelineConfig, ModificationsMother.forceBuild(pipelineConfig), context, "some-md5", new TimeProvider()); assertThat(instance.findStage("stage").findJob("foo").getPlan().getVariables(), is(new EnvironmentVariables(Arrays.asList(new EnvironmentVariable("foo", "foo"))))); assertThat(instance.findStage("stage").findJob("bar").getPlan().getVariables(), is(new EnvironmentVariables(Arrays.asList(new EnvironmentVariable("foo", "bar"))))); }
@Test public void shouldWriteArtifactsConfigXMLWithType() throws Exception { CruiseConfig cruiseConfig = new BasicCruiseConfig(); cruiseConfig.getArtifactStores().add(new ArtifactStore("s3", "cd.go.artifact.docker")); final PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfigWithStage("Test", "test-stage"); final JobConfig jobConfig = pipelineConfig.getStage("test-stage").jobConfigByConfigName("dev"); jobConfig.artifactConfigs().add(new BuildArtifactConfig("build/libs/*.jar", "dist")); jobConfig.artifactConfigs().add(new TestArtifactConfig("test-result/*", "reports")); jobConfig.artifactConfigs().add(new PluggableArtifactConfig("installers", "s3")); cruiseConfig.addPipeline("TestGroup", pipelineConfig); xmlWriter.write(cruiseConfig, output, false); String actualXML = this.output.toString(); assertThat(actualXML, containsString("<artifact type=\"build\" src=\"build/libs/*.jar\" dest=\"dist\" />")); assertThat(actualXML, containsString("<artifact type=\"test\" src=\"test-result/*\" dest=\"reports\" />")); assertThat(actualXML, containsString("<artifact type=\"external\" id=\"installers\" storeId=\"s3\" />")); }
@Test public void encryptSecureProperties_shouldLeaveUserEnteredValuesAsIsIfArtifactStoreIsMissing() throws CryptoException { FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("pipeline"), new CaseInsensitiveString("stage"), new CaseInsensitiveString("job"), "s3"); ArrayList<ConfigurationProperty> configurationProperties = new ArrayList<>(); configurationProperties.add(ConfigurationPropertyMother.create("plain", false, "plain")); configurationProperties.add(ConfigurationPropertyMother.create("secure", true, new GoCipher().encrypt("password"))); PipelineConfig pipelineConfig = PipelineConfigMother.createPipelineConfig("pipeline", "stage", "job"); pipelineConfig.getStage("stage").jobConfigByConfigName("job").artifactConfigs().add(new PluggableArtifactConfig("s3", "aws")); BasicCruiseConfig cruiseConfig = GoConfigMother.defaultCruiseConfig(); cruiseConfig.addPipelineWithoutValidation("foo", pipelineConfig); task.addConfigurations(configurationProperties); task.encryptSecureProperties(cruiseConfig, pipelineConfig, task); assertThat(task.getConfiguration(), is(configurationProperties)); }
@Test public void shouldBeValidIfFetchArtifactDoesNotSpecifyPipeline() { upstream.getStage("stage").jobConfigByConfigName("job").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("stage"), new CaseInsensitiveString("job"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, upstream, upstream.getStage(new CaseInsensitiveString("up-stage1")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void shouldBeValidIfFetchArtifactUsingAStageBeforeCurrentInTheSamePipeline() { upstream.getStage("stage").jobConfigByConfigName("job").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("upstream"), new CaseInsensitiveString("stage"), new CaseInsensitiveString("job"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, upstream, upstream.getStage(new CaseInsensitiveString("up-stage1")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void should_NOT_BeValidWhenFetchArtifactIsFromAnyAncestorStage_s_successorStage_onTheUpstreamPipeline() { uppestStream.getStage("uppest-stage3").jobConfigByConfigName("uppest-job3").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage3"), new CaseInsensitiveString("uppest-job3"), "s3"); StageConfig stage = downstream.getStage(new CaseInsensitiveString("stage")); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, stage, stage.getJobs().first())); assertThat(task.errors().isEmpty(), is(false)); assertThat(task.errors().on(FetchTask.STAGE), is("\"downstream :: stage :: job\" tries to fetch artifact from stage \"uppest_stream :: uppest-stage3\" which does not complete before \"downstream\" pipeline's dependencies.")); }
@Test public void shouldBeValidIfFetchArtifactUsingADependantPipeline() { upstream.getStage("up-stage1").jobConfigByConfigName("up-job1").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("upstream"), new CaseInsensitiveString("up-stage1"), new CaseInsensitiveString("up-job1"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void shouldBeValidWhenFetchArtifactIsFromAnyAncestorStage_onTheUpstreamPipeline() { uppestStream.getStage("uppest-stage2").jobConfigByConfigName("uppest-job2").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage2"), new CaseInsensitiveString("uppest-job2"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void shouldBeValidWhenFetchArtifactIsFromAnyAncestorStage_s_predecessorStage__onTheUpstreamPipeline() { uppestStream.getStage("uppest-stage1").jobConfigByConfigName("uppest-job1").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage1"), new CaseInsensitiveString("uppest-job1"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void validate_shouldNotErrorWhenReferencingFilePipelineFromConfigRepositoryPipeline() { uppestStream.getStage("uppest-stage2").jobConfigByConfigName("uppest-job2").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); uppestStream.setOrigin(new FileConfigOrigin()); downstream.setOrigin(new RepoConfigOrigin()); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage2"), new CaseInsensitiveString("uppest-job2"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void validate_shouldNotErrorWhenReferencingFilePipelineFromFilePipeline() { uppestStream.getStage("uppest-stage2").jobConfigByConfigName("uppest-job2").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); uppestStream.setOrigin(new FileConfigOrigin()); downstream.setOrigin(new FileConfigOrigin()); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage2"), new CaseInsensitiveString("uppest-job2"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void validate_shouldNotErrorWhenReferencingConfigRepositoryPipelineFromConfigRepositoryPipeline() { uppestStream.getStage("uppest-stage2").jobConfigByConfigName("uppest-job2").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); uppestStream.setOrigin(new RepoConfigOrigin()); downstream.setOrigin(new RepoConfigOrigin()); config.setArtifactStores(new ArtifactStores(new ArtifactStore("s3", "foo.plugin"))); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage2"), new CaseInsensitiveString("uppest-job2"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }
@Test public void should_NOT_BeValidWhen_ImmediateParentDeclaredInPathFromAncestor_isNotAParentPipeline() { uppestStream.getStage("uppest-stage1").jobConfigByConfigName("uppest-job1").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); PipelineConfig upstreamsPeer = config.pipelineConfigByName(new CaseInsensitiveString("upstreams_peer")); upstreamsPeer.setMaterialConfigs(new MaterialConfigs(MaterialConfigsMother.dependencyMaterialConfig("uppest_stream", "uppest-stage1"))); upstreamsPeer.add(StageConfigMother.stageConfig("peer-stage", new JobConfigs(new JobConfig("peer-job")))); downstream = config.pipelineConfigByName(new CaseInsensitiveString("downstream")); downstream.setMaterialConfigs(new MaterialConfigs(MaterialConfigsMother.dependencyMaterialConfig("upstream", "up-stage1"), MaterialConfigsMother.dependencyMaterialConfig("upstreams_peer", "peer-stage"))); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("upstream/uppest_stream"), new CaseInsensitiveString("up-stage1"), new CaseInsensitiveString("up-job1"), "s3"); StageConfig stage = downstream.getStage(new CaseInsensitiveString("stage")); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, stage, stage.getJobs().get(0))); assertThat(task.errors().isEmpty(), is(false)); assertThat(task.errors().on(FetchTask.PIPELINE_NAME), is("Pipeline named 'uppest_stream' exists, but is not an ancestor of 'downstream' as declared in 'upstream/uppest_stream'.")); }
@Test public void should_NOT_BeValidWhen_stageMayNotHaveRunViaTheGivenPath_evenThoughItMayHaveActuallyRunAccordingToAnAlternatePath() { uppestStream.getStage("uppest-stage1").jobConfigByConfigName("uppest-job1").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); PipelineConfig upstreamsPeer = config.pipelineConfigByName(new CaseInsensitiveString("upstreams_peer")); upstreamsPeer.setMaterialConfigs(new MaterialConfigs(MaterialConfigsMother.dependencyMaterialConfig("uppest_stream", "uppest-stage1"))); upstreamsPeer.add(StageConfigMother.stageConfig("peer-stage", new JobConfigs(new JobConfig("peer-job")))); downstream = config.pipelineConfigByName(new CaseInsensitiveString("downstream")); downstream.setMaterialConfigs(new MaterialConfigs(MaterialConfigsMother.dependencyMaterialConfig("upstream", "up-stage1"), MaterialConfigsMother.dependencyMaterialConfig("upstreams_peer", "peer-stage"))); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstreams_peer"), new CaseInsensitiveString("uppest-stage1"), new CaseInsensitiveString("uppest-job1"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")), downstream.getStage(new CaseInsensitiveString("stage")).getJobs().first())); assertThat(task.errors().isEmpty(), is(true)); task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstreams_peer"), new CaseInsensitiveString("uppest-stage2"), new CaseInsensitiveString("uppest-job2"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")), downstream.getStage(new CaseInsensitiveString("stage")).getJobs().first())); assertThat(task.errors().isEmpty(), is(false)); assertThat(task.errors().on(FetchTask.STAGE), is("\"downstream :: stage :: job\" tries to fetch artifact from stage \"uppest_stream :: uppest-stage2\" which does not complete before \"downstream\" pipeline's dependencies.")); }
@Test public void should_BeValidWhen_hasAnAlternatePathToAncestor() { uppestStream.getStage("uppest-stage1").jobConfigByConfigName("uppest-job1").artifactConfigs() .add(new PluggableArtifactConfig("s3", "cd.go.s3")); PipelineConfig upstreamsPeer = config.pipelineConfigByName(new CaseInsensitiveString("upstreams_peer")); upstreamsPeer.setMaterialConfigs(new MaterialConfigs(MaterialConfigsMother.dependencyMaterialConfig("uppest_stream", "uppest-stage1"))); upstreamsPeer.add(StageConfigMother.stageConfig("peer-stage", new JobConfigs(new JobConfig("peer-job")))); downstream = config.pipelineConfigByName(new CaseInsensitiveString("downstream")); downstream.setMaterialConfigs(new MaterialConfigs(MaterialConfigsMother.dependencyMaterialConfig("upstream", "up-stage1"), MaterialConfigsMother.dependencyMaterialConfig("upstreams_peer", "peer-stage"))); FetchPluggableArtifactTask task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstream"), new CaseInsensitiveString("uppest-stage1"), new CaseInsensitiveString("uppest-job1"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); task = new FetchPluggableArtifactTask(new CaseInsensitiveString("uppest_stream/upstreams_peer"), new CaseInsensitiveString("uppest-stage1"), new CaseInsensitiveString("uppest-job1"), "s3"); task.validate(ConfigSaveValidationContext.forChain(config, new BasicPipelineConfigs(), downstream, downstream.getStage(new CaseInsensitiveString("stage")))); assertThat(task.errors().isEmpty(), is(true)); }