diff --git a/app/scripts/modules/cloudfoundry/src/pipeline/stages/deployService/CloudfoundryDeployServiceStageConfig.tsx b/app/scripts/modules/cloudfoundry/src/pipeline/stages/deployService/CloudfoundryDeployServiceStageConfig.tsx index 6f9615c25b4..fcc01bd57d9 100644 --- a/app/scripts/modules/cloudfoundry/src/pipeline/stages/deployService/CloudfoundryDeployServiceStageConfig.tsx +++ b/app/scripts/modules/cloudfoundry/src/pipeline/stages/deployService/CloudfoundryDeployServiceStageConfig.tsx @@ -11,6 +11,7 @@ import { StageConfigField, StageArtifactSelector, IArtifact, + ArtifactTypePatterns, } from '@spinnaker/core'; import { CreateServiceInstanceDirectInput } from './CreateServiceInstanceDirectInput'; @@ -148,6 +149,11 @@ export class CloudfoundryDeployServiceStageConfig extends React.Component< pipeline={pipeline} stage={stage} expectedArtifactId={manifest.artifactId} + excludedArtifactTypePatterns={[ + ArtifactTypePatterns.KUBERNETES, + ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE, + ArtifactTypePatterns.DOCKER_IMAGE, + ]} artifact={manifest.artifact} onExpectedArtifactSelected={this.onExpectedArtifactSelected} onArtifactEdited={this.onArtifactChanged} diff --git a/app/scripts/modules/core/src/artifact/ArtifactTypes.ts b/app/scripts/modules/core/src/artifact/ArtifactTypes.ts index 4afd1c921d3..7d1b5afb535 100644 --- a/app/scripts/modules/core/src/artifact/ArtifactTypes.ts +++ b/app/scripts/modules/core/src/artifact/ArtifactTypes.ts @@ -1,4 +1,8 @@ -export const ArtifactTypePatterns = { +export interface IArtifactTypePatterns { + [typeName: string]: RegExp; +} + +export const ArtifactTypePatterns: IArtifactTypePatterns = { BITBUCKET_FILE: /bitbucket\/file/, DOCKER_IMAGE: /docker\/image/, EMBEDDED_BASE64: /embedded\/base64/, @@ -15,3 +19,8 @@ export const ArtifactTypePatterns = { HTTP_FILE: /http\/file/, FRONT50_PIPELINE_TEMPLATE: /front50\/pipelineTemplate/, }; + +export const excludeAllTypesExcept = (...types: RegExp[]) => + Object.keys(ArtifactTypePatterns) + .map(k => ArtifactTypePatterns[k]) + .filter(type => !types.includes(type)); diff --git a/app/scripts/modules/core/src/artifact/react/ExpectedArtifactModal.tsx b/app/scripts/modules/core/src/artifact/react/ExpectedArtifactModal.tsx index 3ae094ead89..ec5cc7c57b7 100644 --- a/app/scripts/modules/core/src/artifact/react/ExpectedArtifactModal.tsx +++ b/app/scripts/modules/core/src/artifact/react/ExpectedArtifactModal.tsx @@ -17,11 +17,13 @@ export interface IExpectedArtifactModalProps extends IModalComponentProps { expectedArtifact?: IExpectedArtifact; pipeline: IPipeline; excludedArtifactTypePatterns?: RegExp[]; + excludedDefaultArtifactTypePatterns?: RegExp[]; } export interface IExpectedArtifactModalState { taskMonitor: TaskMonitor; - artifactAccounts: IArtifactAccount[]; + matchArtifactAccounts: IArtifactAccount[]; + defaultArtifactAccounts: IArtifactAccount[]; } export class ExpectedArtifactModal extends React.Component { @@ -29,7 +31,8 @@ export class ExpectedArtifactModal extends React.Component { this.setState({ - artifactAccounts: excludedPatterns + matchArtifactAccounts: excludedArtifactTypePatterns ? artifactAccounts.filter( - account => !account.types.some(typ => excludedPatterns.some(typPattern => typPattern.test(typ))), + account => + !account.types.some(typ => excludedArtifactTypePatterns.some(typPattern => typPattern.test(typ))), + ) + : artifactAccounts, + defaultArtifactAccounts: excludedDefaultArtifactTypePatterns + ? artifactAccounts.filter( + account => + !account.types.some(typ => + excludedDefaultArtifactTypePatterns.some(typPattern => typPattern.test(typ)), + ), ) : artifactAccounts, }); @@ -63,7 +75,7 @@ export class ExpectedArtifactModal extends React.Component heading="Expected Artifact" @@ -95,7 +107,7 @@ export class ExpectedArtifactModal extends React.Component this.editArtifact(formik, 'matchArtifact', artifact)} isDefault={false} /> @@ -126,7 +138,7 @@ export class ExpectedArtifactModal extends React.Component this.editArtifact(formik, 'defaultArtifact', artifact)} isDefault={true} /> diff --git a/app/scripts/modules/core/src/domain/ITrigger.ts b/app/scripts/modules/core/src/domain/ITrigger.ts index 7bbe2ff51af..8a08bfe86f5 100644 --- a/app/scripts/modules/core/src/domain/ITrigger.ts +++ b/app/scripts/modules/core/src/domain/ITrigger.ts @@ -7,6 +7,7 @@ export interface ITrigger { type: string; expectedArtifactIds?: string[]; // uuid references to ExpectedArtifacts defined in the Pipeline. runAsUser?: string; + excludedArtifactTypePatterns?: RegExp[]; } export interface IArtifactoryTrigger extends ITrigger { diff --git a/app/scripts/modules/core/src/domain/ITriggerTypeConfig.ts b/app/scripts/modules/core/src/domain/ITriggerTypeConfig.ts index 36a165ce7b1..2a4dec7d895 100644 --- a/app/scripts/modules/core/src/domain/ITriggerTypeConfig.ts +++ b/app/scripts/modules/core/src/domain/ITriggerTypeConfig.ts @@ -11,4 +11,5 @@ export interface IExecutionTriggerStatusComponentProps { export interface ITriggerTypeConfig extends IStageOrTriggerTypeConfig { executionStatusComponent?: React.ComponentType; executionTriggerLabel?: (trigger: ITrigger) => string; + excludedArtifactTypePatterns?: RegExp[]; } diff --git a/app/scripts/modules/core/src/pipeline/config/stages/producesArtifacts/ProducesArtifacts.tsx b/app/scripts/modules/core/src/pipeline/config/stages/producesArtifacts/ProducesArtifacts.tsx index 4184947b0bf..6bec10bb1b6 100644 --- a/app/scripts/modules/core/src/pipeline/config/stages/producesArtifacts/ProducesArtifacts.tsx +++ b/app/scripts/modules/core/src/pipeline/config/stages/producesArtifacts/ProducesArtifacts.tsx @@ -27,6 +27,7 @@ export const ProducesArtifacts: React.SFC = props => { expectedArtifact: artifact, pipeline: pipeline, excludedArtifactTypePatterns: excludedArtifactTypePatterns, + excludedDefaultArtifactTypePatterns: excludedArtifactTypePatterns, }).then((editedArtifact: IExpectedArtifact) => { const editIndex = produces.findIndex(a => a.id === editedArtifact.id); const producesAfterEdit = produces.slice(0); @@ -39,6 +40,7 @@ export const ProducesArtifacts: React.SFC = props => { ExpectedArtifactModal.show({ pipeline: pipeline, excludedArtifactTypePatterns: excludedArtifactTypePatterns, + excludedDefaultArtifactTypePatterns: excludedArtifactTypePatterns, }).then((artifact: IExpectedArtifact) => { const producesAfterNew = produces.slice(0); producesAfterNew.push(artifact); diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/artifactory/artifactoryTrigger.ts b/app/scripts/modules/core/src/pipeline/config/triggers/artifactory/artifactoryTrigger.ts index 200a555d9ee..359f1ef3fa5 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/artifactory/artifactoryTrigger.ts +++ b/app/scripts/modules/core/src/pipeline/config/triggers/artifactory/artifactoryTrigger.ts @@ -1,5 +1,6 @@ import { Registry } from 'core/registry'; import { ArtifactoryTriggerConfig } from './ArtifactoryTriggerConfig'; +import { ArtifactTypePatterns, excludeAllTypesExcept } from 'core/artifact'; Registry.pipeline.registerTrigger({ label: 'Artifactory', @@ -7,4 +8,5 @@ Registry.pipeline.registerTrigger({ key: 'artifactory', component: ArtifactoryTriggerConfig, validators: [], + excludedArtifactTypePatterns: excludeAllTypesExcept(ArtifactTypePatterns.MAVEN_FILE), }); diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/TriggerArtifactConstraintSelector.tsx b/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/TriggerArtifactConstraintSelector.tsx index 0c43416452c..9145153dc6a 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/TriggerArtifactConstraintSelector.tsx +++ b/app/scripts/modules/core/src/pipeline/config/triggers/artifacts/TriggerArtifactConstraintSelector.tsx @@ -6,44 +6,63 @@ import Select from 'react-select'; import { react2angular } from 'react2angular'; import { ArtifactTypePatterns, ExpectedArtifactModal, ExpectedArtifactService } from 'core/artifact'; -import { IExpectedArtifact, IPipeline } from 'core/domain'; +import { IExpectedArtifact, IPipeline, ITrigger } from 'core/domain'; +import { Registry } from 'core/registry'; export interface ITriggerArtifactConstraintSelectorProps { pipeline: IPipeline; - artifactReferer: any; // the object referring to a set of expected artifacts + trigger: ITrigger; selected?: string[]; // expected artifact ids onDefineExpectedArtifact: (artifact: IExpectedArtifact) => void; onChangeSelected: (selected: string[], referer: any) => void; } export class TriggerArtifactConstraintSelector extends React.Component { + private defaultExcludedArtifactTypePatterns = [ + ArtifactTypePatterns.KUBERNETES, + ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE, + ]; + + private excludedArtifactTypes = () => { + const triggerConfig = Registry.pipeline + .getTriggerTypes() + .filter(config => config.key === this.props.trigger.type) + .pop(); + return this.defaultExcludedArtifactTypePatterns.concat( + (triggerConfig && triggerConfig.excludedArtifactTypePatterns) || [], + ); + }; + private handleChange = (index: number, selectedArtifact: IExpectedArtifact) => { if (selectedArtifact.id === '__create.new.artifact') { ExpectedArtifactModal.show({ pipeline: this.props.pipeline, - excludedArtifactTypePatterns: [ArtifactTypePatterns.KUBERNETES, ArtifactTypePatterns.FRONT50_PIPELINE_TEMPLATE], + excludedArtifactTypePatterns: this.excludedArtifactTypes(), + excludedDefaultArtifactTypePatterns: this.defaultExcludedArtifactTypePatterns, }).then(this.props.onDefineExpectedArtifact); return; } const selected = (this.props.selected || []).slice(0); selected[index] = selectedArtifact.id; - this.props.onChangeSelected(selected, this.props.artifactReferer); + this.props.onChangeSelected(selected, this.props.trigger); }; private removeExpectedArtifact = (artifact: IExpectedArtifact) => { const selected = (this.props.selected || []).slice(0); selected.splice(selected.findIndex(artifactId => artifact.id === artifactId), 1); - this.props.onChangeSelected(selected, this.props.artifactReferer); + this.props.onChangeSelected(selected, this.props.trigger); }; private editExpectedArtifact = (artifact: IExpectedArtifact) => { ExpectedArtifactModal.show({ expectedArtifact: artifact, pipeline: this.props.pipeline, + excludedArtifactTypePatterns: this.excludedArtifactTypes(), + excludedDefaultArtifactTypePatterns: this.defaultExcludedArtifactTypePatterns, }).then((editedArtifact: IExpectedArtifact) => { this.props.onDefineExpectedArtifact(editedArtifact); - this.props.onChangeSelected(this.props.selected, this.props.artifactReferer); + this.props.onChangeSelected(this.props.selected, this.props.trigger); }); }; @@ -102,7 +121,7 @@ module(TRIGGER_ARTIFACT_CONSTRAINT_SELECTOR_REACT, []).component( 'triggerArtifactConstraintSelectorReact', react2angular(TriggerArtifactConstraintSelector, [ 'pipeline', - 'artifactReferer', + 'trigger', 'selected', 'onDefineExpectedArtifact', 'onChangeSelected', diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/concourse/concourseTrigger.ts b/app/scripts/modules/core/src/pipeline/config/triggers/concourse/concourseTrigger.ts index 365ba5bce3c..3a3a7825058 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/concourse/concourseTrigger.ts +++ b/app/scripts/modules/core/src/pipeline/config/triggers/concourse/concourseTrigger.ts @@ -1,11 +1,13 @@ import { Registry } from 'core/registry'; import { ConcourseTriggerConfig } from './ConcourseTriggerConfig'; +import { ArtifactTypePatterns } from 'core/artifact'; Registry.pipeline.registerTrigger({ label: 'Concourse', description: 'Listens to a Concourse job', key: 'concourse', component: ConcourseTriggerConfig, + excludedArtifactTypePatterns: [ArtifactTypePatterns.JENKINS_FILE], validators: [ { type: 'requiredField', diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/cron/cronTrigger.module.js b/app/scripts/modules/core/src/pipeline/config/triggers/cron/cronTrigger.module.js index ef02c424633..7dcc09e0690 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/cron/cronTrigger.module.js +++ b/app/scripts/modules/core/src/pipeline/config/triggers/cron/cronTrigger.module.js @@ -2,6 +2,7 @@ const angular = require('angular'); +import { ArtifactTypePatterns } from 'core/artifact'; import { UUIDGenerator } from 'core/utils/uuid.service'; import { Registry } from 'core/registry'; import { ServiceAccountReader } from 'core/serviceAccount/ServiceAccountReader'; @@ -24,6 +25,7 @@ module.exports = angular controllerAs: 'vm', templateUrl: require('./cronTrigger.html'), executionTriggerLabel: trigger => trigger.cronExpression, + excludedArtifactTypePatterns: [ArtifactTypePatterns.JENKINS_FILE], validators: [ { type: 'serviceAccountAccess', diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/git/git.trigger.ts b/app/scripts/modules/core/src/pipeline/config/triggers/git/git.trigger.ts index cb3d688523b..7b985e0a05f 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/git/git.trigger.ts +++ b/app/scripts/modules/core/src/pipeline/config/triggers/git/git.trigger.ts @@ -1,6 +1,7 @@ import { IController, IScope, module } from 'angular'; import { has, trim } from 'lodash'; +import { ArtifactTypePatterns, excludeAllTypesExcept } from 'core/artifact'; import { SETTINGS } from 'core/config/settings'; import { IGitTrigger } from 'core/domain/ITrigger'; import { Registry } from 'core/registry'; @@ -76,6 +77,11 @@ module(GIT_TRIGGER, []) controllerAs: 'vm', templateUrl: require('./gitTrigger.html'), executionStatusComponent: GitTriggerExecutionStatus, + excludedArtifactTypePatterns: excludeAllTypesExcept( + ArtifactTypePatterns.GITHUB_FILE, + ArtifactTypePatterns.GITLAB_FILE, + ArtifactTypePatterns.BITBUCKET_FILE, + ), validators: [ { type: 'serviceAccountAccess', diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/pipeline/pipelineTrigger.module.js b/app/scripts/modules/core/src/pipeline/config/triggers/pipeline/pipelineTrigger.module.js index ed4be08b415..88971444871 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/pipeline/pipelineTrigger.module.js +++ b/app/scripts/modules/core/src/pipeline/config/triggers/pipeline/pipelineTrigger.module.js @@ -3,6 +3,7 @@ import _ from 'lodash'; const angular = require('angular'); +import { ArtifactTypePatterns } from 'core/artifact'; import { ServiceAccountReader } from 'core/serviceAccount/ServiceAccountReader'; import { ApplicationReader } from 'core/application/service/ApplicationReader'; import { PipelineConfigService } from 'core/pipeline/config/services/PipelineConfigService'; @@ -23,6 +24,7 @@ module.exports = angular templateUrl: require('./pipelineTrigger.html'), manualExecutionComponent: PipelineTriggerTemplate, executionStatusComponent: ExecutionUserStatus, + excludedArtifactTypePatterns: [ArtifactTypePatterns.JENKINS_FILE], executionTriggerLabel: () => 'Pipeline', }); }) diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/pubsub/pubsub.trigger.ts b/app/scripts/modules/core/src/pipeline/config/triggers/pubsub/pubsub.trigger.ts index 67cb85f70b8..757925ec69f 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/pubsub/pubsub.trigger.ts +++ b/app/scripts/modules/core/src/pipeline/config/triggers/pubsub/pubsub.trigger.ts @@ -1,5 +1,6 @@ import { IController, module } from 'angular'; +import { ArtifactTypePatterns } from 'core/artifact'; import { IPubsubSubscription, IPubsubTrigger } from 'core/domain'; import { PubsubSubscriptionReader } from 'core/pubsub'; import { Registry } from 'core/registry'; @@ -50,6 +51,7 @@ module(PUBSUB_TRIGGER, []) controller: 'PubsubTriggerCtrl', controllerAs: 'vm', templateUrl: require('./pubsubTrigger.html'), + excludedArtifactTypePatterns: [ArtifactTypePatterns.JENKINS_FILE], validators: [], }); }) diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/travis/travisTrigger.module.ts b/app/scripts/modules/core/src/pipeline/config/triggers/travis/travisTrigger.module.ts index 03204a9270e..7c03cec332d 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/travis/travisTrigger.module.ts +++ b/app/scripts/modules/core/src/pipeline/config/triggers/travis/travisTrigger.module.ts @@ -1,11 +1,12 @@ import { IController, IScope, module } from 'angular'; +import { ArtifactTypePatterns } from 'core/artifact'; import { IgorService, BuildServiceType } from 'core/ci/igor.service'; import { Registry } from 'core/registry'; import { ServiceAccountReader } from 'core/serviceAccount/ServiceAccountReader'; import { IBuildTrigger } from 'core/domain/ITrigger'; -import { SETTINGS } from 'core/config/settings'; +import { SETTINGS } from 'core/config/settings'; import { TravisTriggerTemplate } from './TravisTriggerTemplate'; export interface ITravisTriggerViewState { @@ -90,6 +91,7 @@ module(TRAVIS_TRIGGER, [require('../trigger.directive').name]) templateUrl: require('./travisTrigger.html'), manualExecutionComponent: TravisTriggerTemplate, providesVersionForBake: true, + excludedArtifactTypePatterns: [ArtifactTypePatterns.JENKINS_FILE], validators: [ { type: 'requiredField', diff --git a/app/scripts/modules/core/src/pipeline/config/triggers/trigger.html b/app/scripts/modules/core/src/pipeline/config/triggers/trigger.html index b9e0cb80caa..12c401040de 100644 --- a/app/scripts/modules/core/src/pipeline/config/triggers/trigger.html +++ b/app/scripts/modules/core/src/pipeline/config/triggers/trigger.html @@ -65,7 +65,7 @@