internal CdkPipelineStack(Construct scope, string id, CdkPipelineStackProps props = null) : base(scope, id, props)
        {
            var sourceArtifact = new Artifact_("SourceArtifact");
            var outputArtifact = new Artifact_("OutputArtifact");

            var sourceAction = new CodeCommitSourceAction(new CodeCommitSourceActionProps
            {
                ActionName = "CodeCommit",
                Output     = sourceArtifact,
                Repository = props.MyRepository,
                Branch     = "main",
            });

            // Self mutation
            var pipeline = new CdkPipeline(this, "CdkPipeline", new CdkPipelineProps
            {
                PipelineName          = "CrossAccountSourcePipeline",
                CloudAssemblyArtifact = outputArtifact,

                SourceAction = sourceAction,

                // It synthesizes CDK code to cdk.out directory which is picked by SelfMutate stage to mutate the pipeline
                SynthAction = new SimpleSynthAction(new SimpleSynthActionProps
                {
                    SourceArtifact        = sourceArtifact,
                    CloudAssemblyArtifact = outputArtifact,
                    InstallCommands       = new[]
                    {
                        "npm install -g aws-cdk",
                    },
                    BuildCommands = new[] { "dotnet build" },
                    SynthCommand  = "cdk synth",
                }),
            });
        }
        private void GetS3ActionResources(PipelineActionS3Options actionS3Options, IDictionary <string, Artifact_> artifacts, out IBucket bucket, out Artifact_ artifact, out IRole role)
        {
            // Locate bucket
            bucket = LocateBucket(actionS3Options.BucketName,
                                  $"The bucket {actionS3Options.BucketName} of the pipeline action {actionS3Options.Name} was not found",
                                  $"The pipeline action {actionS3Options.Name} must have a bucket");

            // Create artifact
            if (string.IsNullOrWhiteSpace(actionS3Options.OutputArtifact))
            {
                throw new ArgumentException($"There is no output artifact in the pipeline action {actionS3Options.Name}");
            }
            else
            {
                if (artifacts.ContainsKey(actionS3Options.OutputArtifact))
                {
                    throw new ArgumentException($"The artifact {actionS3Options.OutputArtifact} of the pipeline action {actionS3Options.Name} already exists");
                }
                else
                {
                    artifact = new Artifact_();
                    artifacts.Add(actionS3Options.OutputArtifact, artifact);
                }
            }

            // Locate role
            role = LocateRole(actionS3Options.Role, $"The role {actionS3Options.Role} of the pipeline action {actionS3Options.Name} was not found");
        }
예제 #3
0
        public WorkshopPipelineStack(Constructs.Construct scope = null, string id = null, IStackProps props = null) : base(scope, id, props)
        {
            var repo = new Repository(this, "WorkshopRepo", new RepositoryProps {
                RepositoryName = "WorkshopRepo"
            });

            var sourceArtifact        = new Artifact_();
            var cloudAssemblyArtifact = new Artifact_();

            var pipeline = new CdkPipeline(this, "Pipeline", new CdkPipelineProps {
                PipelineName          = "WorkshopPipeline",
                CloudAssemblyArtifact = cloudAssemblyArtifact,
                SourceAction          = new CodeCommitSourceAction(new CodeCommitSourceActionProps {
                    ActionName = "CodeCommit",
                    Output     = sourceArtifact,
                    Repository = repo
                }),
                SynthAction = SimpleSynthAction.StandardNpmSynth(new StandardNpmSynthOptions {
                    SourceArtifact        = sourceArtifact,
                    CloudAssemblyArtifact = cloudAssemblyArtifact,

                    InstallCommand = "npm install -g aws-cdk"
                                     + " && wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb"
                                     + " && dpkg -i packages-microsoft-prod.deb"
                                     + " && apt-get update"
                                     + " && apt-get install -y dotnet-sdk-3.1",
                    BuildCommand = "dotnet build src"
                })
            });

            var deploy      = new WorkshopPipelineStage(this, "Deploy");
            var deployStage = pipeline.AddApplicationStage(deploy);
        }
예제 #4
0
        private void GetCodeBuildActionResources(PipelineActionCodeBuildOptions actionCodeBuildOptions, IDictionary <string, Artifact_> artifacts, out Artifact_ inputArtifact, out Artifact_ outputArtifact, out IProject project)
        {
            // Locate artifact
            if (string.IsNullOrWhiteSpace(actionCodeBuildOptions.InputArtifact))
            {
                throw new ArgumentException($"There is no input artifact in the pipeline action {actionCodeBuildOptions.Name}");
            }
            else
            {
                if (!artifacts.TryGetValue(actionCodeBuildOptions.InputArtifact, out inputArtifact))
                {
                    throw new ArgumentException($"The artifact {actionCodeBuildOptions.InputArtifact} of the pipeline action {actionCodeBuildOptions.Name} was not found");
                }
            }

            if (!string.IsNullOrEmpty(actionCodeBuildOptions.OutputArtifact))
            {
                if (artifacts.ContainsKey(actionCodeBuildOptions.OutputArtifact))
                {
                    throw new ArgumentException($"The artifact {actionCodeBuildOptions.OutputArtifact} of the pipeline action {actionCodeBuildOptions.Name} already exists");
                }
                else
                {
                    outputArtifact = new Artifact_(actionCodeBuildOptions.OutputArtifact);
                    artifacts.Add(actionCodeBuildOptions.OutputArtifact, outputArtifact);
                }
            }
            else
            {
                // We don't have an output artifact specified
                outputArtifact = null;
            }
            // Locate CodeBuild project
            project = LocateCodeBuildProject(actionCodeBuildOptions.CodeBuildProject, $"The CodeBuild project {actionCodeBuildOptions.CodeBuildProject} of the pipeline action {actionCodeBuildOptions.Name} was not found");
        }
예제 #5
0
        private void GetEcrActionResources(PipelineActionEcrOptions actionEcrOptions, IDictionary <string, Artifact_> artifacts, out IRepository ecrRepository, out Artifact_ artifact, out IRole role)
        {
            ecrRepository = LocateEcrRepository(actionEcrOptions.EcrRepositoryName,
                                                $"The ECR Repository {actionEcrOptions.EcrRepositoryName} of the pipeline action {actionEcrOptions.Name} was not found",
                                                $"The pipeline action {actionEcrOptions.Name} must have a ECR Repository");

            // Create artifact
            if (string.IsNullOrWhiteSpace(actionEcrOptions.OutputArtifact))
            {
                throw new ArgumentException($"There is no output artifact in the pipeline action {actionEcrOptions.Name}");
            }
            else
            {
                if (artifacts.ContainsKey(actionEcrOptions.OutputArtifact))
                {
                    throw new ArgumentException($"The artifact {actionEcrOptions.OutputArtifact} of the pipeline action {actionEcrOptions.Name} already exists");
                }
                else
                {
                    artifact = new Artifact_(actionEcrOptions.OutputArtifact);
                    artifacts.Add(actionEcrOptions.OutputArtifact, artifact);
                }
            }

            // Locate role
            role = LocateRole(actionEcrOptions.Role, $"The role {actionEcrOptions.Role} of the pipeline action {actionEcrOptions.Name} was not found");
        }
예제 #6
0
        public PipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            var sourceArtifact        = new Artifact_();
            var cloudAssemblyArtifact = new Artifact_();

            var pipeline = new CdkPipeline(this, "CdkPipeline", new CdkPipelineProps
            {
                PipelineName  = "sandbank-api-pipeline",
                CdkCliVersion = "1.63.0",
                SourceAction  = new GitHubSourceAction(new GitHubSourceActionProps
                {
                    ActionName = "synth-cdk",
                    Owner      = "nicostouch",
                    Repo       = "sandbank",
                    Output     = sourceArtifact,
                    OauthToken = SecretValue.SecretsManager("github/oauth/token")
                }),
                SynthAction = new SimpleSynthAction(new SimpleSynthActionProps
                {
                    SynthCommand          = "cdk synth",
                    Subdirectory          = "DevOps/Infrastructure/CDK",
                    SourceArtifact        = sourceArtifact,
                    CloudAssemblyArtifact = cloudAssemblyArtifact
                }),
                CloudAssemblyArtifact = cloudAssemblyArtifact
            });
        }
