Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(pipelines): Ubuntu 5 images will be slow, move to Ubuntu 6 #24544

Merged
merged 5 commits into from Mar 9, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 4 additions & 3 deletions packages/@aws-cdk/pipelines/lib/codepipeline/codepipeline.ts
Expand Up @@ -22,6 +22,7 @@ import { AssetSingletonRole } from '../private/asset-singleton-role';
import { CachedFnSub } from '../private/cached-fnsub';
import { preferredCliVersion } from '../private/cli-version';
import { appOf, assemblyBuilderOf, embeddedAsmPath, obtainScope } from '../private/construct-internals';
import { CDKP_DEFAULT_CODEBUILD_IMAGE } from '../private/default-codebuild-image';
import { toPosixPath } from '../private/fs';
import { actionName, stackVariableNamespace } from '../private/identifiers';
import { enumerate, flatten, maybeSuffix, noUndefined } from '../private/javascript';
Expand Down Expand Up @@ -145,7 +146,7 @@ export interface CodePipelineProps {
/**
* Customize the CodeBuild projects created for this pipeline
*
* @default - All projects run non-privileged build, SMALL instance, LinuxBuildImage.STANDARD_5_0
* @default - All projects run non-privileged build, SMALL instance, LinuxBuildImage.STANDARD_6_0
*/
readonly codeBuildDefaults?: CodeBuildOptions;

Expand Down Expand Up @@ -245,7 +246,7 @@ export interface CodeBuildOptions {
/**
* Partial build environment, will be combined with other build environments that apply
*
* @default - Non-privileged build, SMALL instance, LinuxBuildImage.STANDARD_5_0
* @default - Non-privileged build, SMALL instance, LinuxBuildImage.STANDARD_6_0
*/
readonly buildEnvironment?: cb.BuildEnvironment;

Expand Down Expand Up @@ -833,7 +834,7 @@ export class CodePipeline extends PipelineBase {
private codeBuildDefaultsFor(nodeType: CodeBuildProjectType): CodeBuildOptions | undefined {
const defaultOptions: CodeBuildOptions = {
buildEnvironment: {
buildImage: cb.LinuxBuildImage.STANDARD_5_0,
buildImage: CDKP_DEFAULT_CODEBUILD_IMAGE,
computeType: cb.ComputeType.SMALL,
},
};
Expand Down
Expand Up @@ -9,6 +9,7 @@ import * as iam from '@aws-cdk/aws-iam';
import { ISynthesisSession, Lazy, Stack, attachCustomSynthesis } from '@aws-cdk/core';
import { IDependable, Construct } from 'constructs';
import { AssetType } from '../../blueprint/asset-type';
import { CDKP_DEFAULT_CODEBUILD_IMAGE } from '../../private/default-codebuild-image';
import { toPosixPath } from '../../private/fs';

/**
Expand Down Expand Up @@ -140,7 +141,7 @@ export class PublishAssetsAction extends Construct implements codepipeline.IActi
const project = new codebuild.PipelineProject(this, 'Default', {
projectName: this.props.projectName,
environment: {
buildImage: codebuild.LinuxBuildImage.STANDARD_5_0,
buildImage: CDKP_DEFAULT_CODEBUILD_IMAGE,
privileged: (props.assetType === AssetType.DOCKER_IMAGE) ? true : undefined,
},
vpc: props.vpc,
Expand Down
Expand Up @@ -7,6 +7,7 @@ import { Stack } from '@aws-cdk/core';
import { Construct } from 'constructs';
import { dockerCredentialsInstallCommands, DockerCredential, DockerCredentialUsage } from '../../docker-credentials';
import { embeddedAsmPath } from '../../private/construct-internals';
import { CDKP_DEFAULT_CODEBUILD_IMAGE } from '../../private/default-codebuild-image';

/**
* Props for the UpdatePipelineAction
Expand Down Expand Up @@ -109,7 +110,7 @@ export class UpdatePipelineAction extends Construct implements codepipeline.IAct
const selfMutationProject = new codebuild.PipelineProject(this, 'SelfMutation', {
projectName: props.projectName,
environment: {
buildImage: codebuild.LinuxBuildImage.STANDARD_5_0,
buildImage: CDKP_DEFAULT_CODEBUILD_IMAGE,
privileged: props.privileged ?? false,
},
buildSpec: props.buildSpec ? codebuild.mergeBuildSpecs(props.buildSpec, buildSpec) : buildSpec,
Expand Down
Expand Up @@ -10,6 +10,7 @@ import { Stack } from '@aws-cdk/core';
import { Construct } from 'constructs';
import { copyEnvironmentVariables, filterEmpty } from './_util';
import { dockerCredentialsInstallCommands, DockerCredential, DockerCredentialUsage } from '../../docker-credentials';
import { CDKP_DEFAULT_CODEBUILD_IMAGE } from '../../private/default-codebuild-image';
import { toPosixPath } from '../../private/fs';

const DEFAULT_OUTPUT_DIR = 'cdk.out';
Expand Down Expand Up @@ -68,7 +69,7 @@ export interface SimpleSynthOptions {
/**
* Build environment to use for CodeBuild job
*
* @default BuildEnvironment.LinuxBuildImage.STANDARD_5_0
* @default BuildEnvironment.LinuxBuildImage.STANDARD_6_0
*/
readonly environment?: codebuild.BuildEnvironment;

Expand Down Expand Up @@ -340,7 +341,7 @@ export class SimpleSynthAction implements codepipeline.IAction, iam.IGrantable {
const testCommands = this.props.testCommands ?? [];
const synthCommand = this.props.synthCommand;

const environment = { buildImage: codebuild.LinuxBuildImage.STANDARD_5_0, ...this.props.environment };
const environment = { buildImage: CDKP_DEFAULT_CODEBUILD_IMAGE, ...this.props.environment };
const osType = (environment.buildImage instanceof codebuild.WindowsBuildImage)
? ec2.OperatingSystemType.WINDOWS
: ec2.OperatingSystemType.LINUX;
Expand Down
Expand Up @@ -5,6 +5,7 @@ import * as ec2 from '@aws-cdk/aws-ec2';
import * as events from '@aws-cdk/aws-events';
import * as iam from '@aws-cdk/aws-iam';
import { Construct } from 'constructs';
import { CDKP_DEFAULT_CODEBUILD_IMAGE } from '../../private/default-codebuild-image';
import { StackOutput } from '../stage';

/**
Expand Down Expand Up @@ -59,7 +60,7 @@ export interface ShellScriptActionProps {
/**
* The CodeBuild environment where scripts are executed.
*
* @default LinuxBuildImage.STANDARD_5_0
* @default LinuxBuildImage.STANDARD_6_0
*/
readonly environment?: codebuild.BuildEnvironment

Expand Down Expand Up @@ -195,7 +196,7 @@ export class ShellScriptAction implements codepipeline.IAction, iam.IGrantable {
}

this._project = new codebuild.PipelineProject(scope, 'Project', {
environment: this.props.environment || { buildImage: codebuild.LinuxBuildImage.STANDARD_5_0 },
environment: this.props.environment || { buildImage: CDKP_DEFAULT_CODEBUILD_IMAGE },
vpc: this.props.vpc,
securityGroups: this.props.securityGroups,
subnetSelection: this.props.subnetSelection,
Expand Down
Expand Up @@ -5,6 +5,7 @@ import * as iam from '@aws-cdk/aws-iam';
import * as lambda from '@aws-cdk/aws-lambda';
import { Duration, Tags } from '@aws-cdk/core';
import { Construct } from 'constructs';
import { CDKP_DEFAULT_CODEBUILD_IMAGE } from './default-codebuild-image';

/**
* Properties for an ApplicationSecurityCheck
Expand Down Expand Up @@ -101,7 +102,7 @@ export class ApplicationSecurityCheck extends Construct {

this.cdkDiffProject = new codebuild.Project(this, 'CDKSecurityCheck', {
environment: {
buildImage: codebuild.LinuxBuildImage.STANDARD_5_0,
buildImage: CDKP_DEFAULT_CODEBUILD_IMAGE,
},
buildSpec: codebuild.BuildSpec.fromObject({
version: 0.2,
Expand Down
@@ -0,0 +1,3 @@
import { LinuxBuildImage } from '@aws-cdk/aws-codebuild';

export const CDKP_DEFAULT_CODEBUILD_IMAGE = LinuxBuildImage.STANDARD_6_0;
@@ -1,5 +1,5 @@
{
"version": "29.0.0",
"version": "30.1.0",
"files": {
"21fbb51d7b23f6a6c262b46a9caee79d744a3ac019fd45422d988b96d44b2a22": {
"source": {
Expand Down
@@ -1,15 +1,15 @@
{
"version": "29.0.0",
"version": "30.1.0",
"files": {
"c1bda7e2c84e91a5658af0b194a4c8918dead52ad783e29acbc3701149e73f45": {
"65c76b51aca7d9a23134ff6f50a78c074f2122615c96f8c8373c6d009f2a1f87": {
"source": {
"path": "PipelineStack.template.json",
"packaging": "file"
},
"destinations": {
"current_account-current_region": {
"bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}",
"objectKey": "c1bda7e2c84e91a5658af0b194a4c8918dead52ad783e29acbc3701149e73f45.json",
"objectKey": "65c76b51aca7d9a23134ff6f50a78c074f2122615c96f8c8373c6d009f2a1f87.json",
"assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}"
}
}
Expand Down
Expand Up @@ -384,7 +384,7 @@
"ProjectName": {
"Ref": "PipelineBuildSynthCdkBuildProject6BEFA8E6"
},
"EnvironmentVariables": "[{\"name\":\"_PROJECT_CONFIG_HASH\",\"type\":\"PLAINTEXT\",\"value\":\"00ebacfb32b1bde8d3638577308e7b7144dfa3b0a58a83bc6ff38a3b1f26951c\"}]"
"EnvironmentVariables": "[{\"name\":\"_PROJECT_CONFIG_HASH\",\"type\":\"PLAINTEXT\",\"value\":\"09deb76d97fe89f2ccd364ad1eedc7ebc7c010be6bf79da68c34f358446cd134\"}]"
},
"InputArtifacts": [
{
Expand Down Expand Up @@ -421,7 +421,7 @@
"ProjectName": {
"Ref": "PipelineUpdatePipelineSelfMutationDAA41400"
},
"EnvironmentVariables": "[{\"name\":\"_PROJECT_CONFIG_HASH\",\"type\":\"PLAINTEXT\",\"value\":\"c0779bd925c3a7f19be75a4973c668d10d00ce3552b882c7d2ba3fa3cee6d976\"}]"
"EnvironmentVariables": "[{\"name\":\"_PROJECT_CONFIG_HASH\",\"type\":\"PLAINTEXT\",\"value\":\"ceff66d3191e2ca3ec1a2711dae97a4541cbf7254c7dcca9acf21e0d12ce37a2\"}]"
},
"InputArtifacts": [
{
Expand Down Expand Up @@ -2168,7 +2168,7 @@
},
"Environment": {
"ComputeType": "BUILD_GENERAL1_SMALL",
"Image": "aws/codebuild/standard:5.0",
"Image": "aws/codebuild/standard:6.0",
"ImagePullCredentialsType": "CODEBUILD",
"PrivilegedMode": false,
"Type": "LINUX_CONTAINER"
Expand Down Expand Up @@ -2481,7 +2481,7 @@
},
"Environment": {
"ComputeType": "BUILD_GENERAL1_SMALL",
"Image": "aws/codebuild/standard:5.0",
"Image": "aws/codebuild/standard:6.0",
"ImagePullCredentialsType": "CODEBUILD",
"PrivilegedMode": false,
"Type": "LINUX_CONTAINER"
Expand Down
@@ -0,0 +1,192 @@
digraph G {
# Arrows represent an "unlocks" relationship (opposite of dependency). So chosen
# because the layout looks more natural that way.
# To represent subgraph dependencies, subgraphs are represented by BEGIN/END nodes.
# To render: `dot -Tsvg PipelineStackPipeline9DB740AF.dot > graph.svg`, open in a browser.
node [shape="box"];
"BEGIN Build" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Build" [shape="cds", style="filled", fillcolor="#b7deff"];
"Build.Synth";
"Source.tkglaser/cdk-pipelines-demo" -> "Build.Synth";
"BEGIN Build" -> "Build.Synth";
"Build.Synth" -> "END Build";
"BEGIN UpdatePipeline" [shape="cds", style="filled", fillcolor="#b7deff"];
"END UpdatePipeline" [shape="cds", style="filled", fillcolor="#b7deff"];
"UpdatePipeline.SelfMutate";
"Build.Synth" -> "UpdatePipeline.SelfMutate";
"BEGIN UpdatePipeline" -> "UpdatePipeline.SelfMutate";
"UpdatePipeline.SelfMutate" -> "END UpdatePipeline";
"BEGIN Beta" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Beta" [shape="cds", style="filled", fillcolor="#b7deff"];
"UpdatePipeline.SelfMutate" -> "BEGIN Beta";
"BEGIN Beta.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Beta.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"Beta.Stack1.Deploy";
"Beta.Stack1.Prepare" -> "Beta.Stack1.Deploy";
"Beta.Stack1.Prepare";
"Build.Synth" -> "Beta.Stack1.Prepare";
"BEGIN Beta.Stack1" -> "Beta.Stack1.Prepare";
"Beta.Stack1.Deploy" -> "END Beta.Stack1";
"BEGIN Beta.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Beta.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Beta.Stack1" -> "BEGIN Beta.Stack2";
"Beta.Stack2.Deploy";
"Beta.Stack2.Prepare" -> "Beta.Stack2.Deploy";
"Beta.Stack2.Prepare";
"Build.Synth" -> "Beta.Stack2.Prepare";
"BEGIN Beta.Stack2" -> "Beta.Stack2.Prepare";
"Beta.Stack2.Deploy" -> "END Beta.Stack2";
"BEGIN Beta" -> "BEGIN Beta.Stack1";
"END Beta.Stack2" -> "END Beta";
"BEGIN Wave1" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave1" [shape="cds", style="filled", fillcolor="#b7deff"];
"UpdatePipeline.SelfMutate" -> "BEGIN Wave1";
"END Beta" -> "BEGIN Wave1";
"BEGIN Wave1.Prod1" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave1.Prod1" [shape="cds", style="filled", fillcolor="#b7deff"];
"BEGIN Wave1.Prod1.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave1.Prod1.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"Wave1.Prod1.Stack1.Deploy";
"Wave1.Prod1.Stack1.Prepare" -> "Wave1.Prod1.Stack1.Deploy";
"Wave1.Prod1.Stack1.Prepare";
"Build.Synth" -> "Wave1.Prod1.Stack1.Prepare";
"BEGIN Wave1.Prod1.Stack1" -> "Wave1.Prod1.Stack1.Prepare";
"Wave1.Prod1.Stack1.Deploy" -> "END Wave1.Prod1.Stack1";
"BEGIN Wave1.Prod1.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave1.Prod1.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave1.Prod1.Stack1" -> "BEGIN Wave1.Prod1.Stack2";
"Wave1.Prod1.Stack2.Deploy";
"Wave1.Prod1.Stack2.Prepare" -> "Wave1.Prod1.Stack2.Deploy";
"Wave1.Prod1.Stack2.Prepare";
"Build.Synth" -> "Wave1.Prod1.Stack2.Prepare";
"BEGIN Wave1.Prod1.Stack2" -> "Wave1.Prod1.Stack2.Prepare";
"Wave1.Prod1.Stack2.Deploy" -> "END Wave1.Prod1.Stack2";
"BEGIN Wave1.Prod1" -> "BEGIN Wave1.Prod1.Stack1";
"END Wave1.Prod1.Stack2" -> "END Wave1.Prod1";
"BEGIN Wave1.Prod2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave1.Prod2" [shape="cds", style="filled", fillcolor="#b7deff"];
"BEGIN Wave1.Prod2.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave1.Prod2.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"Wave1.Prod2.Stack1.Deploy";
"Wave1.Prod2.Stack1.Prepare" -> "Wave1.Prod2.Stack1.Deploy";
"Wave1.Prod2.Stack1.Prepare";
"Build.Synth" -> "Wave1.Prod2.Stack1.Prepare";
"BEGIN Wave1.Prod2.Stack1" -> "Wave1.Prod2.Stack1.Prepare";
"Wave1.Prod2.Stack1.Deploy" -> "END Wave1.Prod2.Stack1";
"BEGIN Wave1.Prod2.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave1.Prod2.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave1.Prod2.Stack1" -> "BEGIN Wave1.Prod2.Stack2";
"Wave1.Prod2.Stack2.Deploy";
"Wave1.Prod2.Stack2.Prepare" -> "Wave1.Prod2.Stack2.Deploy";
"Wave1.Prod2.Stack2.Prepare";
"Build.Synth" -> "Wave1.Prod2.Stack2.Prepare";
"BEGIN Wave1.Prod2.Stack2" -> "Wave1.Prod2.Stack2.Prepare";
"Wave1.Prod2.Stack2.Deploy" -> "END Wave1.Prod2.Stack2";
"BEGIN Wave1.Prod2" -> "BEGIN Wave1.Prod2.Stack1";
"END Wave1.Prod2.Stack2" -> "END Wave1.Prod2";
"BEGIN Wave1" -> "BEGIN Wave1.Prod1";
"BEGIN Wave1" -> "BEGIN Wave1.Prod2";
"END Wave1.Prod1" -> "END Wave1";
"END Wave1.Prod2" -> "END Wave1";
"BEGIN Wave2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2" [shape="cds", style="filled", fillcolor="#b7deff"];
"UpdatePipeline.SelfMutate" -> "BEGIN Wave2";
"END Wave1" -> "BEGIN Wave2";
"BEGIN Wave2.Prod3" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod3" [shape="cds", style="filled", fillcolor="#b7deff"];
"BEGIN Wave2.Prod3.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod3.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"Wave2.Prod3.Stack1.Deploy";
"Wave2.Prod3.Stack1.Prepare" -> "Wave2.Prod3.Stack1.Deploy";
"Wave2.Prod3.Stack1.Prepare";
"Build.Synth" -> "Wave2.Prod3.Stack1.Prepare";
"BEGIN Wave2.Prod3.Stack1" -> "Wave2.Prod3.Stack1.Prepare";
"Wave2.Prod3.Stack1.Deploy" -> "END Wave2.Prod3.Stack1";
"BEGIN Wave2.Prod3.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod3.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod3.Stack1" -> "BEGIN Wave2.Prod3.Stack2";
"Wave2.Prod3.Stack2.Deploy";
"Wave2.Prod3.Stack2.Prepare" -> "Wave2.Prod3.Stack2.Deploy";
"Wave2.Prod3.Stack2.Prepare";
"Build.Synth" -> "Wave2.Prod3.Stack2.Prepare";
"BEGIN Wave2.Prod3.Stack2" -> "Wave2.Prod3.Stack2.Prepare";
"Wave2.Prod3.Stack2.Deploy" -> "END Wave2.Prod3.Stack2";
"BEGIN Wave2.Prod3" -> "BEGIN Wave2.Prod3.Stack1";
"END Wave2.Prod3.Stack2" -> "END Wave2.Prod3";
"BEGIN Wave2.Prod4" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod4" [shape="cds", style="filled", fillcolor="#b7deff"];
"BEGIN Wave2.Prod4.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod4.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"Wave2.Prod4.Stack1.Deploy";
"Wave2.Prod4.Stack1.Prepare" -> "Wave2.Prod4.Stack1.Deploy";
"Wave2.Prod4.Stack1.Prepare";
"Build.Synth" -> "Wave2.Prod4.Stack1.Prepare";
"BEGIN Wave2.Prod4.Stack1" -> "Wave2.Prod4.Stack1.Prepare";
"Wave2.Prod4.Stack1.Deploy" -> "END Wave2.Prod4.Stack1";
"BEGIN Wave2.Prod4.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod4.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod4.Stack1" -> "BEGIN Wave2.Prod4.Stack2";
"Wave2.Prod4.Stack2.Deploy";
"Wave2.Prod4.Stack2.Prepare" -> "Wave2.Prod4.Stack2.Deploy";
"Wave2.Prod4.Stack2.Prepare";
"Build.Synth" -> "Wave2.Prod4.Stack2.Prepare";
"BEGIN Wave2.Prod4.Stack2" -> "Wave2.Prod4.Stack2.Prepare";
"Wave2.Prod4.Stack2.Deploy" -> "END Wave2.Prod4.Stack2";
"BEGIN Wave2.Prod4" -> "BEGIN Wave2.Prod4.Stack1";
"END Wave2.Prod4.Stack2" -> "END Wave2.Prod4";
"BEGIN Wave2.Prod5" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod5" [shape="cds", style="filled", fillcolor="#b7deff"];
"BEGIN Wave2.Prod5.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod5.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"Wave2.Prod5.Stack1.Deploy";
"Wave2.Prod5.Stack1.Prepare" -> "Wave2.Prod5.Stack1.Deploy";
"Wave2.Prod5.Stack1.Prepare";
"Build.Synth" -> "Wave2.Prod5.Stack1.Prepare";
"BEGIN Wave2.Prod5.Stack1" -> "Wave2.Prod5.Stack1.Prepare";
"Wave2.Prod5.Stack1.Deploy" -> "END Wave2.Prod5.Stack1";
"BEGIN Wave2.Prod5.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod5.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod5.Stack1" -> "BEGIN Wave2.Prod5.Stack2";
"Wave2.Prod5.Stack2.Deploy";
"Wave2.Prod5.Stack2.Prepare" -> "Wave2.Prod5.Stack2.Deploy";
"Wave2.Prod5.Stack2.Prepare";
"Build.Synth" -> "Wave2.Prod5.Stack2.Prepare";
"BEGIN Wave2.Prod5.Stack2" -> "Wave2.Prod5.Stack2.Prepare";
"Wave2.Prod5.Stack2.Deploy" -> "END Wave2.Prod5.Stack2";
"BEGIN Wave2.Prod5" -> "BEGIN Wave2.Prod5.Stack1";
"END Wave2.Prod5.Stack2" -> "END Wave2.Prod5";
"BEGIN Wave2.Prod6" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod6" [shape="cds", style="filled", fillcolor="#b7deff"];
"BEGIN Wave2.Prod6.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod6.Stack1" [shape="cds", style="filled", fillcolor="#b7deff"];
"Wave2.Prod6.Stack1.Deploy";
"Wave2.Prod6.Stack1.Prepare" -> "Wave2.Prod6.Stack1.Deploy";
"Wave2.Prod6.Stack1.Prepare";
"Build.Synth" -> "Wave2.Prod6.Stack1.Prepare";
"BEGIN Wave2.Prod6.Stack1" -> "Wave2.Prod6.Stack1.Prepare";
"Wave2.Prod6.Stack1.Deploy" -> "END Wave2.Prod6.Stack1";
"BEGIN Wave2.Prod6.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod6.Stack2" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Wave2.Prod6.Stack1" -> "BEGIN Wave2.Prod6.Stack2";
"Wave2.Prod6.Stack2.Deploy";
"Wave2.Prod6.Stack2.Prepare" -> "Wave2.Prod6.Stack2.Deploy";
"Wave2.Prod6.Stack2.Prepare";
"Build.Synth" -> "Wave2.Prod6.Stack2.Prepare";
"BEGIN Wave2.Prod6.Stack2" -> "Wave2.Prod6.Stack2.Prepare";
"Wave2.Prod6.Stack2.Deploy" -> "END Wave2.Prod6.Stack2";
"BEGIN Wave2.Prod6" -> "BEGIN Wave2.Prod6.Stack1";
"END Wave2.Prod6.Stack2" -> "END Wave2.Prod6";
"BEGIN Wave2" -> "BEGIN Wave2.Prod3";
"BEGIN Wave2" -> "BEGIN Wave2.Prod4";
"BEGIN Wave2" -> "BEGIN Wave2.Prod5";
"BEGIN Wave2" -> "BEGIN Wave2.Prod6";
"END Wave2.Prod3" -> "END Wave2";
"END Wave2.Prod4" -> "END Wave2";
"END Wave2.Prod5" -> "END Wave2";
"END Wave2.Prod6" -> "END Wave2";
"BEGIN Source" [shape="cds", style="filled", fillcolor="#b7deff"];
"END Source" [shape="cds", style="filled", fillcolor="#b7deff"];
"Source.tkglaser/cdk-pipelines-demo";
"BEGIN Source" -> "Source.tkglaser/cdk-pipelines-demo";
"Source.tkglaser/cdk-pipelines-demo" -> "END Source";
}