Integrating CodeShip With Pulumi

About Pulumi

Pulumi only integrates with CloudBees CodeShip Pro and will not work with CloudBees CodeShip Basic.

If you do not have a familiarity with CloudBees CodeShip Pro, we recommend watching this introductory webinar before proceeding with your Pulumi setup.

Pulumi is a platform for defining cloud applications and infrastructure, making configuration and deployment fast and easy.

Their documentation does a great job of providing more information, in addition to the setup instructions below.

Using Pulumi

We will not cover Pulumi-side setup for your application in this documentation article, but if you are looking for more information on using Pulumi itself you can learn more from their documentation.

Note that this guide has an easy to use sample repo that you can clone and follow along with, with more examples than this documentation covers.

Adding Pulumi Keys

To start, you need to add your PULUMI_ACCESS_TOKEN, AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY to your encrypted environment variables that you encrypt and include in your codeship-services.yml file.

You will add these encrypted environment variables to the service you create below for executing your Pulumi commands.

Defining Your Service

Because all the commands in your pipeline, via your codeship-steps.yml file, are executed inside the service you define and build via your codeship-services.yml file - the first thing you will need to do is define a service that is capable of executing Pulumi commands.

To do this, you can create a Dockerfile that looks similar to the one below:

FROM node:8

# Install Pulumi
RUN curl -sSL | bash -s -- --version 0.14.2

# Add Pulumi to the $PATH
ENV PATH="/root/.pulumi/bin:${PATH}"

# Install docker
RUN apt-get update && \
    apt-get -y install \
     apt-transport-https \
     ca-certificates \
     curl \
     software-properties-common && \
     curl -fsSL | apt-key add - && \
    add-apt-repository \
     "deb [arch=amd64] \
     $(lsb_release -cs) \
     stable" && \
    apt-get update && \
    apt-get install -y docker-ce && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*


# Copy over the package.json and yarn.lock files and then install packages. By copying just these two files first
# we get better docker caching behavior (as these layers only change when you add or remove dependencies, not when)
# you do normal application development.
COPY package.json yarn.lock ./
RUN yarn install

COPY . .

Once you have an image capable of executing Pulumi Compose commands, you will want to build that image via your codeship-services.yml file:

    dockerfile: Dockerfile
    - env.encrypted
  add_docker: true

Note that the service that will execute our Pulumi commands is using the encrypted environment variables created earlier in this documentation for our secrets.

Deploying With Pulumi

After creating your keys and defining a service to execute your Pulumi commands, you will now want to add those commands to your pipeline via your codeship-steps.yml file:

- service: app
  command: /app/ update

Note that in this example, we’re calling a script named with the update argument. Inside this script, we will see something similar to:

set -eou pipefail

pulumi ${1:-preview} --stack pulumi/codeship-example-${CI_BRANCH} --non-interactive "${@:2}"

With this script, you will be able to pass any specific Pulumi command that you need to run. The important thing is that the service directive is pointing to the service defined via your codeship-services.yml file with the necessary tooling installed.

For more examples, check out the Pulumi sample repo.