예제 #7
0
        private void CreatePipeline(IRole cloudFormationRole, PipelineProject build, string githubOwner, string githubRepository, string githubOauthToken, string gitBranch)
        {
            Console.WriteLine($"... defining {gitBranch} pipeline");

            var buildOutput = new Artifact_("BuildOutput");


            new Pipeline(this, "Pipeline-" + gitBranch, new PipelineProps
            {
                Stages = new StageProps[]
                {
                    new StageProps
                    {
                        StageName = "Source",
                        Actions   = new IAction[]
                        {
                            new GitHubSourceAction(new GitHubSourceActionProps
                            {
                                ActionName = "GitHubSource",
                                Branch     = gitBranch,
                                Repo       = githubRepository,
                                Owner      = githubOwner,
                                OauthToken = SecretValue.PlainText(githubOauthToken),
                                Output     = SourceOutput
                            })
                        }
                    },
                    new StageProps
                    {
                        StageName = "Build",
                        Actions   = new IAction[]
                        {
                            new CodeBuildAction(new CodeBuildActionProps
                            {
                                ActionName = $"Build-{gitBranch}",
                                Project    = build,
                                Input      = SourceOutput,
                                Outputs    = new Artifact_[] { buildOutput }
                            })
                        }
                    },
                    new StageProps
                    {
                        StageName = "Deploy",
                        Actions   = new IAction[]
                        {
                            new CloudFormationCreateUpdateStackAction(new CloudFormationCreateUpdateStackActionProps
                            {
                                ActionName       = "DeployServerlessTemplate",
                                Capabilities     = new CloudFormationCapabilities[] { CloudFormationCapabilities.ANONYMOUS_IAM, CloudFormationCapabilities.AUTO_EXPAND },
                                TemplatePath     = ArtifactPath_.ArtifactPath(buildOutput.ArtifactName, "updated.template"),
                                StackName        = $"{githubRepository}-{gitBranch}-{DateTime.Now.Ticks}",
                                AdminPermissions = true
                            })
                        }
                    }
                }
            });
        }
 public CodeBuildAction CreateCodeBuildAction(string actionName, Artifact_ inputArtifact, Artifact_ outputArtifact, IProject codeBuildProject, Dictionary <string, IBuildEnvironmentVariable> environmentVariables)
 {
     return(new CodeBuildAction(new CodeBuildActionProps
     {
         ActionName = actionName,
         Input = inputArtifact,
         Outputs = outputArtifact != null ? new[] { outputArtifact } : null,
         Project = codeBuildProject,
         EnvironmentVariables = environmentVariables
     }));
 }
 public EcrSourceAction CreateEcrAction(string actionName, string imageTag, Artifact_ outputArtifact, IRepository repositoryInstance, IRole role = null, string variableNamespace = null, double?runOrder = null)
 {
     return(new EcrSourceAction(new EcrSourceActionProps
     {
         ActionName = actionName,
         ImageTag = imageTag,
         Output = outputArtifact,
         Repository = repositoryInstance,
         Role = role,
         RunOrder = runOrder,
         VariablesNamespace = variableNamespace
     }));
 }
예제 #10
0
        internal PipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            Artifact_   sourceArtifact        = new Artifact_();
            Artifact_   cloudAssemblyArtifact = new Artifact_();
            CdkPipeline pipeline = new CdkPipeline(this, "LambdaApiSolutionPipeline", new CdkPipelineProps()
            {
                CloudAssemblyArtifact = cloudAssemblyArtifact,
                PipelineName          = "LambdaApiSolutionPipeline",
                SourceAction          = new GitHubSourceAction(new GitHubSourceActionProps()
                {
                    ActionName = "GitHubSource",
                    Output     = sourceArtifact,
                    OauthToken = SecretValue.SecretsManager(Constants.GitHubTokenSecretsManagerId),
                    Owner      = Constants.Owner,
                    Repo       = Constants.RepositoryName,
                    Branch     = Constants.Branch,
                    Trigger    = GitHubTrigger.POLL
                }),
                SynthAction = new SimpleSynthAction(new SimpleSynthActionProps()
                {
                    Environment = new BuildEnvironment
                    {
                        // required for .NET 5
                        // https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-available.html
                        BuildImage = LinuxBuildImage.STANDARD_5_0
                    },
                    SourceArtifact        = sourceArtifact,
                    CloudAssemblyArtifact = cloudAssemblyArtifact,
                    Subdirectory          = "LambdaApiSolution",
                    InstallCommands       = new[] { "npm install -g aws-cdk" },
                    BuildCommands         = new[] { "dotnet build src/LambdaApiSolution.sln" },
                    SynthCommand          = "cdk synth"
                })
            });
            CdkStage developmentStage = pipeline.AddApplicationStage(new SolutionStage(this, "Development"));
            CdkStage testStage        = pipeline.AddApplicationStage(new SolutionStage(this, "Test"));

            testStage.AddManualApprovalAction(new AddManualApprovalOptions()
            {
                ActionName = "PromoteToProduction"
            });
            CdkStage productionStage = pipeline.AddApplicationStage(new SolutionStage(this, "Production"));
        }
