This article is about Codeship Pro.

Services and Databases

You will need roughly 3 minutes to read this article.

Through Docker we support many different databases and services you can use for your build. By adding them to your codeship-services.yml file you have a lot of control on how to set up your build environment.

Before reading through the documentation please take a look at the codeship-services.yml file and codeship-steps.yml file documentation page so you have a good understanding how services and steps on Codeship work. At first we want to show you how to customize a service or database container so it has the exact configuration you need for your build.

Customizing a service container

The following example will start a Ruby and Elasticsearch container and make Elasticsearch available to the Ruby container. The Elasticsearch container will get a customized configuration file that is added by building it with a Dockerfile.elasticsearch Dockerfile.

At first the configuration file we want to use in our Elasticsearch container. It makes sure that the Elasticsearch container does not build a cluster with other containers. Store this in for example config/elasticsearch.yml in your repository.

node:
  local: true
  name: ci

Now we create a Dockerfile that starts from an Elasticsearch base container and adds our configuration file.

FROM healthcheck/elasticsearch:alpine

ADD config/elasticsearch.yml /usr/share/elasticsearch/config/elasticsearch.yml
RUN chown elasticsearch:elasticsearch /usr/share/elasticsearch/config/elasticsearch.yml

Note that in this example we are using the healthcheck version of the Elasticsearch image to avoid startup timing issues.

The following codeship-services.yml uses the Dockerfile.elasticsearch we just created to build our container. Using depends_on, we can make it clear that the Elasticsearch container is a dependency of the Ruby container.

ruby:
  image: ruby:2.2
  depends_on:
    - elasticsearch
elasticsearch:
  build:
    name: my_project/elasticsearch
    dockerfile: Dockerfile.elasticsearch

Now we have a fully customized instance of Elasticsearch running. This same process applies to any other service or database you might be using. To see how to customize them take a look at the specific Dockerfiles that are used to create the service you want to use.

Waiting for a service to start

When starting your tests you want to make sure that your service is up and running.

HEALTHCHECK

The most common and most supported way to make sure that a service is available is to use the HEALTHCHECK directive inside your Dockerfile, or to use the healthcheck version of a base image from Docker Hub or another source. Learn more about using health checks in your codeship-services.yml file.

Service Poll

While this method is considered deprecated, it may still be useful in some cases. The following script will check for Postgres and Redis to be ready and accept connections. You can use this script to add any further checks for other services. You can connect checks with &&. The list of supported containers below has tools that help you to test your service for availability. Make sure to set all necessary environment variables used in the commands.

#!/usr/bin/env bash

function test_postgresql {
  pg_isready -h "${POSTGRESQL_HOST}" -U "${POSTGRESQL_USER}"
}

function test_redis {
  redis-cli -h "${REDIS_HOST}" PING
}

count=0
# Chain tests together by using &&
until ( test_postgresql && test_redis )
do
  ((count++))
  if [ ${count} -gt 50 ]
  then
    echo "Services didn't become ready in time"
    exit 1
  fi
  sleep 0.1
done

Need more help?

Contact our support team or post on Stack Overflow using the tag #codeship. Did you check the status page and changelog?

There are also several code examples and sample projects available for you to get started with.

Article not helpful?

Does this article need improvement? If so, please send feedback or submit a pull request!