Skip to main content

CI/CD on AWS with feature-branch builds, developer-environment deployments, and build status notifications.

Project description

Opinionated CDK CI Pipeline

NPM PyPI

CI/CD utilizing CDK Pipelines.

Features:

  • pipeline deploying application from the default branch to multiple environments on multiple accounts,
  • feature branch deployments to ephemeral environments,
  • development environments deployments from the local CLI,
  • build status notifications to repository commits,
  • build failures notifications to SNS,
  • supports commit message tags to skip deployments ([skip ci] or [no ci]).

Currently supported source repositories are GitHub and Bitbucket.

Pipeline architecture:

Pipeline architecture

See the announcement blog post for more details and examples.

Table of contents

Usage

To set up, you need to complete the following steps:

  1. Install the library in your project.
  2. Specify context parameters.
  3. Create CDKApplication with build process configuration.
  4. Create repository access token.
  5. Bootstrap the CDK on the AWS account(s).
  6. Deploy the CI.

At the end, you will have CI pipeline in place, and be able to deploy your own custom environment from the CLI as well.

1. Install

For Node.js:

npm install -D opinionated-ci-pipeline

For Python:

pip install opinionated-ci-pipeline

2. Set context parameters

Add project name and environments config in the cdk.json as context parameters. Each environment must have account and region provided.

{
  "app": "...",
  "context": {
    "projectName": "myproject",
    "environments": {
      "default": {
        "account": "111111111111",
        "region": "us-east-1"
      },
      "prod": {
        "account": "222222222222",
        "region": "us-east-1"
      }
    }
  }
}

The project name will be used as a prefix for the deployed CI Stack name.

Environment names should match environments provided later in the CDKApplication configuration.

The optional default environment configuration is used as a fallback.

The CI pipeline itself is deployed to the ci environment, with a fallback to the default environment as well.

3. Create CDKApplication

In the CDK entrypoint script referenced by the cdk.json app field, replace the content with an instance of CDKApplication:

#!/usr/bin/env node
import 'source-map-support/register';
import {ExampleStack} from '../lib/exampleStack';
import {CDKApplication} from 'opinionated-ci-pipeline';

new CDKApplication({
    stacks: {
        create: (scope, projectName, envName) => {
            new ExampleStack(scope, 'ExampleStack', {stackName: `${projectName}-${envName}-ExampleStack`});
        },
    },
    repository: {
        host: 'github',
        name: 'organization/repository',
    },
    packageManager: 'npm',
    pipeline: [
        {
            environment: 'test',
            post: [
                'echo "do integration tests here"',
            ],
        },
        {
            environment: 'prod',
        },
    ],
});

This configures the application with one Stack and a pipeline deploying to an environment test, running integration tests, and deploying to environment prod.

The test and prod environments will be deployed from the branch main (by default). All other branches will be deployed to separate environments. Those feature-branch environments will be destroyed after the branch is removed.

To allow deployment of multiple environments, the Stack(s) name must include the environment name.

4. Create repository access token

An access to the source repository is required to fetch code and send build status notifications.

Once access token is created, save it in SSM Parameter Store as a SecureString under the path /{projectName}/ci/repositoryAccessToken.

See instructions below on how to create the token for each supported repository host.

GitHub

Create a fine-grained personal access token with read-only access for Contents read and write access for Commit statuses and Webhooks.

Bitbucket

In Bitbucket, go to your repository. Open Settings → Access tokens. There, create a new Repository Access Token with repository:write and webhook scopes.

5. Bootstrap the CDK

Bootstrap the CDK on the account holding the CI pipeline and all other accounts the pipeline will be deploying to.

When bootstrapping other accounts, add the --trust parameter with the account ID of the account holding the pipeline.

6. Deploy the CI Stack

Run:

cdk deploy -c ci=true

Deploy development environment

Run:

cdk deploy -c env=MYENV --all

to deploy arbitrary environments.

Parameters

Name Type Description
stacks object An object with a create() method to create Stacks for the application.
The same Stacks will be deployed with main pipeline, feature-branch builds, and local deployments.
packageManager npm | pnpm Package manager used in the repository.

If provided, the install command will be set to install dependencies using given package manager.

commands object

Commands executed to build and deploy the application.
The following commands are set by default:

  • install
  • synthPipeline
  • deployEnvironment
  • destroyEnvironment