예제 #11
0
        public IStage CreateCodeBuildActionInStage(IStage stage, string actionName, Artifact_ inputArtifact, Artifact_ outputArtifact, IProject codeBuildProject, Dictionary <string, string> environmentVariables)
        {
            var environmentVariablesPlain = new Dictionary <string, IBuildEnvironmentVariable>();

            if (environmentVariables != null)
            {
                foreach (var keyValue in environmentVariables)
                {
                    environmentVariablesPlain.Add(keyValue.Key, new BuildEnvironmentVariable
                    {
                        Type  = BuildEnvironmentVariableType.PLAINTEXT,
                        Value = keyValue.Value
                    });
                }
            }
            var action = HandlerResources.AwsCdkPipelineHandler.CreateCodeBuildAction(actionName, inputArtifact, outputArtifact, codeBuildProject, environmentVariablesPlain);

            stage.AddAction(action);
            return(stage);
        }
        private Pipeline CreateCiCdPipeline(Repository dockerRepo, Vcs.Repository gitRepo)
        {
            Artifact_ sourceCodeArtifact = new Artifact_("Unicorn-Store-Visual-Studio-Solution");

            var buildPipeline = new Pipeline(this, "BuildPipeline",
                                             new PipelineProps
            {
                PipelineName = this.settings.ScopeName,
                Stages       = new[]
                {
                    Helpers.StageFromActions("Source", CreateSourceVcsCheckoutAction(gitRepo, sourceCodeArtifact)),
                    Helpers.StageFromActions("Build",
                                             this.CreateDockerImageBuildAction(dockerRepo, sourceCodeArtifact),
                                             this.CreateAppDeploymentEnvironmentBuildAction(sourceCodeArtifact)
                                             ),
                    Helpers.StageFromActions("Restart-the-App", this.CreateLambdaInvokeAction())
                }
            }
                                             );;

            return(buildPipeline);
        }
        internal AppdeploymentStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            #region Application hosting resources

            var vpc = new Vpc(this, "appVpc", new VpcProps
            {
                MaxAzs = 3
            });

            var image = new LookupMachineImage(new LookupMachineImageProps
            {
                // maps to "Amazon Linux 2 with .NET Core 3.0 and Mono 5.18"
                Name   = "amzn2-ami-hvm-2.0.*-x86_64-gp2-mono-*",
                Owners = new [] { "amazon" }
            });

            var userData = UserData.ForLinux();
            userData.AddCommands(new string[]
            {
                "sudo yum install -y httpd",
                "sudo systemctl start httpd",
                "sudo systemctl enable httpd"
            });

            var scalingGroup = new AutoScalingGroup(this, "appASG", new AutoScalingGroupProps
            {
                Vpc              = vpc,
                InstanceType     = InstanceType.Of(InstanceClass.BURSTABLE3, InstanceSize.MEDIUM),
                MachineImage     = image,
                MinCapacity      = 1,
                MaxCapacity      = 4,
                AllowAllOutbound = true,
                UserData         = userData
            });

            var alb = new ApplicationLoadBalancer(this, "appLB", new ApplicationLoadBalancerProps
            {
                Vpc            = vpc,
                InternetFacing = true
            });

            var albListener = alb.AddListener("Port80Listener", new BaseApplicationListenerProps
            {
                Port = 80
            });

            albListener.AddTargets("Port80ListenerTargets", new AddApplicationTargetsProps
            {
                Port    = 80,
                Targets = new [] { scalingGroup }
            });

            albListener.Connections.AllowDefaultPortFromAnyIpv4("Open access to port 80");

            scalingGroup.ScaleOnRequestCount("ScaleOnModestLoad", new RequestCountScalingProps
            {
                TargetRequestsPerSecond = 1
            });

            #endregion

            #region CI/CD resources

            var _sourceOutput = new Artifact_("Source");
            var _buildOutput  = new Artifact_("Build");

            var build = new PipelineProject(this, "CodeBuild", new PipelineProjectProps
            {
                // relative path to sample app's file (single html page for now)
                BuildSpec   = BuildSpec.FromSourceFilename("talk-demos/appdeployment/SimplePage/buildspec.yml"),
                Environment = new BuildEnvironment
                {
                    BuildImage = LinuxBuildImage.AMAZON_LINUX_2_2
                },
            });

            var appDeployment = new ServerApplication(this, "appDeployment");
            // we will use CodeDeploy's default one-at-a-time deployment mode as we are
            // not specifying a deployment config
            var deploymentGroup = new ServerDeploymentGroup(this, "appDeploymentGroup", new ServerDeploymentGroupProps
            {
                Application  = appDeployment,
                InstallAgent = true,
                AutoRollback = new AutoRollbackConfig
                {
                    FailedDeployment = true
                },
                AutoScalingGroups = new [] { scalingGroup }
            });

            // SecretValue.SsmSecure is not currently supported for setting OauthToken,
            // and haven't gotten the SecretsManager approach to work either so
            // resorting to keeping my token in an environment var for now!
            var oauthToken = SecretValue.PlainText(System.Environment.GetEnvironmentVariable("GitHubPersonalToken"));

            var pipeline = new Pipeline(this, "sampleappPipeline", new PipelineProps
            {
                Stages = new StageProps[]
                {
                    new StageProps
                    {
                        StageName = "Source",
                        Actions   = new IAction[]
                        {
                            new GitHubSourceAction(new GitHubSourceActionProps
                            {
                                ActionName = "GitHubSource",
                                Branch     = "master",
                                Repo       = this.Node.TryGetContext("repo-name").ToString(),
                                Owner      = this.Node.TryGetContext("repo-owner").ToString(),
                                OauthToken = oauthToken,
                                Output     = _sourceOutput
                            })
                        }
                    },

                    new StageProps
                    {
                        StageName = "Build",
                        Actions   = new IAction[]
                        {
                            new CodeBuildAction(new CodeBuildActionProps
                            {
                                ActionName = "Build-app",
                                Project    = build,
                                Input      = _sourceOutput,
                                Outputs    = new Artifact_[] { _buildOutput },
                                RunOrder   = 1
                            })
                        }
                    },

                    new StageProps
                    {
                        StageName = "Deploy",
                        Actions   = new IAction[]
                        {
                            new CodeDeployServerDeployAction(new CodeDeployServerDeployActionProps
                            {
                                ActionName      = "Deploy-app",
                                Input           = _buildOutput,
                                RunOrder        = 2,
                                DeploymentGroup = deploymentGroup
                            })
                        }
                    }
                }
            });

            #endregion
        }
