UNPKG

aws-cdk-lib

Version:

Version 2 of the AWS Cloud Development Kit library

439 lines (438 loc) 15.4 kB
import { Construct } from 'constructs'; import { IAction, IPipeline, IStage, PipelineNotifyOnOptions } from './action'; import { FullActionDescriptor } from './private/full-action-descriptor'; import { Stage } from './private/stage'; import { Trigger, TriggerProps } from './trigger'; import { Variable } from './variable'; import * as notifications from '../../aws-codestarnotifications'; import * as events from '../../aws-events'; import * as iam from '../../aws-iam'; import * as s3 from '../../aws-s3'; import { Resource, Stack } from '../../core'; /** * Allows you to control where to place a new Stage when it's added to the Pipeline. * Note that you can provide only one of the below properties - * specifying more than one will result in a validation error. * * @see #rightBefore * @see #justAfter */ export interface StagePlacement { /** * Inserts the new Stage as a parent of the given Stage * (changing its current parent Stage, if it had one). */ readonly rightBefore?: IStage; /** * Inserts the new Stage as a child of the given Stage * (changing its current child Stage, if it had one). */ readonly justAfter?: IStage; } /** * Construction properties of a Pipeline Stage. */ export interface StageProps { /** * The physical, human-readable name to assign to this Pipeline Stage. */ readonly stageName: string; /** * The list of Actions to create this Stage with. * You can always add more Actions later by calling `IStage#addAction`. */ readonly actions?: IAction[]; /** * Whether to enable transition to this stage. * * @default true */ readonly transitionToEnabled?: boolean; /** * The reason for disabling transition to this stage. Only applicable * if `transitionToEnabled` is set to `false`. * * @default 'Transition disabled' */ readonly transitionDisabledReason?: string; } export interface StageOptions extends StageProps { readonly placement?: StagePlacement; } /** * Pipeline types. */ export declare enum PipelineType { /** * V1 type */ V1 = "V1", /** * V2 type */ V2 = "V2" } /** * Execution mode. */ export declare enum ExecutionMode { /** * QUEUED mode. * * Executions are processed one by one in the order that they are queued. * * This requires pipeline type V2. */ QUEUED = "QUEUED", /** * SUPERSEDED mode. * * A more recent execution can overtake an older one. * * This is the default. */ SUPERSEDED = "SUPERSEDED", /** * PARALLEL mode. * * In PARALLEL mode, executions run simultaneously and independently of one * another. Executions don't wait for other runs to complete before starting * or finishing. * * This requires pipeline type V2. */ PARALLEL = "PARALLEL" } export interface PipelineProps { /** * The S3 bucket used by this Pipeline to store artifacts. * * @default - A new S3 bucket will be created. */ readonly artifactBucket?: s3.IBucket; /** * The IAM role to be assumed by this Pipeline. * * @default a new IAM role will be created. */ readonly role?: iam.IRole; /** * Indicates whether to rerun the AWS CodePipeline pipeline after you update it. * * @default false */ readonly restartExecutionOnUpdate?: boolean; /** * Name of the pipeline. * * @default - AWS CloudFormation generates an ID and uses that for the pipeline name. */ readonly pipelineName?: string; /** * A map of region to S3 bucket name used for cross-region CodePipeline. * For every Action that you specify targeting a different region than the Pipeline itself, * if you don't provide an explicit Bucket for that region using this property, * the construct will automatically create a Stack containing an S3 Bucket in that region. * * @default - None. */ readonly crossRegionReplicationBuckets?: { [region: string]: s3.IBucket; }; /** * The list of Stages, in order, * to create this Pipeline with. * You can always add more Stages later by calling `Pipeline#addStage`. * * @default - None. */ readonly stages?: StageProps[]; /** * Create KMS keys for cross-account deployments. * * This controls whether the pipeline is enabled for cross-account deployments. * * By default cross-account deployments are enabled, but this feature requires * that KMS Customer Master Keys are created which have a cost of $1/month. * * If you do not need cross-account deployments, you can set this to `false` to * not create those keys and save on that cost (the artifact bucket will be * encrypted with an AWS-managed key). However, cross-account deployments will * no longer be possible. * * @default false - false if the feature flag `CODEPIPELINE_CROSS_ACCOUNT_KEYS_DEFAULT_VALUE_TO_FALSE` * is true, true otherwise */ readonly crossAccountKeys?: boolean; /** * Enable KMS key rotation for the generated KMS keys. * * By default KMS key rotation is disabled, but will add an additional $1/month * for each year the key exists when enabled. * * @default - false (key rotation is disabled) */ readonly enableKeyRotation?: boolean; /** * Reuse the same cross region support stack for all pipelines in the App. * * @default - true (Use the same support stack for all pipelines in App) */ readonly reuseCrossRegionSupportStacks?: boolean; /** * Type of the pipeline. * * @default - PipelineType.V2 if the feature flag `CODEPIPELINE_DEFAULT_PIPELINE_TYPE_TO_V2` * is true, PipelineType.V1 otherwise * * @see https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html */ readonly pipelineType?: PipelineType; /** * A list that defines the pipeline variables for a pipeline resource. * * `variables` can only be used when `pipelineType` is set to `PipelineType.V2`. * You can always add more variables later by calling `Pipeline#addVariable`. * * @default - No variables */ readonly variables?: Variable[]; /** * The trigger configuration specifying a type of event, such as Git tags, that * starts the pipeline. * * When a trigger configuration is specified, default change detection for repository * and branch commits is disabled. * * `triggers` can only be used when `pipelineType` is set to `PipelineType.V2`. * You can always add more triggers later by calling `Pipeline#addTrigger`. * * @default - No triggers */ readonly triggers?: TriggerProps[]; /** * The method that the pipeline will use to handle multiple executions. * * @default - ExecutionMode.SUPERSEDED */ readonly executionMode?: ExecutionMode; } declare abstract class PipelineBase extends Resource implements IPipeline { abstract readonly pipelineName: string; abstract readonly pipelineArn: string; /** * Defines an event rule triggered by this CodePipeline. * * @param id Identifier for this event handler. * @param options Additional options to pass to the event rule. */ onEvent(id: string, options?: events.OnEventOptions): events.Rule; /** * Defines an event rule triggered by the "CodePipeline Pipeline Execution * State Change" event emitted from this pipeline. * * @param id Identifier for this event handler. * @param options Additional options to pass to the event rule. */ onStateChange(id: string, options?: events.OnEventOptions): events.Rule; bindAsNotificationRuleSource(_scope: Construct): notifications.NotificationRuleSourceConfig; notifyOn(id: string, target: notifications.INotificationRuleTarget, options: PipelineNotifyOnOptions): notifications.INotificationRule; notifyOnExecutionStateChange(id: string, target: notifications.INotificationRuleTarget, options?: notifications.NotificationRuleOptions): notifications.INotificationRule; notifyOnAnyStageStateChange(id: string, target: notifications.INotificationRuleTarget, options?: notifications.NotificationRuleOptions): notifications.INotificationRule; notifyOnAnyActionStateChange(id: string, target: notifications.INotificationRuleTarget, options?: notifications.NotificationRuleOptions): notifications.INotificationRule; notifyOnAnyManualApprovalStateChange(id: string, target: notifications.INotificationRuleTarget, options?: notifications.NotificationRuleOptions): notifications.INotificationRule; } /** * An AWS CodePipeline pipeline with its associated IAM role and S3 bucket. * * @example * // create a pipeline * import * as codecommit from 'aws-cdk-lib/aws-codecommit'; * * const pipeline = new codepipeline.Pipeline(this, 'Pipeline'); * * // add a stage * const sourceStage = pipeline.addStage({ stageName: 'Source' }); * * // add a source action to the stage * declare const repo: codecommit.Repository; * declare const sourceArtifact: codepipeline.Artifact; * sourceStage.addAction(new codepipeline_actions.CodeCommitSourceAction({ * actionName: 'Source', * output: sourceArtifact, * repository: repo, * })); * * // ... add more stages */ export declare class Pipeline extends PipelineBase { /** * Import a pipeline into this app. * * @param scope the scope into which to import this pipeline * @param id the logical ID of the returned pipeline construct * @param pipelineArn The ARN of the pipeline (e.g. `arn:aws:codepipeline:us-east-1:123456789012:MyDemoPipeline`) */ static fromPipelineArn(scope: Construct, id: string, pipelineArn: string): IPipeline; /** * The IAM role AWS CodePipeline will use to perform actions or assume roles for actions with * a more specific IAM role. */ readonly role: iam.IRole; /** * ARN of this pipeline */ readonly pipelineArn: string; /** * The name of the pipeline */ readonly pipelineName: string; /** * The version of the pipeline * * @attribute */ readonly pipelineVersion: string; /** * Bucket used to store output artifacts */ readonly artifactBucket: s3.IBucket; private readonly _stages; private readonly crossRegionBucketsPassed; private readonly _crossRegionSupport; private readonly _crossAccountSupport; private readonly crossAccountKeys; private readonly enableKeyRotation?; private readonly reuseCrossRegionSupportStacks; private readonly codePipeline; private readonly pipelineType; private readonly variables; private readonly triggers; constructor(scope: Construct, id: string, props?: PipelineProps); /** * Creates a new Stage, and adds it to this Pipeline. * * @param props the creation properties of the new Stage * @returns the newly created Stage */ addStage(props: StageOptions): IStage; /** * Adds a statement to the pipeline role. */ addToRolePolicy(statement: iam.PolicyStatement): void; /** * Adds a new Variable to this Pipeline. * * @param variable Variable instance to add to this Pipeline * @returns the newly created variable */ addVariable(variable: Variable): Variable; /** * Adds a new Trigger to this Pipeline. * * @param props Trigger property to add to this Pipeline * @returns the newly created trigger */ addTrigger(props: TriggerProps): Trigger; /** * Get the number of Stages in this Pipeline. */ get stageCount(): number; /** * Returns the stages that comprise the pipeline. * * **Note**: the returned array is a defensive copy, * so adding elements to it has no effect. * Instead, use the `addStage` method if you want to add more stages * to the pipeline. */ get stages(): IStage[]; /** * Access one of the pipeline's stages by stage name */ stage(stageName: string): IStage; /** * Returns all of the `CrossRegionSupportStack`s that were generated automatically * when dealing with Actions that reside in a different region than the Pipeline itself. * */ get crossRegionSupport(): { [region: string]: CrossRegionSupport; }; /** @internal */ _attachActionToPipeline(stage: Stage, action: IAction, actionScope: Construct): FullActionDescriptor; /** * Validate the pipeline structure * * Validation happens according to the rules documented at * * https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-pipeline-structure.html#pipeline-requirements */ private validatePipeline; private ensureReplicationResourcesExistFor; /** * Get or create the cross-region support construct for the given action */ private obtainCrossRegionSupportFor; private createSupportResourcesForRegion; private getCrossRegionSupportSynthesizer; private generateNameForDefaultBucketKeyAlias; /** * Gets the role used for this action, * including handling the case when the action is supposed to be cross-account. * * @param stage the stage the action belongs to * @param action the action to return/create a role for * @param actionScope the scope, unique to the action, to create new resources in */ private getRoleForAction; private getRoleFromActionPropsOrGenerateIfCrossAccount; /** * Returns the Stack this Action belongs to if this is a cross-account Action. * If this Action is not cross-account (i.e., it lives in the same account as the Pipeline), * it returns undefined. * * @param action the Action to return the Stack for */ private getOtherStackIfActionIsCrossAccount; private isAwsOwned; private getArtifactBucketFromProps; private calculateInsertIndexFromPlacement; private findStageIndex; private validateSourceActionLocations; private validateHasStages; private validateStages; private validateArtifacts; private validateVariables; private validateTriggers; private renderArtifactStoresProperty; private renderArtifactStoreProperty; private renderPrimaryArtifactStore; private renderArtifactStore; private get crossRegion(); private renderStages; private renderDisabledTransitions; private renderVariables; private renderTriggers; private requireRegion; private supportScope; } /** * An interface representing resources generated in order to support * the cross-region capabilities of CodePipeline. * You get instances of this interface from the `Pipeline#crossRegionSupport` property. * */ export interface CrossRegionSupport { /** * The Stack that has been created to house the replication Bucket * required for this region. */ readonly stack: Stack; /** * The replication Bucket used by CodePipeline to operate in this region. * Belongs to `stack`. */ readonly replicationBucket: s3.IBucket; } export {};