If you override the install command, either install the aws-cdk@2 globally or modify the other 3 commands to use the local cdk binary.
Commands executed on particular builds:

  • main pipeline:

    • preInstall
    • install
    • buildAndTest
    • synthPipeline
  • feature branch environment deployment:

    • preInstall
    • install
    • buildAndTest
    • preDeployEnvironment
    • deployEnvironment
    • postDeployEnvironment
  • feature branch environment destruction:

    • preInstall

    • install

    • preDestroyEnvironment

    • destroyEnvironment

    • postDestroyEnvironment

cdkOutputDirectory string

The location where CDK outputs synthetized files. Corresponds to the CDK Pipelines ShellStepProps#primaryOutputDirectory.

pipeline object[] CodePipeline deployment pipeline for the main repository branch.
Can contain environments to deploy and waves that deploy multiple environments in parallel.
Each environment and wave can have pre and post commands that will be executed before and after the environment or wave deployment.
codeBuild object Override CodeBuild properties, used for the main pipeline as well as feature branch ephemeral environments deploys and destroys.
codePipeline object Override CodePipeline properties.
slackNotifications object Configuration for Slack notifications. Requires configuring AWS Chatbot client manually first.
fixPathsMetadata boolean

Whether to remove the CI resources from the beginning of the aws:cdk:path metadata when deploying from the main pipeline.

Notifications and alarms

Stack creates SNS Topics with notifications for main pipeline failures and feature branch build failures. Their ARNs are saved in SSM Parameters and outputed by the stack:

  • main pipeline failures:

    • SSM: /{projectName}/ci/pipelineFailuresTopicArn
    • Stack exported output: {projectName}-ci-pipelineFailuresTopicArn
  • feature branch build failures:

    • SSM: /{projectName}/ci/featureBranchBuildFailuresTopicArn
    • Stack exported output: {projectName}-ci-featureBranchBuildFailuresTopicArn

If you setup Slack notifications, you can configure those failure notifications to be sent to Slack.

Moreover, if you setup Slack notifications, an additional SNS Topic will be created to which you can send CloudWatch Alarms. It's ARN is provided:

  • SSM: /{projectName}/ci/slackAlarmsTopicArn
  • Stack exported output: {projectName}-ci-slackAlarmsTopicArn

How to

Run unit tests during build

Set commands in the commands.buildAndTest:

{
    commands: {
        buildAndTest: [
            'npm run lint',
            'npm run test',
        ]
    }
}

Enable Docker

Set codeBuild.buildEnvironment.privileged to true:

{
    codeBuild: {
        buildEnvironment: {
            privileged: true
        }
    }
}

Library development

Project uses jsii to generate packages for different languages.

Install dependencies:

npm install

Build:

npm run build

Change example/bin/cdk.ts repository to point to your repository.

Then, install and deploy the CI for the example application:

cd example
pnpm install
pnpm cdk deploy -c ci=true

One-line command to re-deploy after changes (run from the example directory):

(cd .. && npm run build && cd example && cdk deploy -m direct -c ci=true)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

opinionated_ci_pipeline-4.3.0.tar.gz (420.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

opinionated_ci_pipeline-4.3.0-py3-none-any.whl (418.3 kB view details)

Uploaded Python 3

File details

Details for the file opinionated_ci_pipeline-4.3.0.tar.gz.

File metadata

  • Download URL: opinionated_ci_pipeline-4.3.0.tar.gz
  • Upload date:
  • Size: 420.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.10.18

File hashes

Hashes for opinionated_ci_pipeline-4.3.0.tar.gz
Algorithm Hash digest
SHA256 5cb23c84d7e3010df69171e51baad5dab955788f294192649c4f5b61b7885ed4
MD5 339d2e7859852f5507c2fafeb16f8574
BLAKE2b-256 89c98d6cc8e6f361bee7e23331d6b3e31d1aa5b00ddcb583c6a12bfd9ea9fd6e

See more details on using hashes here.

File details

Details for the file opinionated_ci_pipeline-4.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for opinionated_ci_pipeline-4.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e1f0e09e9fb054626b64890239d4302d65905e782ec3380ea0fbb81e6d06bf49
MD5 8a3ee17e789bd061aac018f0805f03c9
BLAKE2b-256 cb6991651488943583c247bd05e149d756e6efd31732b966169b9eaa57cc0bc5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page