예제 #14
0
        internal PipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            var stackProps    = props as PipelineStackProps;
            var codestarArn   = $"arn:aws:codestar-connections:us-east-1:{this.Account}:connection/{stackProps.CodeStarConnectionId}";
            var encryptionKey = Key.FromKeyArn(this, "encryptionKey", $"arn:aws:kms:{this.Region}:{this.Account}:key/{stackProps.KMSKeyId}");

            var sourceArtifact = Bucket.FromBucketAttributes(this, "sourceArtifact", new BucketAttributes
            {
                BucketArn     = $"arn:aws:s3:::codepipeline-artifacts-{this.Account}-{this.Region}",
                EncryptionKey = encryptionKey
            });

            var pipelineRole = Role.FromRoleArn(this, "pipelineRole",
                                                $"arn:aws:iam::{this.Account}:role/CodePipelineMasterRole",
                                                new FromRoleArnOptions {
                Mutable = false
            }
                                                );

            var sourceOutputArtifact = new Artifact_();
            var cdkBuildOutput       = new Artifact_("CdkBuildOutput");

            var apiName = new CfnParameter(this, "ApiName", new CfnParameterProps
            {
                Type        = "String",
                Description = "The name of the API"
            });

            var apiNameLower = new CfnParameter(this, "ApiNameLower", new CfnParameterProps
            {
                Type        = "String",
                Description = "The name of the API in Lowercase"
            });

            //
            // Create the pipeline
            //
            var pipeline = new Pipeline(this, $"ApiPipeline", new PipelineProps
            {
                PipelineName   = $"{apiName.ValueAsString}ApiPipeline",
                ArtifactBucket = sourceArtifact,
                Role           = pipelineRole,
                Stages         = new[]
                {
                    new Amazon.CDK.AWS.CodePipeline.StageProps {
                        StageName = "Source",
                        Actions   = new []
                        {
                            new CodeStarConnectionsSourceAction(new CodeStarConnectionsSourceActionProps
                            {
                                ActionName         = "Github",
                                Branch             = "main",
                                Output             = sourceOutputArtifact,
                                Owner              = "kumaranbsundar",
                                Repo               = stackProps.RepoName,
                                TriggerOnPush      = true,
                                ConnectionArn      = codestarArn,
                                Role               = pipelineRole,
                                VariablesNamespace = "SourceVariables"
                            })
                        }
                    },
                    new Amazon.CDK.AWS.CodePipeline.StageProps {
                        StageName = "Build",
                        Actions   = new []
                        {
                            new CodeBuildAction(new CodeBuildActionProps {
                                ActionName           = "CDK_Synth",
                                Project              = GetCdkBuildProject(encryptionKey, pipelineRole),
                                Input                = sourceOutputArtifact,
                                Outputs              = new[] { cdkBuildOutput },
                                Role                 = pipelineRole,
                                EnvironmentVariables = new Dictionary <string, IBuildEnvironmentVariable> {
                                    {
                                        "API_NAME", new BuildEnvironmentVariable {
                                            Type  = BuildEnvironmentVariableType.PLAINTEXT,
                                            Value = apiNameLower.ValueAsString
                                        }
                                    }
                                }
                            })
                        }
                    }
                }
            });

            stackProps.DeployEnvs.ToList().ForEach(de =>
            {
                var crossAccountRole = Role.FromRoleArn(this, "crossAccountRole",
                                                        $"arn:aws:iam::{de.AccountId}:role/CodePipelineCrossAccountRole",
                                                        new FromRoleArnOptions {
                    Mutable = false
                }
                                                        );

                var deploymentRole = Role.FromRoleArn(this, "deploymentRole",
                                                      $"arn:aws:iam::{de.AccountId}:role/CodePipelineCfnDeploymentRole",
                                                      new FromRoleArnOptions {
                    Mutable = false
                }
                                                      );

                pipeline.AddStage(GetPipelineStage(
                                      de,
                                      apiNameLower.ValueAsString,
                                      cdkBuildOutput,
                                      crossAccountRole,
                                      deploymentRole,
                                      pipelineRole,
                                      sourceOutputArtifact,
                                      GetContainerBuildProject(encryptionKey, pipelineRole)
                                      ));
            });
        }
        internal DotnetPipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            string REPO_NAME  = "dotnet-pipeline";
            string STACK_NAME = "DotnetFunctionalStack";

            var code = Repository.FromRepositoryName(this, "ImportedRepo", REPO_NAME);

            var sourceOutput = new Artifact_();

            var cdkDeploy = new PipelineProject(this, "CDKDeploy", new PipelineProjectProps
            {
                BuildSpec = BuildSpec.FromObject(new Dictionary <string, object> {
                    ["version"] = "0.2",
                    ["phases"]  = new Dictionary <string, object>
                    {
                        ["install"] = new Dictionary <string, string>
                        {
                            ["commands"] = "npm install -g aws-cdk"
                        },
                        ["build"] = new Dictionary <string, object>
                        {
                            ["commands"] = new [] { "src/scripts/build.sh", "cdk deploy " + STACK_NAME }
                        }
                    }
                }),
                Environment = new BuildEnvironment {
                    BuildImage = LinuxBuildImage.AMAZON_LINUX_2_3
                }
            });

            var statement = new Amazon.CDK.AWS.IAM.PolicyStatement();

            statement.Effect = Effect.ALLOW;
            statement.AddActions(new [] { "*" });
            statement.AddAllResources();
            cdkDeploy.Role.AddToPolicy(statement);

            var pipeline = new Amazon.CDK.AWS.CodePipeline.Pipeline(this, "Pipeline", new PipelineProps {
                Stages = new [] {
                    new StageProps
                    {
                        StageName = "Source",
                        Actions   = new []
                        {
                            new CodeCommitSourceAction(new CodeCommitSourceActionProps
                            {
                                ActionName = "Source",
                                Repository = code,
                                Output     = sourceOutput
                            })
                        }
                    },
                    new StageProps
                    {
                        StageName = "Deploy",
                        Actions   = new []
                        {
                            new CodeBuildAction(new CodeBuildActionProps
                            {
                                ActionName = "CDK_Deploy",
                                Project    = cdkDeploy,
                                Input      = sourceOutput
                            })
                        }
                    }
                }
            });
        }
        private void GetCloudFormationActionResources(PipelineActionCloudFormationOptions actionCloudFormationOptions, IDictionary <string, Artifact_> artifacts, out Artifact_ artifact, out IRole deploymentRole, out IRole role, out CfnCapabilities[] cfnCapabilities)
        {
            // Locate artifact
            if (string.IsNullOrWhiteSpace(actionCloudFormationOptions.InputArtifact))
            {
                throw new ArgumentException($"There is no input artifact in the pipeline action {actionCloudFormationOptions.Name}");
            }
            else
            {
                if (!artifacts.TryGetValue(actionCloudFormationOptions.InputArtifact, out artifact))
                {
                    throw new ArgumentException($"The artifact {actionCloudFormationOptions.InputArtifact} of the pipeline action {actionCloudFormationOptions.Name} was not found");
                }
            }

            // Locate deployment role
            deploymentRole = LocateRole(actionCloudFormationOptions.DeploymentRole,
                                        $"The role {actionCloudFormationOptions.DeploymentRole} of the pipeline action {actionCloudFormationOptions.Name} was not found",
                                        $"There is no deployment role in the pipeline action {actionCloudFormationOptions.Name}");

            // Locate role
            role = LocateRole(actionCloudFormationOptions.Role,
                              $"There is no role in the pipeline action {actionCloudFormationOptions.Name}",
                              $"The role {actionCloudFormationOptions.Role} of the pipeline action {actionCloudFormationOptions.Name} was not found");

            // Parse CfnCapabilites
            cfnCapabilities = actionCloudFormationOptions.CfnCapabilities.Select(x => Enum.Parse <CfnCapabilities>(x)).ToArray();
        }
        private void GetEcsDeployActionResources(PipelineActionEcsDeployOptions actionEcsDeployOptions, IDictionary <string, Artifact_> artifacts, out IBaseService service, out Artifact_ artifact, out IRole role)
        {
            service = AwsCdkHandler.LocateEcsServiceByAttrs(actionEcsDeployOptions.Name, new Ec2ServiceAttributes
            {
                Cluster = LocateEcsCluster(actionEcsDeployOptions.ClusterId,
                                           $"The cluster with {actionEcsDeployOptions.ClusterId} name does not exists",
                                           $"The EcsService with {actionEcsDeployOptions.ClusterId} must hace a cluster"),
                ServiceName = actionEcsDeployOptions.ServiceName
            });

            // Locate artifact
            if (string.IsNullOrWhiteSpace(actionEcsDeployOptions.InputArtifact))
            {
                throw new ArgumentException($"There is no input artifact in the pipeline action {actionEcsDeployOptions.Name}");
            }
            else
            {
                if (!artifacts.TryGetValue(actionEcsDeployOptions.InputArtifact, out artifact))
                {
                    throw new ArgumentException($"The artifact {actionEcsDeployOptions.InputArtifact} of the pipeline action {actionEcsDeployOptions.Name} was not found");
                }
            }

            // Locate role
            role = LocateRole(actionEcsDeployOptions.Role, $"The role {actionEcsDeployOptions.Role} of the pipeline action {actionEcsDeployOptions.Name} was not found");
        }
예제 #18
0
        public IStage CreateEcsDeployActionInStage(IStage stage, string actionName, IBaseService service, uint deploymentTimeout, Artifact_ inputArtifact, IRole role = null, string variableNamespace = null, double?runOrder = null)  //NOSONAR number of params
        {
            var action = HandlerResources.AwsCdkPipelineHandler.CreateEcsDeployAction(actionName, service, deploymentTimeout, inputArtifact, role, variableNamespace, runOrder);

            stage.AddAction(action);
            return(stage);
        }
예제 #19
0
        private Amazon.CDK.AWS.CodePipeline.IStageOptions GetPipelineStage(
            DeploymentEnvironment deployEnv,
            string apiName,
            Artifact_ cdkBuildOutput,
            IRole crossAccountRole,
            IRole deploymentRole,
            IRole pipelineRole,
            Artifact_ sourceOutputArtifact,
            PipelineProject containerBuildProject)
        {
            var ecrStackName   = $"{apiName}api-{deployEnv.EnvironmentName}-ecrrepo";
            var ecrRepoName    = $"{apiName}api-{deployEnv.EnvironmentName}-repo";
            var ecrRegistry    = $"{deployEnv.AccountId}.dkr.ecr.us-east-1.amazonaws.com";
            var ecrImageId     = $"{ecrRegistry}/{ecrRepoName}";
            var infraStackName = $"{apiName}api-{deployEnv.EnvironmentName}-infra";

            return(new Amazon.CDK.AWS.CodePipeline.StageOptions
            {
                StageName = $"Deploy_{deployEnv.EnvironmentName}",
                Actions = new Amazon.CDK.AWS.CodePipeline.Action[]
                {
                    new CloudFormationCreateUpdateStackAction(new CloudFormationCreateUpdateStackActionProps {
                        ActionName = "Create_ECR",
                        TemplatePath = cdkBuildOutput.AtPath($"{ecrStackName}.template.json"),
                        StackName = ecrStackName,
                        AdminPermissions = true,
                        Role = crossAccountRole,
                        DeploymentRole = deploymentRole,
                        CfnCapabilities = new[] { CfnCapabilities.ANONYMOUS_IAM },
                        RunOrder = 1
                    }),
                    new CodeBuildAction(new CodeBuildActionProps {
                        ActionName = "Lambda_Image_Build",
                        Project = containerBuildProject,
                        Input = sourceOutputArtifact,
                        Role = pipelineRole,
                        EnvironmentVariables = new Dictionary <string, IBuildEnvironmentVariable> {
                            {
                                "ECR_REGISTRY", new BuildEnvironmentVariable {
                                    Type = BuildEnvironmentVariableType.PLAINTEXT,
                                    Value = ecrRegistry
                                }
                            }, {
                                "ECR_IMAGE", new BuildEnvironmentVariable {
                                    Type = BuildEnvironmentVariableType.PLAINTEXT,
                                    Value = ecrImageId
                                }
                            }
                        },
                        RunOrder = 2
                    }),
                    new CloudFormationCreateUpdateStackAction(new CloudFormationCreateUpdateStackActionProps {
                        ActionName = "Deploy",
                        TemplatePath = cdkBuildOutput.AtPath($"{infraStackName}.template.json"),
                        StackName = infraStackName,
                        AdminPermissions = true,
                        Role = crossAccountRole,
                        DeploymentRole = deploymentRole,
                        CfnCapabilities = new[] { CfnCapabilities.ANONYMOUS_IAM },
                        ParameterOverrides = new Dictionary <string, object> {
                            { "ImageTag", "#{SourceVariables.CommitId}" }
                        },
                        RunOrder = 3
                    })
                }
            });
        }
예제 #20
0
        public IStage CreateS3ActionInStage(IStage stage, string actionName, IBucket sourceCodeBucket, string bucketKey, Artifact_ outputArtifact, IRole role = null, S3Trigger s3Trigger = S3Trigger.POLL, double?runOrder = null)  //NOSONAR number of params
        {
            var action = HandlerResources.AwsCdkPipelineHandler.CreateS3Action(actionName, sourceCodeBucket, bucketKey, outputArtifact, role, s3Trigger, runOrder);

            stage.AddAction(action);
            return(stage);
        }
 public EcsDeployAction CreateEcsDeployAction(string actionName, IBaseService service, uint deploymentTimeout, Artifact_ inputArtifact, IRole role = null, string variableNamespace = null, double?runOrder = null)
 {
     return(new EcsDeployAction(new EcsDeployActionProps
     {
         ActionName = actionName,
         Service = service,
         DeploymentTimeout = Duration.Minutes(deploymentTimeout),
         Input = inputArtifact,
         Role = role,
         RunOrder = runOrder,
         VariablesNamespace = variableNamespace
     }));
 }
예제 #22
0
        public PipelineStack(Construct parent, string id, IPipelineStackProps props) : base(parent, id, props)
        {
            EcrRepository = new Repository(
                this,
                "EcrRepository",
                new RepositoryProps
            {
                RepositoryName = "cdk-dotnet-example",
                RemovalPolicy  = RemovalPolicy.DESTROY,
            });

            var cdkBuild = new PipelineProject(
                this,
                "CdkBuild",
                new PipelineProjectProps
            {
                BuildSpec   = BuildSpec.FromSourceFilename("Infrastructure/Resources/cdk_buildspec.yml"),
                Environment = new BuildEnvironment
                {
                    BuildImage = LinuxBuildImage.AMAZON_LINUX_2,
                },
            });

            var apiBuildTaskRole = new Role(
                this,
                "ApiBuildRole",
                new RoleProps
            {
                ManagedPolicies = new[]
                {
                    ManagedPolicy.FromAwsManagedPolicyName("AmazonEC2ContainerRegistryPowerUser"),
                },
                AssumedBy = new ServicePrincipal("codebuild.amazonaws.com")
            });

            var apiBuild = new PipelineProject(
                this,
                "ApiBuild",
                new PipelineProjectProps
            {
                BuildSpec   = BuildSpec.FromSourceFilename("Infrastructure/Resources/api_buildspec.yml"),
                Role        = apiBuildTaskRole,
                Environment = new BuildEnvironment
                {
                    BuildImage           = LinuxBuildImage.AMAZON_LINUX_2,
                    Privileged           = true,
                    EnvironmentVariables = new Dictionary <string, IBuildEnvironmentVariable>
                    {
                        ["AWS_ACCOUNT_ID"]     = CdkUtil.PlainTextBuildEnvironmentVariable(Of(this).Account),
                        ["AWS_DEFAULT_REGION"] = CdkUtil.PlainTextBuildEnvironmentVariable(Of(this).Region),
                    },
                },
            });

            var apiTest = new PipelineProject(
                this,
                "ApiTest",
                new PipelineProjectProps
            {
                BuildSpec   = BuildSpec.FromSourceFilename("Infrastructure/Resources/ci_buildspec.yml"),
                Environment = new BuildEnvironment
                {
                    BuildImage = LinuxBuildImage.AMAZON_LINUX_2,
                    Privileged = true,
                },
            });

            var sourceOutput   = new Artifact_();
            var cdkBuildOutput = new Artifact_("CdkBuildOutput");
            var apiBuildOutput = new Artifact_("ApiBuildOutput");

            new Pipeline(
                this,
                "Api",
                new PipelineProps
            {
                Stages = new IStageProps[]
                {
                    new StageProps
                    {
                        StageName = "Source",
                        Actions   = new IAction[]
                        {
                            new GitHubSourceAction(new GitHubSourceActionProps
                            {
                                ActionName = "GitHub",
                                OauthToken = SecretValue.SecretsManager(props.GitHubSecretName),
                                Repo       = props.GitHubRepo,
                                Owner      = props.GitHubOwner,
                                Output     = sourceOutput,
                                Trigger    = GitHubTrigger.WEBHOOK,
                            }),
                        },
                    },
                    new StageProps
                    {
                        StageName = "Build",
                        Actions   = new IAction[]
                        {
                            new CodeBuildAction(new CodeBuildActionProps
                            {
                                ActionName = "ApiTest",
                                Project    = apiTest,
                                Input      = sourceOutput,
                                RunOrder   = 1,
                            }),
                            new CodeBuildAction(new CodeBuildActionProps
                            {
                                ActionName = "ApiBuild",
                                Project    = apiBuild,
                                Input      = sourceOutput,
                                Outputs    = new[] { apiBuildOutput },
                                RunOrder   = 2,
                            }),
                            new CodeBuildAction(new CodeBuildActionProps
                            {
                                ActionName = "CdkBuild",
                                Project    = cdkBuild,
                                Input      = sourceOutput,
                                Outputs    = new[] { cdkBuildOutput },
                                RunOrder   = 3,
                            }),
                        },
                    },
                    new StageProps
                    {
                        StageName = "Deploy",
                        Actions   = new IAction[]
                        {
                            new CloudFormationCreateUpdateStackAction(new CloudFormationCreateUpdateStackActionProps
                            {
                                ActionName         = "ApiStack",
                                TemplatePath       = cdkBuildOutput.AtPath($"{props.ApiStackName}.template.json"),
                                StackName          = "Api",
                                AdminPermissions   = true,
                                ParameterOverrides = new Dictionary <string, object>
                                {
                                    [props.ApiImageTag] = apiBuildOutput.GetParam("metadata.json", "imageTag"),
                                },
                                ExtraInputs = new[]
                                {
                                    apiBuildOutput,
                                },
                            }),
                        },
                    },
                },
            });
        }
 public S3SourceAction CreateS3Action(string actionName, IBucket sourceCodeBucket, string bucketKey, Artifact_ outputArtifact, IRole role = null, S3Trigger s3Trigger = S3Trigger.POLL, double?runOrder = null)
 {
     return(new S3SourceAction(new S3SourceActionProps
     {
         ActionName = actionName,
         Bucket = sourceCodeBucket,
         BucketKey = bucketKey,
         Output = outputArtifact,
         Trigger = s3Trigger,
         Role = role,
         RunOrder = runOrder
     }));
 }
예제 #24
0
        internal CICD(
            CdkStack stack,
            CfnParameter targetPlatform,
            LoadBalancedInstancesResult frontEndInstanceInfo,
            LoadBalancedInstancesResult restAPIInstanceInfo)
        {
            var artifactBucket = new Bucket(stack, "ArtifactBucket");
            var repo           = new Repository(stack, "ApplicationRepository", new RepositoryProps
            {
                RepositoryName = stack.StackName,
                Description    = $"Contains the code for the {stack.StackName} application."
            });
            var cfnRepo = repo.Node.DefaultChild as Amazon.CDK.AWS.CodeCommit.CfnRepository;

            cfnRepo.Code = new CfnRepository.CodeProperty
            {
                S3 = new CfnRepository.S3Property
                {
                    Bucket = SourceBucketName,
                    Key    = SourceBucketKey
                }
            };

            var build = new PipelineProject(stack, "ApplicationBuild", new PipelineProjectProps
            {
                Environment = new BuildEnvironment
                {
                    BuildImage           = LinuxBuildImage.AMAZON_LINUX_2_3,
                    EnvironmentVariables = new Dictionary <string, IBuildEnvironmentVariable> {
                        {
                            "TARGET_OS",
                            new BuildEnvironmentVariable {
                                Type  = BuildEnvironmentVariableType.PLAINTEXT,
                                Value = targetPlatform.Value
                            }
                        }
                    }
                }
            });
            var frontEndApplication = new ServerApplication(stack, "FrontEnd", new ServerApplicationProps
            {
                ApplicationName = $"{stack.StackName}-FrontEnd"
            });
            var frontEndDeploymentGroup = new ServerDeploymentGroup(stack, "FrontEndDeploymentGroup", new ServerDeploymentGroupProps
            {
                Application         = frontEndApplication,
                DeploymentGroupName = $"{stack.StackName.ToLower()}-frontend-deployment-group",
                //Role = new Role(stack, "DeploymentServiceRole", new RoleProps
                //{
                //    AssumedBy = new ServicePrincipal("codedeploy.amazonaws.com"),
                //    Description = "Allows Application Deployment.",
                //    ManagedPolicies = new[] { ManagedPolicy.FromAwsManagedPolicyName("service-role/AWSCodeDeployRole") }
                //}),
                //AutoRollback = new AutoRollbackConfig { FailedDeployment = true },
                //DeploymentConfig = ServerDeploymentConfig.HALF_AT_A_TIME,
                LoadBalancer      = LoadBalancer.Application(frontEndInstanceInfo.TargetGroup),
                AutoScalingGroups = new[] { frontEndInstanceInfo.AutoScalingGroup }
            });
            var restApiApplication = new ServerApplication(stack, "RestAPI", new ServerApplicationProps
            {
                ApplicationName = $"{stack.StackName}-RESTAPI"
            });
            var restApiDeploymentGroup = new ServerDeploymentGroup(stack, "RestAPIDeploymentGroup", new ServerDeploymentGroupProps
            {
                Application         = restApiApplication,
                DeploymentGroupName = $"{stack.StackName.ToLower()}-restapi-deployment-group",
                //AutoRollback = new AutoRollbackConfig { FailedDeployment = true },
                //DeploymentConfig = ServerDeploymentConfig.HALF_AT_A_TIME,
                LoadBalancer      = LoadBalancer.Application(restAPIInstanceInfo.TargetGroup),
                AutoScalingGroups = new[] { restAPIInstanceInfo.AutoScalingGroup }
            });
            var sourceOutput      = new Artifact_();
            var frontEndArtifacts = new Artifact_("FrontEndOutput");
            var restAPIArtifacts  = new Artifact_("RESTAPIOutput");
            var pipeline          = new Pipeline(stack, "ApplicationPipeline", new PipelineProps
            {
                ArtifactBucket = artifactBucket,
                PipelineName   = $"{stack.StackName}-Pipeline",
                Stages         = new[]
                {
                    new Amazon.CDK.AWS.CodePipeline.StageProps
                    {
                        StageName = "Source",
                        Actions   = new []
                        {
                            new CodeCommitSourceAction(new CodeCommitSourceActionProps
                            {
                                ActionName = "Source",
                                Repository = repo,
                                Output     = sourceOutput
                            })
                        }
                    },
                    new Amazon.CDK.AWS.CodePipeline.StageProps
                    {
                        StageName = "Build",
                        Actions   = new []
                        {
                            new CodeBuildAction(new CodeBuildActionProps
                            {
                                ActionName = "CodeBuild",
                                Project    = build,
                                Input      = sourceOutput,
                                Outputs    = new [] { frontEndArtifacts, restAPIArtifacts }
                            })
                        }
                    },
                    new Amazon.CDK.AWS.CodePipeline.StageProps
                    {
                        StageName = "Deploy",
                        Actions   = new []
                        {
                            new CodeDeployServerDeployAction(new CodeDeployServerDeployActionProps {
                                ActionName      = "DeployFrontEnd",
                                DeploymentGroup = frontEndDeploymentGroup,
                                Input           = frontEndArtifacts
                            }),
                            new CodeDeployServerDeployAction(new CodeDeployServerDeployActionProps {
                                ActionName      = "DeployRESTAPI",
                                DeploymentGroup = restApiDeploymentGroup,
                                Input           = restAPIArtifacts
                            })
                        }
                    }
                }
            });
        }
예제 #25
0
        public CiCdStack(Construct parent, string id, CiCdStackProps props) : base(parent, id, props)
        {
            var apiRepository =
                Amazon.CDK.AWS.CodeCommit.Repository.FromRepositoryArn(this, "Repository", props.apiRepositoryArn);
            var environmentVariables = new Dictionary <string, IBuildEnvironmentVariable>();

            environmentVariables.Add("AWS_ACCOUNT_ID", new BuildEnvironmentVariable()
            {
                Type  = BuildEnvironmentVariableType.PLAINTEXT,
                Value = Aws.ACCOUNT_ID
            });
            environmentVariables.Add("AWS_DEFAULT_REGION", new BuildEnvironmentVariable()
            {
                Type  = BuildEnvironmentVariableType.PLAINTEXT,
                Value = Aws.REGION
            });
            var codebuildProject = new PipelineProject(this, "BuildProject", new PipelineProjectProps
            {
                Environment = new BuildEnvironment
                {
                    ComputeType          = ComputeType.SMALL,
                    BuildImage           = LinuxBuildImage.UBUNTU_14_04_PYTHON_3_5_2,
                    Privileged           = true,
                    EnvironmentVariables = environmentVariables
                }
            });
            var codeBuildPolicy = new PolicyStatement();

            codeBuildPolicy.AddResources(apiRepository.RepositoryArn);
            codeBuildPolicy.AddActions(
                "codecommit:ListBranches",
                "codecommit:ListRepositories",
                "codecommit:BatchGetRepositories",
                "codecommit:GitPull"
                );
            codebuildProject.AddToRolePolicy(
                codeBuildPolicy
                );
            props.ecrRepository.GrantPullPush(codebuildProject.GrantPrincipal);

            var sourceOutput = new Artifact_();
            var sourceAction = new Amazon.CDK.AWS.CodePipeline.Actions.CodeCommitSourceAction(
                new Amazon.CDK.AWS.CodePipeline.Actions.CodeCommitSourceActionProps
            {
                ActionName = "CodeCommit-Source",
                Branch     = "master",
                Trigger    = CodeCommitTrigger.POLL,
                Repository = apiRepository,
                Output     = sourceOutput
            });

            var buildOutput = new Artifact_();
            var buildAction = new CodeBuildAction(new CodeBuildActionProps
            {
                ActionName = "Build",
                Input      = sourceOutput,
                Outputs    = new Artifact_[]
                {
                    buildOutput
                },
                Project = codebuildProject
            });

            var deployAction = new EcsDeployAction(new EcsDeployActionProps
            {
                ActionName = "DeployAction",
                Input      = buildOutput,
                Service    = props.ecsService,
            });

            var pipeline = new Pipeline(this, "Pipeline");

            pipeline.AddStage(new StageOptions
            {
                StageName = "Source",
                Actions   = new Action[] { sourceAction }
            });
            pipeline.AddStage(new StageOptions
            {
                StageName = "Build",
                Actions   = new Action[] { buildAction }
            });
            pipeline.AddStage(new StageOptions
            {
                StageName = "Deploy",
                Actions   = new Action[] { deployAction }
            });
        }
예제 #26
0
        public IStage CreateEcrActionInStage(IStage stage, string actionName, string imageTag, Artifact_ outputArtifact, IRepository repositoryInstance, IRole role = null, string variableNamespace = null, double?runOrder = null)  //NOSONAR number of params
        {
            var action = HandlerResources.AwsCdkPipelineHandler.CreateEcrAction(actionName, imageTag, outputArtifact, repositoryInstance, role, variableNamespace, runOrder);

            stage.AddAction(action);
            return(stage);
        }
예제 #27
0
        internal PipelineStack(Construct scope, string id, Configuration configuration, IStackProps props = null) : base(scope, id, props)
        {
            var repository = Repository.FromRepositoryArn(this, "Repository", configuration.Source.RepositoryArn);

            var sourceArtifact = new Artifact_();
            var outputArtifact = new Artifact_();
            var ecrPolicy      = new PolicyStatement(new PolicyStatementProps
            {
                Effect    = Effect.ALLOW,
                Actions   = new[] { "ecr:*" },
                Resources = new[] { "*" }
            });


            // Setup CodeCommit cross account role access policies if required
            IRole codeCommitRole = null;

            if (!string.IsNullOrWhiteSpace(configuration.Source.CrossAccountRoleArn))
            {
                codeCommitRole = Role.FromRoleArn(this, "CodeCommitRole", configuration.Source.CrossAccountRoleArn, new FromRoleArnOptions()
                {
                    Mutable = false // Flag to indicate CDK to not modify the role
                });
            }


            // Self mutation
            var pipeline = new CdkPipeline(this, "Pipeline", new CdkPipelineProps
            {
                PipelineName          = Configuration.ProjectName,
                CloudAssemblyArtifact = outputArtifact,

                SourceAction = new CodeCommitSourceAction(new CodeCommitSourceActionProps
                {
                    ActionName = "CodeCommit",
                    Output     = sourceArtifact,
                    Repository = repository,
                    Branch     = configuration.Source.BranchName,
                    Role       = codeCommitRole,
                    Trigger    = CodeCommitTrigger.POLL
                }),

                // It synthesizes CDK code to cdk.out directory which is picked by SelfMutate stage to mutate the pipeline
                SynthAction = new SimpleSynthAction(new SimpleSynthActionProps
                {
                    SourceArtifact        = sourceArtifact,
                    CloudAssemblyArtifact = outputArtifact,
                    Subdirectory          = "LambdaRuntimeDockerfiles/dotnet5/Infrastructure",
                    InstallCommands       = new[]
                    {
                        "npm install -g aws-cdk",
                    },
                    BuildCommands            = new[] { "dotnet build" },
                    SynthCommand             = "cdk synth",
                    CopyEnvironmentVariables = new[]
                    {
                        "SOURCE_REPOSITORY_ARN",
                        "SOURCE_BRANCH_NAME",
                        "SOURCE_CROSS_ACCOUNT_ROLE_ARN",
                        "BASE_ECRS",
                        "STAGE_ECR",
                        "BETA_ECRS",
                        "PROD_ECRS",
                        "ECR_REPOSITORY_NAME",
                    }
                })
            });


            // Stage
            var dockerBuild = new Project(this, "DockerBuild", new ProjectProps()
            {
                BuildSpec   = BuildSpec.FromSourceFilename($"{Configuration.ProjectRoot}/DockerBuild/buildspec.yml"),
                Description = $"Builds and pushes image to {configuration.Ecrs.Stage}",
                Environment = new BuildEnvironment()
                {
                    BuildImage = LinuxBuildImage.AMAZON_LINUX_2_3,
                    Privileged = true
                },
                Source = Amazon.CDK.AWS.CodeBuild.Source.CodeCommit(new CodeCommitSourceProps()
                {
                    Repository  = repository,
                    BranchOrRef = configuration.Source.BranchName
                }),
                EnvironmentVariables = new Dictionary <string, IBuildEnvironmentVariable>
                {
                    { "BASE_ECRS", new BuildEnvironmentVariable()
                      {
                          Value = configuration.Ecrs.Base
                      } },
                    { "STAGE_ECR", new BuildEnvironmentVariable {
                          Value = configuration.Ecrs.Stage
                      } },
                    { "ECR_REPOSITORY_NAME", new BuildEnvironmentVariable {
                          Value = configuration.EcrRepositoryName
                      } }
                }
            });

            dockerBuild.AddToRolePolicy(ecrPolicy);

            var dockerBuildStage = pipeline.AddStage("Stage-DockerBuild");

            dockerBuildStage.AddActions(new CodeBuildAction(new CodeBuildActionProps()
            {
                Input      = sourceArtifact,
                Project    = dockerBuild,
                ActionName = "DockerBuild"
            }));


            // Beta
            var betaDockerPush = new Project(this, "Beta-DockerPush", new ProjectProps()
            {
                BuildSpec   = BuildSpec.FromSourceFilename($"{Configuration.ProjectRoot}/DockerPush/buildspec.yml"),
                Description = $"Pushes staged image to {configuration.Ecrs.Beta}",
                Environment = new BuildEnvironment()
                {
                    BuildImage = LinuxBuildImage.AMAZON_LINUX_2_3,
                    Privileged = true
                },
                Source = Amazon.CDK.AWS.CodeBuild.Source.CodeCommit(new CodeCommitSourceProps()
                {
                    Repository  = repository,
                    BranchOrRef = configuration.Source.BranchName
                }),
                EnvironmentVariables = new Dictionary <string, IBuildEnvironmentVariable>
                {
                    { "SOURCE_ECR", new BuildEnvironmentVariable {
                          Value = configuration.Ecrs.Stage
                      } },
                    { "ECR_REPOSITORY_NAME", new BuildEnvironmentVariable {
                          Value = configuration.EcrRepositoryName
                      } },
                    { "DESTINATION_ECRS", new BuildEnvironmentVariable {
                          Value = configuration.Ecrs.Beta
                      } },
                    { "DESTINATION_IMAGE_TAG", new BuildEnvironmentVariable {
                          Value = "beta"
                      } },
                }
            });

            betaDockerPush.AddToRolePolicy(ecrPolicy);

            var betaDockerPushStage = pipeline.AddStage("Beta-DockerPush");

            betaDockerPushStage.AddActions(new CodeBuildAction(new CodeBuildActionProps()
            {
                Input      = sourceArtifact,
                Project    = betaDockerPush,
                ActionName = "DockerPush"
            }));


            // Manual Approval
            var manualApprovalStage = pipeline.AddStage("Prod-ManualApproval");

            manualApprovalStage.AddActions(new ManualApprovalAction(new ManualApprovalActionProps()
            {
                ActionName = "ManualApproval"
            }));


            // Prod
            var prodDockerPush = new Project(this, "Prod-DockerPush", new ProjectProps()
            {
                BuildSpec   = BuildSpec.FromSourceFilename($"{Configuration.ProjectRoot}/DockerPush/buildspec.yml"),
                Description = $"Pushes staged image to {configuration.Ecrs.Prod}",
                Environment = new BuildEnvironment()
                {
                    BuildImage = LinuxBuildImage.AMAZON_LINUX_2_3,
                    Privileged = true
                },
                Source = Amazon.CDK.AWS.CodeBuild.Source.CodeCommit(new CodeCommitSourceProps()
                {
                    Repository  = repository,
                    BranchOrRef = "dotnet5/cdk"
                }),
                EnvironmentVariables = new Dictionary <string, IBuildEnvironmentVariable>
                {
                    { "SOURCE_ECR", new BuildEnvironmentVariable {
                          Value = configuration.Ecrs.Stage
                      } },
                    { "ECR_REPOSITORY_NAME", new BuildEnvironmentVariable {
                          Value = configuration.EcrRepositoryName
                      } },
                    { "DESTINATION_ECRS", new BuildEnvironmentVariable {
                          Value = configuration.Ecrs.Prod
                      } },
                    { "DESTINATION_IMAGE_TAG", new BuildEnvironmentVariable {
                          Value = "beta"
                      } },                                                                    // Prod images are also tagged as beta
                }
            });

            prodDockerPush.AddToRolePolicy(ecrPolicy);

            var prodDockerPushStage = pipeline.AddStage("Prod-DockerPush");

            prodDockerPushStage.AddActions(new CodeBuildAction(new CodeBuildActionProps()
            {
                Input      = sourceArtifact,
                Project    = prodDockerPush,
                ActionName = "DockerPush"
            }));
        }
 public CloudFormationCreateUpdateStackAction CreateCloudFormationCreateUpdateStackAction(string actionName, Artifact_ inputArtifact, string templatePath, string stackName, IRole deploymentRole, IRole role, CfnCapabilities[] cfnCapabilities)
 {
     return(new CloudFormationCreateUpdateStackAction(new CloudFormationCreateUpdateStackActionProps
     {
         ActionName = actionName,
         TemplatePath = inputArtifact.AtPath(templatePath),
         StackName = stackName,
         Role = role,
         DeploymentRole = deploymentRole,
         CfnCapabilities = cfnCapabilities
     }));
 }
        public CodeCoveragePipelineStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            var buildProjectName = Constants.Project + Constants.BuildProject;
            var buildProject     = new PipelineProject(this, buildProjectName, new PipelineProjectProps
            {
                ProjectName = buildProjectName,
                BuildSpec   = BuildSpec.FromObject(new Dictionary <string, object>
                {
                    ["version"] = "0.2",
                    ["phases"]  = new Dictionary <string, object>
                    {
                        ["install"] = new Dictionary <string, object>
                        {
                            ["runtime-versions"] = new Dictionary <string, object>
                            {
                                ["dotnet"] = "latest"
                            },
                            ["commands"] = new string[]
                            {
                                "dotnet tool install -g dotnet-reportgenerator-globaltool",
                                "export PATH=\"$PATH:/root/.dotnet/tools\""
                            }
                        },
                        ["build"] = new Dictionary <string, object>
                        {
                            ["commands"] = new string[]
                            {
                                "dotnet build",
                                "dotnet test --collect:\"XPlat Code Coverage\" --logger trx",
                                "xmlPath=$(find $CODEBUILD_SRC_DIR/Calculator.Tests/TestResults -name \"*.xml\")",
                                "reportgenerator -reports:$xmlPath -targetdir:$CODEBUILD_SRC_DIR/Calculator.Tests/TestResults/"
                            }
                        }
                    },
                    ["reports"] = new Dictionary <string, object>
                    {
                        [Constants.TestReportGroup] = new Dictionary <string, object>
                        {
                            ["files"] = new string[]
                            {
                                "**/*.trx"
                            },
                            ["base-directory"] = "$CODEBUILD_SRC_DIR/Calculator.Tests/TestResults",
                            ["file-format"]    = "VisualStudioTrx"
                        },
                        [Constants.CodeCoverageReportGroup] = new Dictionary <string, object>
                        {
                            ["files"] = new string[]
                            {
                                "**/*.xml"
                            },
                            ["base-directory"] = "$CODEBUILD_SRC_DIR/Calculator.Tests/TestResults",
                            ["file-format"]    = "CoberturaXml"
                        }
                    },
                    ["artifacts"] = new Dictionary <string, object>
                    {
                        ["files"] = new string[]
                        {
                            "**/*"
                        },
                        ["name"]           = "coverlet-$(date +%Y-%m-%d)",
                        ["base-directory"] = "$CODEBUILD_SRC_DIR/Calculator.Tests/TestResults/"
                    }
                }),
                Environment = new BuildEnvironment
                {
                    BuildImage = LinuxBuildImage.AMAZON_LINUX_2_3
                }
            });

            var bucketName          = "codepipeline-ap-southeast-2-822565979272";
            var testReportGroupName = buildProjectName + "-" + Constants.TestReportGroup;
            var testReportGroup     = new CfnReportGroup(this, "TestReportGroup", new CfnReportGroupProps
            {
                Name         = testReportGroupName,
                Type         = "TEST",
                ExportConfig = new CfnReportGroup.ReportExportConfigProperty {
                    ExportConfigType = "S3",
                    S3Destination    = new CfnReportGroup.S3ReportExportConfigProperty {
                        Bucket    = bucketName,
                        Packaging = "NONE",
                        Path      = "TestReports"
                    }
                }
            });

            var codeCoverageReportGroupName = buildProjectName + "-" + Constants.CodeCoverageReportGroup;
            var CodeCoverageReportGroup     = new CfnReportGroup(this, "CodeCoverageReportGroup", new CfnReportGroupProps
            {
                Name         = codeCoverageReportGroupName,
                Type         = "CODE_COVERAGE",
                ExportConfig = new CfnReportGroup.ReportExportConfigProperty {
                    ExportConfigType = "S3",
                    S3Destination    = new CfnReportGroup.S3ReportExportConfigProperty {
                        Bucket    = bucketName,
                        Packaging = "NONE",
                        Path      = "CodeCoverageReports"
                    }
                }
            });

            buildProject.AddToRolePolicy(
                new PolicyStatement(new PolicyStatementProps
            {
                Effect  = Effect.ALLOW,
                Actions = new []
                {
                    "codebuild:BatchPutCodeCoverages"
                },
                Resources = new []
                {
                    Fn.Join("", new string[]
                    {
                        "arn:",
                        Fn.Ref("AWS::Partition"),
                        ":codebuild:",
                        Fn.Ref("AWS::Region"),
                        ":",
                        Fn.Ref("AWS::AccountId"),
                        ":report-group/",
                        buildProject.ProjectName,
                        "-*"
                    })
                }
            })
                );

            var code            = Repository.FromRepositoryName(this, "TestCoverageRepo", "TestCoverageRepo");
            var artifactsBucket = Bucket.FromBucketName(this, "BucketByName", bucketName);
            var sourceOutput    = new Artifact_("sourceArtifact");
            var buildOutput     = new Artifact_("buildArtifact");
            var pipelineName    = Constants.Project + "Pipeline";

            new Pipeline(this, pipelineName, new PipelineProps
            {
                PipelineName   = pipelineName,
                ArtifactBucket = artifactsBucket,
                Stages         = new[]
                {
                    new StageProps
                    {
                        StageName = "Source",
                        Actions   = new []
                        {
                            new CodeCommitSourceAction(new CodeCommitSourceActionProps
                            {
                                ActionName = "SourceAction",
                                Repository = code,
                                Output     = sourceOutput
                            })
                        }
                    },
                    new StageProps
                    {
                        StageName = "Build",
                        Actions   = new []
                        {
                            new CodeBuildAction(new CodeBuildActionProps
                            {
                                ActionName = "BuildAction",
                                Project    = buildProject,
                                Input      = sourceOutput,
                                Outputs    = new [] { buildOutput }
                            })
                        }
                    },
                }
            });
        }
예제 #30
0
        public IStage CreateCloudFormationCreateUpdateStackActionInStage(IStage stage, string actionName, Artifact_ inputArtifact, string templatePath, string stackName, IRole deploymentRole, IRole role, CfnCapabilities[] cfnCapabilities) //NOSONAR number of params
        {
            var action = HandlerResources.AwsCdkPipelineHandler.CreateCloudFormationCreateUpdateStackAction(actionName, inputArtifact, templatePath, stackName, deploymentRole, role, cfnCapabilities);

            stage.AddAction(action);
            return(stage);
        }